5.Java String类

202 阅读2分钟

上周面试被问了String为什么被设计成不可变类,还有一些常用的String方法借此机会总结一下

String介绍

关于String的常用方法可以参考

String常用方法介绍

字符窜常量池

  • JDK 1.6字符窜常量池在方法区
  • JDK 1.7字符窜常量池在堆
  • JDK 1.8字符窜常量池在元数据区

创建字符窜的两种方式

  • String str1 = new String("aaa");
  • String str2 = "aaa";

这两种方式的区别 ?

  • JDK都是在1.7+
  • 使用String str2 = "aaa";创建先会在字符窜常量池中寻找是否存在,如果不存在则在字符窜常量池中创建一个引用,并在堆中创建一个对象"aaa"对象,常量池引用指向该对象。(先走常量池,有则返回该引用无则在堆中创建一个对象,返回的是在常量池的引用)
  • 而使用String str1 = new String("aaa");会创建两个对象,一个在堆中的StringObject另外一个是在常量池中创建一个引用指向一个堆中的字面量。

  • 说明1

  • String str3 = new String("a") + new String("a")+new String("a") ;

  • String str2 = "aaa";

  • System.out.println(str2 == str3);//false图上所知比较的是不同对象。

  • 说明2

  • String str3 = new String("a") + new String("a")+new String("a") ;

  • String intern = str3.intern();

  • String str2 = "aaa";

  • System.out.println(str2 == str3);//true图中蓝色线易用会指向黄色StringObject

  • 说明3 因为字面两aaa 已经存在所以不会把常量池中"aaa"引用指向StringObject
  • String str2 = "aaa";
  • String str3 = new String("a") + new String("a")+new String("a") ;
  • String intern = str3.intern();
  • System.out.println(str2 == str3);//false
  • System.out.println(str2 == intern);//true

String为什么被设计成不可变类

####组成

  • 1、被final修饰的类不可以被继承 final Class

  • 2、被final修饰的方法不可以被重写

  • 3、被final修饰的变量不可以被改变 final char[] value 字符数组不可变 基本类型数据不能被修改,引用数据类型 引用地址不能被修改,引用内容可以修改。

  • hashcode使用的是String类本身的缓存的private hashcode 不会被修改。

安全性

  • 安全性的考虑:不可变类在多线程的时候不会有并发的问题