欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

String类及其相关类的详细概述

程序员文章站 2022-03-10 10:29:07
String类及其相关类的详细概述(结尾有彩蛋!)最近学完了String类及其相关类StringBuffer和StringBuilder,本来Java就是面向对象的编程语言,所以学习的时候就得学习它写好的类及其方法供我们使用,废话不多说,直接上干货。String类概述String类代表的是字符串,属于引用数据类型,看它的源码会发现它是一个final类,不可以被继承,同时底层用了char数组,最后返回一个字符串,String类是不可变的字符序列,用字面量创建变量所存放的数据在方法区当中的字符串常量池当...

String类及其相关类的详细概述(结尾有彩蛋!)
最近学完了String类及其相关类StringBuffer和StringBuilder,本来Java就是面向对象的编程语言,所以学习的时候就得学习它写好的类及其方法供我们使用,废话不多说,直接上干货。
String类及其相关类的详细概述

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类及其相关类的详细概述

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类及其相关类的详细概述

替换:
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的构造器
编码
字符串–>字节
看得懂的–>看不懂的二进制数据
解码
编码的逆过程
看不懂的二进制数据–>看得懂的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)
String类及其相关类的详细概述

欢迎发表你的意见(小板凳已备好),

本文地址:https://blog.csdn.net/weixin_45675202/article/details/107689278