1、String 对象用于保存字符串,也就是一组字符序列。
2、字符串的字符使用Unicode编码,一个字符占两个字节。
3、String有很多构造器,构造器重载。
4、String类实现了Serializable接口【可以串行化:可以在网络传输】。
Comparable接口【可以比较大小】
5、String是finall类,不可被继承。
6、String有属性 private final char value[]; 用于存放字符串内容。
7、value是一个final类型,表示不可以修改【即value不能指向新的地址,但是字符内容可变】
方法一:
String s = "hsf";
方法二:
String s2 = new String("hsf");
区别:
方法一:先从常量池看是否有有"hsf"数据,如果有直接指向,没有则重新创建,然后指向。s最终返回的是常量池的地址空间。
方法二:先在堆中创建空间,里面有value属性,指向常量池;如果常量池有"hsf",直接指向,没有则创建,最终返回的是堆中的地址空间。
测试题1:
public class Test1 { public static void main(String[] args) { String a = "hsf"; String b = new String("hsf"); System.out.println(a.equals(b)); // t 比较内容是否相等 System.out.println(a == b); // f 比较地址值是否相等 System.out.println(a == b.intern()); // t System.out.println(b == b.intern()); // f } }
1、intern();方法:如果常量池中已经有一个等于String对象的字符串,则直接返回池中字符串地址;如果池中没有,则创建并返回此String对象引用。
2、intern():直接从池中返回地址。
测试题2:
public class Test1 { public static void main(String[] args) { Person p1 = new Person(); p1.name = "hsf"; Person p2 = new Person(); p2.name = "hsf"; System.out.println(p1.name.equals(p2.name)); // t System.out.println(p1.name == p2.name); // t:比较值 System.out.println(p1.name == "hsf"); // t } }
测试题三: