实例化String对象
方法一:直接赋值 String name1 = "zhangsan"; //直接赋值
创建的对象在字符串池中,如果存在就不再创建,不在的话也不创建
方法二: new 一下 String name2 = new String("zhangsan"); //new的方式
可以看到直接赋值方式 name1==name4
new方式 name2 != name3 说明new的方式不是创建同一区域
==和equals比较内容不一样
==比较的是引用
equals比较的是内容
如果String指向的是一个字符串常量,那么会先在字符串常量池(栈)中查找,如果有就直接指向它;没有则在字符串常量池中创建该常量,然后String指向该常量。
如果String使用关键字new初始化,则会在堆中开辟固定的空间存放该字符串的值,然后String指向该常量。
使用字符串常量拼接,由于表达式先计算右值,因此相当于将String指向一个新拼接好的字符串常量。同样会在字符串常量池中查找,如果有就直接指向它;没有则在字符串常量池中创建该常量,然后String指向该常量。但是如果拼接中存在使用new生成的字符串,则新的字符串就等价于使用new在堆中创建的一样。
修改String的值,只能改变String的指向,不会改变String指向的对象本身。如果非要改变指向的对象本身,可以使用反射。
如果是数组,由于它是对象,那么equals只比较其数组指针地址,并不会去比较其中的元素是否相等。
字符串内容不可变,改变后地址改变,不再是同一个
网友评论