回顾String类 , 温故而知新
String类
- String是一个final类 ,代表不可变性 , 不可以被继承
- 字符串是常量, 用双引号引起表示,值被创建之后是不能更改的
- String 的底层是一个字符数组value[]
- 实现了Serializable(支持字符串序列化), Comparable(支持字符串比较) , CharSequence(代表是一个字符串)接口
1 | //String的底层 |
1 代码验证
1 | String a = "xiaoliu";//字面量 , 存于常量池中 |
2 String的创建
三种创建String对象方式 :
- “”字面量赋值
- new String() 构造方法赋值
- set方法赋值
1 | String S1 = new String();//本质this.value = new char[0] |
注意 : new String(“xiaoliu”)这个过程中创建了两个对象 :
1)new结构 ;
2) 底层chart[] ,字符串常量池
1 | String a1 = "xiaoliu";//字面量 , 存于方法区的常量池空间 |
3 String的常见用法
1 | int leng() : 返回字符串的长度:return value.length |
4 String与基本数据类型的转化
- 字符串 - > 基本数据类型 包装类
parseInt(String s):将数字字符串转化为整型 ,Byte ,Short,Long,Float,Double 都可以装化为基本相应的基本数据类型
- 基本数据类型 , 包装类 - > 字符串
String.ValueOf() 可将()里面的东西转化为字符串
5 String与字符数组的转化
String –> chart[] , 调用toChartArray()方法
chart[] –> String , 调用String的构造 , new String(chart[ ])
6 String与字节数组的转化
String –> byte[] , 调用getBytes()方法 , 里面可以指定编码
byte[] –> String , 调用String的构造 , new String( byte[ ]) , 可以指定编码
7 String - StringBuffer - StringBuider
String : 不可变字符串序列 ,底层是chart[]存储
StringBuffer : 可变字符串序列, 线程安全 ,方法都加了 synchronized方法 ,效率低下 ,底层是chart[]存储
StringBuider : 可变字符串序列 , 线程不安全 , 效率高 ,底层是chart[]存储
(1) 源码分析
1 | //String |
问题 :当可字符串序列的底层数组不够时 , 底层会判断(当前长度+新增长度)=max的和是否大于16 , 如果大于 ,就新建数据 ,然后将值copy过来 , 见下面源码分析;
1 | private void ensureCapacityInternal(int minimumCapacity) { |
(2) StringBuffer常用方法
(3) 三者效率的比较
StringBuilder > StringBuffer > String