Error al comparar 2 variable de tipo string

String clave="pep0001";

String c1= getJTextPasswodr().getText().toString();

if(c1==clave){
System.out.println("Acceso correcto");
}else{
System.out.println("Acceso denegado");
}

//al meter la contraseña la condición no me esta funcionando, yo meto como password pep001

Se aceptan mil sugerencias de cual es mi error

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

equals

Esto es de lo más básico de Java. El operador == compara referencias, es decir solamente da true si ambas variables apuntan al mismo objeto. Si quieres comparar dos objetos distintos para ver si son iguales, necesitas usar el método equals en alguno de los dos. En el caso de las cadenas, invocas equals con cualquiera de las dos y le pasas la otra como parámetro (y checas que no sea null).

if ((c1 == null && clave == null) || c1.equals(clave)) {
  //acceso ok
} else {
  //denegado
}

Cuando tienes una cadena constante contra la que quieres comparar una variable tipo String, lo recomendable es hacer esto:

if ("Juan".equals(nombre)) {
  //La cadena constante nunca va a ser null, pero nombre podría ser null
}

Si vienes de .NET, lo que pasa es que en C# hay sobrecarga de operadores. La clase System.String redefine el operador == para que invoque el método Equals. En Java no hay sobrecarga de operadores, por lo que el == SIEMPRE es para comparación de referencias. En el caso de cadenas, solamente esto funciona con ==:

String a = "algo";
String b = a;
String c = "algo"; //el compilador optimiza y hace que c apunte a la misma cadena que a
String d = new String("algo"); //aquí se crea OTRA cadena que aunque contenga lo mismo, no es la misma instancia
if (a == b && a == c) {
  //esto sí se cumple
}
if (a == d) {
  //esto no se cumple
}
Imagen de charlymex

usa el metodo Equals

No compares dos Strings con == ya que NO son el mismo objeto, tienen el mismo valor, pero son objetos diferentes...

Imagen de charlymex

En C# tambien es recomendable usar Equals

por la misma razón, la verdad es que nunca he hecho la prueba sobre la sobrecarga del == pero efectivemente hay veces que me gustaría que Java pudiera sobrecargar operadores, en especial el + y el -... me gusta mucho el estilo de C++...

Pregunta solucionada

Disculpa es que vengo de lenguajes php y python donde estaba acostumbrado a usar el ==
Tienen razón es básico lo del equals, solo que la costumbre me cerro las ideas.
Gracias por su porte

Imagen de luxspes

En C# == y Equals no son lo mismo que en Java

En C# tambien es recomendable usar Equals

Depende, y definitivamente no por la misma razon, en C#, para String el operador == compara por valor, y el Equals por referencia (el caso contrario de Java), error de mi parte, en C#, ambos comparan por valor.

Si quieres comparar por referencia en C#, hay que usar ReferenceEquals