String 代表字符串 都是用一对双引号包裹 不是基本数据类型 是引用数据类型
创建的方式有两种
第一种 创建对象的形式 String string =new String(“111”);
第二种 使用字面量的方式 String string = “abc”;
String 的存储位置在哪里???
如果使用字面量的形式创建 字符串 直接存放在字符串池中
如果使用new的形式创建 会在堆中开辟一个空间指向字符串常量池
字符串常量池 我们使用的字符串都是存储在字符串常量池的
补充
常量池就是一个数据结构,可以想象数组,数组就是一种数据结构,拿来存数据的,常量池也在堆中,常量池里面存string对象地址,就是说不管双引号的string对象,还是new的,都是堆里面创建,且都有va
String的源码
通过观察String的源码 发现String是一个final 类 所以他不能被继承 不能被重写
实现了Serializable 声明他可以被序列号化(需要了解点击链接),序列号化可用于网络传输
实现了 Comparable 说明String 可以对比大小 compareTo()
String是一个不可变的
Jdk7底层是以 final char[] 数组存储的
Jdk8底层是以 final byte[] 数组存储的
通过上面两点 我们得出结论 String是一个不可变的 拥有不可变性
因为String的不可变 导致可能出现系统资源浪费
面试题
String string = new String(“abc”) 创建了几个对象
一个或者两个(StringBuffer,StringBuilder)
答:如果创建过相同的字符串,只需要在堆中创建对象。
如果没有就需要在字符常量池创建相应的对象