String类及其相关类的详细概述
String类及其相关类的详细概述(结尾有彩蛋!)
最近学完了String类及其相关类StringBuffer和StringBuilder,本来Java就是面向对象的编程语言,所以学习的时候就得学习它写好的类及其方法供我们使用,废话不多说,直接上干货。
String类概述
String类代表的是字符串,属于引用数据类型,看它的源码会发现它是一个final类,不可以被继承,同时底层用了char数组,最后返回一个字符串,String类是不可变的字符序列,用字面量创建变量所存放的数据在方法区当中的字符串常量池当中,若要修改已声明变量的数据,则会在常量池当中重新声明一个地址,原来的数据则会被回收,所以是不可变序列,而且与变量不同的是,由于更改数据会使常量池当中不停的创建与回收数据,效率较低。
举个栗子:
String s1="javaEE";//声明在字符串常量池当中
String s2="hadoop";//声明在字符串常量池当中
String s3="javaEEhadoop";//声明在字符串常量池当中
String s4="javaEE"+"hadoop";//声明在字符串常量池当中
String s5=s1+"hadoop";//有变量s1的参与,声明在堆空间当中
String s6="javaEE"+s2;//有变量s2的参与,声明在堆空间当中
String s7=s1+s2;//有变量s1和s2的参与,声明在堆空间当中
System.out.println(s3 == s4);//true 常量池存放的数据相同,指向同一个地址
System.out.println(s3 == s5);//false 堆空间与方法区字符串常量池相比较,地址不同
String s8=s5.intern();//返回值得到的s8使用的常量值中已经存在"javaEEhadoop"
System.out.println(s8 == s3);//true
结论:
1,常量(字面量的方式定义)与常量的拼接结果在常量池,且常量池中不会存在相同结果的常量。
2,只要其中有一个是变量,结果就在堆中
3,如果拼接的结果调用intern()方法,返回值就在常量池中
String类常用方法:
int length();返回字符串的长度(底层数组的长度)
char charAt(int index):返回指定索引位置的字符
boolean isEmpty()判断是否是空字符串
String toLowerCase():将所有字符转换为小写
String toUpperCase():将所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白(可用于检索用户名)
boolean equals():比较字符串的内容是否相同
boolean equalsIgnoreCase():比较字符串的内容是否相同,忽略大小写
String concat():将指定的字符串连接到此字符串的末尾。等价于“+”
int compareTo():比较两个字符串的大小。若是负数则是当前对象小,零则相等,反之
String substring(int beginIndex):返回一个新字符串,位置从开始索引开始截取
String substring(int beginIndex,int endIndex):返回一个新字符串,位置从开始索引开始截取,到结束索引结束截取,包含前面参数,不包含后面参数
boolean endsWith(String s):测试字符串是否以指定的后缀结束
boolean startsWith(String s):测试字符串是否以指定的前缀开始
boolean startsWith(String s,int i):测试此字符串从指定索引开始是否以指定的前缀开始
boolean contains():当且仅当此字符串包含指定的char值序列时,返回true
int indexOf(String str):返回指定字符的索引位置 如果没找到则返回-1
int indexOf(String str,int fromIndex):返回指定索引位置开始查找所需要查找的字符的索引位置 如果没找到则返回-1
int lastIndexOf(String str):从后往前找,返回指定字符的索引位置 如果没找到则返回-1
int lastIndexOf(String str,int fromIndex):从后往前找,返回指定索引位置开始查找所需要查找的字符的索引位置 如果没找到则返回-1
替换:
String replace(char oldChar,char newChar):复制新的字符且改变指定字符的内容并返回
String replace(CharSequence target,CharSequence replacement):复制新的字符串且改变指定字符串的内容并返回
String replaceAll(String regex,String replacement):“把 字符串的数字改为逗号”,替换所有的,详见正则表达式
String replaceFirst(String regex,String replacement):“把 字符串的数字改为逗号”,只替换第一个的,详见正则表达式
匹配:
Boolean matches(String regex):匹配给定的正则表达式
切片:
String[] split(String regex):此处需要与正则表达式搭配,详见正则表达式
String[] split(String regex,int limit):此处需要与正则表达式搭配,详见正则表达式
类型转换:
String–>char型数组 调用String类的toCharArray()方法
char型数组–>String 调用String的构造器
String–>byte型数组 调用String的getBytes()方法
byte型数组–>String 调用String的构造器
编码:
字符串–>字节
看得懂的–>看不懂的二进制数据
解码:
编码的逆过程
看不懂的二进制数据–>看得懂的
**字符串相关的类:**
StringBuffer类(可变字符序列)
StringBuilder类(可变字符序列)
概述:
StringBuffer:可变的字符序列;线程安全的,效率偏低;底层使用char[]存储
StringBuilder:可变的字符序列;JDK5.0新增的;线程不安全的,效率高;底层使用char[]存储
StringBuffer/StringBuilder类方法总结:
增:append()
删:delete()
改:setCharAt()
查:charAt()
插:insert()
长度:length()
遍历:for()+charAt()/toString()
三者效率比较(从高到低排列):StringBuilder>StringBuffer>String
String,StringBuffer,StringBuilder三者的异同?
String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全的,效率偏低;底层使用char[]存储
StringBuilder:可变的字符序列;JDK5.0新增的;线程不安全的,效率高;底层使用char[]存储
源码分析:
String s1=new String();//底层char[] value=new char[0];
String s2=new String(“abc”);//底层char[] value=new char[]{‘a’,‘b’,‘c’};
StringBuffer sb1=new StringBuffer();//底层char[] value=new char[16];底层创建了一个长度为16的数组,此时value数组的长度为0
–>> sb1.append(‘a’);//value[0]=‘a’;
–>> sb1.append(‘b’);//value[1]=‘b’;
StringBuffer sb2=new StringBuffer(“abc”);//底层char[] value=new char[“abc”.length+16];底层创建了一个长度为字符串长度加16的数组
扩容问题:如果要添加的数据底层数组放不下,那就需要扩容底层数组
默认情况下,扩容为原来容量的2倍+2,同时将原有数组的元素复制到新的数组中
指导意义:开发中建议使用:StringBuffer(int capacity)或StringBuilder(int capacity)
欢迎发表你的意见(小板凳已备好),
本文地址:https://blog.csdn.net/weixin_45675202/article/details/107689278