字符串相关的类基本上在java.lang包
String 非常特殊的类 可以像常量一样创建对象
String str = "abc"; //str是个对象 存储的是char[] value 数组的值是"abc"
String的不可变特性 因为 private final char[] value
所以频繁修改其内容的时候 性能不好
1.所属的包 java.lang包
2.默认继承Object类
实现接口Serializable CharSequence Comparable
3.对象的构建
常量的声明方式
无参数构造方法
有参数构造方法byte[] char[]
StringBuffer/StringBuilder
1.所属的包 java.lang包
2.默认继承Object类 实现接口Serializable Appendable CharSequence
没有CompareTo()方法
含有一个String没有的方法 append(); //拼接
3.特性 ---> 表现为可变字符串 --->表现在长度和内容 ---> char[] value;---> 可以动态扩容
4.对象的构建
无参数构造方法
构建一个默认长度为16个空间的对象 char[]
StringBuilder builder = new StringBuilder();
有参数构造方法
利用给定的参数 构建一个自定义长度空间的对象 char[]
StringBuilder builder = new StringBuilder(20);
利用带String参数的构造方法 默认数组长度字符串再加上16个
StringBuilder builder = new StringBuilder("abc"); //3+16=19
5.StringBuilder中的常用方法
append(); //最主要的方法 频繁的拼接字符串的时候使用此方法 以提高性能
++++++++++++++++++++++++++++++++++++++++++++++++++++++
String str1 = "a";
long time11 = System.currentTimeMillis();
for(int i = 1;i<200000;i++){
str1+="a";
}
long time12 = System.currentTimeMillis();
System.out.println(time12-time11); //2162
String str2 = "a";
long time21 = System.currentTimeMillis();
for(int i = 1;i<200000;i++){
str2+="a";
}
long time22 = System.currentTimeMillis();
System.out.println(time22-time21); //1746
StringBuilder str3 = new StringBuilder("a");
long time31 = System.currentTimeMillis();
for(int i = 1;i<200000;i++){
str3.append("a");
}
long time32 = System.currentTimeMillis();
System.out.println(time32-time31); //6
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++
ensureCapacity(int minimumCapacity); //确保底层数组容量够用
capacity(); //返回底层那个数组的容量
length(); //长度 返回有效元素的个数
++++++++++++++++++++++++++++++++++++++++++++++++++++++
StringBuilder builder = new StringBuilder("abcdefg"); // capacity 7+16
System.out.println(builder.capacity()); //底层的数组的容量 23
System.out.println(builder.length()); //长度 有效元素的个数 7
++++++++++++++++++++++++++++++++++++++++++++++++++++++
setLength(int newLength) //设置字符串有效元素的个数(不安全)
char = charAt(int index);
setCharAt(int index,char value) //将index位置的字符改为给定的value
int = codePointAt(int index);
String = substring(int startIndex); //截取index [startIndex,this.length)
String = substring(int startIndex,int endIndex); //截取index [startIndex,endIndex)
(StringBuilder = )delete(int startIndex,int endIndex); //无返回值 将对象的 index [startIndex,endIndex) 删除
//StringBuilder类中的独有方法
(StringBuilder = )deleteCharAt(int index); //删除给定index上的字符
int = indexOf(String str)
int = indexOf(String str,int fromIndex)
int = lastIndexOf(String str) //从后往前找
int = lastIndex(String str,int fromIndex)
(StringBuilder = )insert(int index,E e) //很多很多重载 将参数e作为String插入index位置
(StringBuilder = )replace(int start,int end,String str) //将index [start,end) 上的字符串替换为str
(StringBuilder = )reverse() //倒叙
String = toString() //将对应Stringbuilder对象构建为String返回
trimToSize() //去掉容量当中不用的容量去掉 变成length长度的数组 ---> capacity = length
===============================================================
总结
1.不一定需要StringBuilder类 当需要String频繁拼接修改字符串信息的时候才用的
因为StringBuilder底层数组是可变的 提高了性能
2.常用方法
与String类不同的都有方法
3.笔试中经常考察的知识点
1.String所属的包 继承关系 实现接口
java.lang包 继承Object类 实现Serializable CharSequence Comparable
2.String构建方法
常量声明法 构造方法
3.String对象内存结构
4.String的不可变特性
长度 内容
5.String的常用方法 --- 与StringBuilder的区别
concat()
toUpperCase()
6.String和StringBuilder的区别 | String和StringBuffer的区别
String是不可变字符串
有一个Comparable接口
不可变体现在长度和内容
有StringBuilder没有的方法 concat() compareTo() toUpperCase()
StringBuilder是可变字符串
有一个Appendable接口
没有final修饰 是可变字符串 在底层可以进行数组扩容
有String没有的方法 append() insert() delete() reverse()
7.StringBuffer和StringBuilder的不同
两个类的方法使用几乎一致
StringBuffer是早期版本 1.0
StringBuilder是后来的版本 1.5
早期版本 线程同步 安全性较高 执行效率相对较低
后期版本 线程非同步 安全性较低 执行效率相对较高