Bota5ky

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 在常量池中已经存在的话,那么就会创建⼀个对象。

posted @ 2023-03-18 21:38  Bota5ky  阅读(11)  评论(0编辑  收藏  举报