java吧 关注:1,260,826贴子:12,759,535
  • 5回复贴,共1

各位同志们,我今天遇到个问题,我感到很奇怪

只看楼主收藏回复

使用不注释的代码可以执行,但是换成注释的代码就没有结果显示出来了
final private String user = "1";
final private String password = "2";
public void actionPerformed(ActionEvent e){
if (e.getSource()==loginJB){
if(userJTF.getText().equals(user) && new String( passwordJPF.getPassword()).equals(password))
studentLogin();
else{
System.out.printf("user/password is wrong or does't exist");
}
}
if (e.getSource()==clearJB){
userJTF.setText("");
passwordJPF.setText("");
}
}
/*public void actionPerformed(ActionEvent e){
if (e.getSource()==loginJB){
if(userJTF.getText()==user && new String( passwordJPF.getPassword())==password)
studentLogin();
else{
System.out.printf("user/password is wrong or does't exist\n");
}
}
if (e.getSource()==clearJB){
userJTF.setText("");
passwordJPF.setText("");
}
}
*/


IP属地:江苏1楼2017-02-14 12:13回复
    ==比较的是内存中的地址值
    equals是比较的值


    3楼2017-02-14 13:26
    收起回复
      2025-05-23 04:27:10
      广告
      Java当中的数据类型和"=="的含义
      基本数据类型(原始数据类型):byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
      复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
      注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
      equals()方法介绍:
      JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。
      但在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
      所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同。
      如果被复写,按照复写的要求来。
      String类的equals()方法:
      public boolean equals(Object anObject) {
      if (this == anObject) { //比较对象的内存地址是否相同
      return true;
      }
      if (anObject instanceof String) { //比较它们的字符串是否相同
      String anotherString = (String)anObject;
      int n = count;
      if (n == anotherString.count) {
      char v1[] = value;
      char v2[] = anotherString.value;
      int i = offset;
      int j = anotherString.offset;
      while (n-- != 0) {
      if (v1[i++] != v2[j++])
      return false;
      }
      return true;
      }
      }
      return false;
      }
      举例
      example1:
      public class StringDemo {
      public static void main(String[] args) {
      String s1 = "Hello";
      String s2 = "Hello";
      System.out.println(s1 == s2); // true
      }
      }
      example2:
      public class StringDemo {
      public static void main(String args[]) {
      String str1 = "Hello";
      String str2 = new String("Hello");
      String str3 = str2; // 引用传递
      System.out.println(str1 == str2); // false
      System.out.println(str1 == str3); // false
      System.out.println(str2 == str3); // true
      System.out.println(str1.equals(str2)); // true
      System.out.println(str1.equals(str3)); // true
      System.out.println(str2.equals(str3)); // true
      }
      }
      解释字符串比较之中“==”和equals()的区别?
      ==:比较的是两个字符串内存地址的数值是否相等,属于数值比较;
      equals():比较的是两个字符串的内容,属于内容比较。
      以后进行字符串相等判断的时候都使用equals()。
      更改程序后:
      public class ObjectDemo{
      public static void main(String[] args) {
      String s1 = "Hello";
      String s2 = new String("Hello");
      s2 = s2.intern();
      System.out.println(s1 == s2); // true
      System.out.println(s1.equals(s2)); // true
      }
      }
      ava.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。
      但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,
      如果存在,就返回池里的字符串;
      如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。
      比较两个对象的值:(参考String类)
      public class ObjectDemo {
      public static void main(String args[]){
      Student student1 = new Student("生命壹号",22,"成都");
      Student student2 = new Student("生命壹号",22,"成都");
      System.out.println(student1==student2);
      System.out.println(student1.equals(student2));
      }
      }
      class Student {
      private String name;
      private int age;
      private String address;
      public Student(String name,int age,String address){
      this.name = name;
      this.age = age;
      this.address = address;
      }
      //重写Object类中的equals方法(比较两个对象的值是否相等)
      public boolean equals(Object obj){
      //如果内存地址相等,那么一定是同一个对象,就无需比较两个对象的属性值
      if(this==obj){
      return true;
      }
      //判断obj是否为Baboon类型的实例
      if(obj instanceof Student){
      Student b = (Student)obj;//强制转换
      //判断两个对象的属性值是否相等
      if(!this.name.equals(b.name)){
      return false;
      }
      else if(this.age!=b.age){
      return false;
      }
      else if(this.address!=b.address){
      return false;
      }
      return true;
      }
      return false;
      }
      }


      IP属地:江苏5楼2017-02-14 16:51
      回复
        以上摘自某博客


        IP属地:江苏6楼2017-02-14 16:52
        回复
          对于引用数据类型而言,我们用的equal()一般都是被覆盖的方法,只比较我们关心的数据内容而不比较内存地址,而==比较的是地址


          8楼2017-02-14 16:54
          回复