String类
- String是用于保存字符串的(字符序列)
- 字符串是用双引号包裹的字符序列
- 字符串使用Unicode字符编码,一个字符占俩字节,一字节八位
- String是final类不可继承
Serializable保证串行化
Comparable保证可以比较
1.创建方式
基本创建有两种类型
- String s = “a”;
- 从常量池中寻找字符串"a",如果有直接指向,如果没有则在常量池创建"a",然后直接指向新出创建的"a"
- 直接指向常量池
- String s = new String(“a”);
- 先在堆中创建空间,如果常量池中有"a",则堆空间中的value属性指向常量池中的"a",如果没有"a",则在常量池创建"a",然后value属性指向新出创建的"a"
- 先指向堆空间,堆空间value属性指向常量池
String s = "ab";
String s1 = new String("ab");
System.out.println(s);//ab
System.out.println(s1);//ab
System.out.println(s == s1);//false
System.out.println(s.equals(s1));//true
System.out.println(s == s1.intern());//true
equals()方法——判断值
public boolean equals(Object anObject)将此字符串与指定对象进行比较。 其结果是true当且仅当该参数不是null并且是String对象,表示相同的字符序列作为该对象。
重写:
equals在 Object
参数
anObject - 对比这个 String的对象
结果
true如果给定的对象代表一个 String等效于这个字符串, false否则
另请参见:
compareTo(String) , equalsIgnoreCase(String)
intern()方法——返回常量池地址
public String intern()返回字符串对象的规范表示。
最初为空的字符串池由String类String 。当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自池的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用。
由此可见,对于任何两个字符串s和t , s.intern() == t.intern()是true当且仅当s.equals(t)是true 。
所有文字字符串和字符串值常量表达式都被实体化。 字符串文字在The Java™ Language Specification的 3.10.5节中定义。
结果
一个字符串与该字符串具有相同的内容,但保证来自一个唯一的字符串池。
2.字符串特性
- String是一个final类,代表不可变字符序列
- 字符串不可变,对象一旦分配,内容不可变,改变的是指向地址
3.注意事项
String a = “he”+“llo”;创建了一个对象,等价于String a = “hello”;
String a = “he”;
String a1 = “llo”;
String a2 = a + a1;
并不是二者相加直接放入常量池,而是创建StringBuilder对象
子类无参调用父类有参构造,默认长度16
![]()
![]()
创建之后将a,a1分别调用append方法,再在父类中拼串返回
![]()
![]()
![]()
![]()
最后StringBuilder转换String
![]()
并不是两个字符串的常量池直接拼接,而是创建StringBuilder对象,字符串拼接后,再转为String对象。
最后是a2指向堆,value属性指向常量池
String a = "he"; String a1 = "llo"; String a2 = "hello"; String a3 = a+a1; System.out.println(a3);//hello System.out.println(a2 == a3);//false System.out.println(a2 == a3.intern());//true
4.结尾
求点赞 求评论 求收藏 求分享 求关注