Java笔记(二):String类
String 代表的是 Java 中的字符串 , String 类比较特殊,它整个类都是被 final 修饰的,也就是说,String 不能被任何类继承,任何 修改 String 字符串的⽅法都是创建了⼀个新的字符串(保证了线程安全性)。
不可变对象不是真的不可变,可以通过 反射 来对其内部的属性和值进⾏修改,不过⼀般我们不这样做。
方法 String.intern()
:在 JDK1.7 及以后调⽤ intern ⽅法是判断运⾏时常量池中是否有指定的字符串,如果没有的话,就把字符串添加到常量池(JDK8之后,字符串常量池在堆中)中,并返回常量池中的对象。
String a = new String("ab");
String b = new String("ab");
String c = "ab";
String d = "a";
String e = new String("b");
String f = d + e; // + 号相当于是执行 new StringBuilder.append(), 但每次都会new StringBuilder(),所以多次拼接建议自建 StringBuilder
String g = "a" + "b"; // 编译器会优化,会直接被优化为bbbccc,也就是直接创建了一个 bbbccc 对象
System.out.println(a.intern() == b); //false
System.out.println(a.intern() == b.intern()); //true
System.out.println(a.intern() == c); //true
System.out.println(a.intern() == f); //false
//equals()方法作对比都是true
具体分析:一篇与众不同的 String、StringBuilder 和 StringBuffer 详解
- StringBuilder 不加锁
- StringBuffer 线程安全
为什么重写 equals 方法必须重写 hashcode 方法
- 如果在 Java 运⾏期间对同⼀个对象调用 hashCode 方法后,无论调用多少次,都应该返回相同的 hashCode,但是在不同的 Java 程序中,执行 hashCode 方法返回的值可能不⼀致;
- 如果两个对象的 equals 相等,那么 hashCode 必须相同;
- 如果两个对象 equals 不相等,那么 hashCode 也有可能相同,所以需要重写 hashCode 方法,这样也能够提高不同对象的访问速度;
- hashCode 通常是将地址转换为整数来实现的。
String s1 = new String("abc") 在内存中创建了几个对象
⼀个或者两个,String s1 是声明了⼀个 String 类型的 s1 变量,它不是对象。使⽤ new 关键字会在堆中创建⼀个对象,另外⼀个对象是 abc ,它会在常量池中创建,所以⼀共创建了两个对象;如果 abc 在常量池中已经存在的话,那么就会创建⼀个对象。