首页 > 编程 > Java > 正文

16th_JavaSE笔记_String类——字符串的比较equals()

2019-11-10 23:56:24
字体:
来源:转载
供稿:网友
一、字符串的比较首先说一下变量数据存储过程

    代码区(codesegment):程序开始执行时把代码加载到codesegment区,找到main方法执行。

    栈(stacksegment):1、存放基本数据类型变量和数据;int i = 1;2、对象的引用,但对象的引用不存在栈中,而是存放在堆(new出来的对象)或常量池(字符串常量对象)中。    堆(heapsegment):存放所有new出来的对象。例如:String str = new String("张三");    静态区(datasegment)常量池:基本数据类型常量、字符串常量。Stringbuffer栈和堆的垃圾回收机制:栈:当在一段代码块中定义一个变量时,java在栈中为这个变量分配内存空间,当块作用域执行完成之后,java就会   自动释放为改变量所分配的空间。堆:当堆里面对象失去引用时,jvm的垃圾回收器,会自动来处理。数据共享:栈和常量池中的数据共享、堆的数据不共享。equals 比对字符串本身,==     比对地址是否相等。图String str = "zhangsan";int i = 0;int[] j = new int[5];案例一:String str1 = "abc";String str2 = new String("abc");System.out.PRintln(str1 == str2);打印:false案例二:String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);打印:true下面是一个综合的例子:
public class Sample_StringEquals {      public static void main(String[] args) {          String a = "test";          String b = "test";          String c = new String("test");          String d = new String("test");          String e = a;          String f = new String(a);          String g = a + "";          System.out.println(a == b ? "expression /"a==b/" is true"                  : "expression /"a==b/" is false");  //true        System.out.println(a == c ? "expression /"a==c/" is true"                  : "expression /"a==c/" is false");  //false        System.out.println(c == d ? "expression /"c==d/" is true"                  : "expression /"c==d/" is false");  //false        System.out.println(a == e ? "expression /"a==e/" is true"                  : "expression /"a==e/" is false");  //true        System.out.println(a == f ? "expression /"a==f/" is true"                  : "expression /"a==f/" is false");  //false        System.out.println(a == g ? "expression /"a==g/" is true"                  : "expression /"a==g/" is false");  //false        if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)                  && e.equals(f) && f.equals(g)) {              System.out.println("a equals b equals c equals d equals e equals f equals g");          }      }  }运行结果已写在打印语句之后。对于引用数据类型来说,"=="永远是在比较等号两边的对象的内存地址,只有当两个引用指向相同的内存地址时,结果为true。值得一提的是:1)对于String a = "test";  以及String b = "test"; 并没有new出对象,而是先在数据段(datasegment)中找有没有"test"字段,没有找到,就开辟一块空间用于存放"test",并且让a指向这个地址,在定义b的时候,先检查数据段(datasegment)中有没有"test",结果找到了,就同样让b也指向这个地址。因此a==b的结果是true。2)new出来的对象永远都是放在堆中,new出的对象的地址不可能相同,所以比较两个先后new出来的String类型变量,结果都是false。3)

String类重写了equals方法,只要两个变量的字符序列一致就返回true,而不进行地址的判断。

 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表