Java中String类详细解析
1.相等性的比较(==)
(1)对于原生数据类型来说,比较的是左右两边的值是否相等
(2)对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。
2.Object 类的tostring方法返回的是一个哈希code值,而string类重写了tostring方法,默认调用tostring方法。
API (Application Programming Interface),应用编程接口。
当打印引用时,实际上会打印出引用所指对象的toString()方法的返回值,因为每个类都直接或间接地继承自Object,而Object类中定义了toString(),因此每个类都有toString()这个方法。
3.equals方法
对于object类的equals方法来说,是用来判断两个对象是不是同一个对象。
对于继承了object类的其他类来说,如果重写了equals方法,才是判断内容是否一致,,如果没有重写equals方法,是判断地址是否一致。
对于String类的equals()方法来说,它是判断当前字符串与传进来的字符串的内容是否一致。
4.字符串是一个常量,创建之后值是不能被改变的。
5.String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
6、 String Pool(字符串池)
7、 String s = “aaa”;(采用字面值方式赋值)
1) 查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。
8、 String s = new String(“aaa”);
1) 首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2) 如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个”aaa“对象。
9.new出来的对象都是在堆里面
10.intern()方法
1 | public class Test |
1 | package testPackage; |
and the compilation unit:
1 | package other; |
produces the output:
true true true true false true
This example illustrates six points:
1.Literal strings within the same class (§8) in the same package (§7) represent references to the same String object (§4.3.1).
2.Literal strings within different classes in the same package represent references to the same String object.
3.Literal strings within different classes in different packages likewise represent references to the same String object.
4.Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
5.Strings computed by concatenation at run time are newly created and therefore distinct.