目录
String类StringBuffer类StringBuilder类区别
概述
字符串是由多个字符组成的一串数据(字符序列)的字符串常量,java中所有字符串都是String类的实例,一旦创建不可改变。
底层原理
在Java.lang包中有String类,该类有一个属性 private final char[] value,该属性用来存放字符串对象的值,比如String s = "abc" ; 在底层,实际上是以['a','b','c']存储的.并且value被final修饰,因此value值也就不可改变.
在使用过程中,我们经常会改变字符串的值,比如 s += "def",此行代码一旦运行,会再一次创建一个字符串对象,别且将原来的s对象的值拼接到一起即"abcdef"赋值给新对象,s变量指向这个新对象供我们使用的.在使用中好像s是可以改变的,但实际s已经不是原来的对象了,每一次改变都会创建新的对象,原来的对象值是不可改变的.
创建方式
-
String s = "abc";
这种创建方式是先在栈中创建变量s,然后在字符串常量池中查找"abc",如果找到,将s引用变量指向该"abc",如果没有找到,则在字符常量池中添加"abc",并且将s引用变量指向该"abc".
-
String s = new String("abc);
此方式是创建对象的一般方法,在new对象时,会调用该类的构造方法,因此会在堆中创建s对象,其值存储在堆内存中.
常用方法 构造方法 String();
此方法没有参数,创建时会创建一个空字符串,将""赋值给底层的value属性.
String(String original);
需要一个字符串参数,创建对象时会将original赋值给value属性.因为原本的original也是一个字符串,而新创建的对象和original的值相同.
String(byte[] bytes);
需要一个byte类型数组,创建对象时会将byte数组按照编码方式(默认使用"utf-8")解码,将解码后的字符串赋给新对象.
String(byte[] bytes,String charset);
也可以指定编码方式,需要多传入一个String参数,用来规定编码方式.
String(char[] value);
将char数组转换成字符串,并且赋给新对象.
成员方法
● 判断功能
boolean equals(Object obj); 使用对象调用,判断俩者内容是否一致; boolean equalsIgnoreCase(String str); 使用对象调用,判断俩者内容是否一致(忽略大小写); boolean contains(String str) 判断字符串是否包含str即判断str是否为该对象的子串,包含返回true,否则返回false; boolean isEmpty() 判断字符串是否为空,为空则返回true,否则返回false; boolean startsWith(String prefix) 判断字符串是否以prefix开头的,是返回true,否则返回false; boolean endsWith(String suffix) 判断字符串是否以prefix结尾的,是返回true,否则返回false;
●获取功能
int length() 获取字符串的长度. 因为底层使用char[]存储,因此在底层直接返回数组长度. char charAt(int index) 获取索引为index的字符. int indexOf(String str) 从前向后查找str,并且返回第一次出现的索引,如果不存在,返回-1 int indexOf(String str,int fromIndex) 从指定索引fromIndex开始从前向后查找str,并且返回第一次出现的索引,如果不存在,返回-1 int lastIndexOf(String str) 从后向前查找str,并且返回第一次出现的索引,如果不存在,返回-1.也可以理解为从前向后查找,返回最后一次出现的索引。 String substring(int start) 从索引fromIndex处截取字符串并返回。 String substring(int start,int end) 截取[start,end)区间的字符串并返回。
● 转换功能
byte[] getBytes() 将字符串转换为byte[] char[] toCharArray() 将字符串转换为char[] static String valueOf(char[] chs) 此方法为静态方法,通过类名调用.可以将char[]数组转换成String实例化对象,此方法可以传入不同类型的参数(例如byte,int)都可以转换成String对象。 String toLowerCase(); 将字符串转换成小写。 String toUpperCase(); 将字符串转换成大写。 String concat(String str); 将指定的字符串连接到该字符串的末尾。 Stirng[] split(分割符); 将字符串以特定的规则(参数传入的正则表达式)分割为若干个字符串在String[]并返回。
● 替换功能
String replace(char old,char new) 将new字符替换字符串中的old字符,返回替换后的字符。 String replace(String old,String new) 将new字符串替换字符串中的old字符串,返回替换后的字符。 replaceAll(String regex, String replacement) 参数regex: 正则表达式(一种匹配模式), replament : 需要替换的内容。 将对象中所有符合regex的内容替换为replacement。 replaceFirst(String regex, String replacement) 将对象中第一个符合regex的内容替换为replacement。
字符串缓冲类
概述
String是不可改变的,即对象一旦创建,其值不能改变,如果需要改变其值,只能创建新的对象,在我们使用过程中,我们很多时候需要改变字符串,比如拼接字符串,删除字符串,逆序等场景,我们都需要改变字符串,并且有时候我们需要在短时间多次改变,就会创建多个新对象,并且原来的对象可能我们就不再需要了,不仅浪费时间,还会造成大量的空间浪费。字符串缓冲类应运而生,可以解决时间和空间浪费。
实现原理
所有字符串的底层都是使用char[]存储字符串的每一个字符,但是String的底层char[] 被final修饰,因此String无法改变。而StringBuffer和StringBuilder的底层char数组没有被final修饰,而是有自己的扩容机制,也就是说他们使用的char[]是动态数组。
StringBuffer
实现字符串缓冲功能的一个类,是线程安全(底层的所有方法都被synchronized修饰)的,可变字符串,提供了很多字符串的处理方法,使得使用并改变字符串更加得心应手。
构造方法
public StringBuffer(); 此方法在底层调用父类AbstractStringBuilder的构造方法,并且初始化底层数组容量为16; public StringBuffer(String str); 此方法在底层调用父类AbstractStringBuilder的构造方法,并且初始化底层数组容量为16 + str.length,将str存储在char[]中;
● 添加功能
public StringBuffer append(String str)
向原字符串拼接str
public StringBuffer insert(int offset,String str)
向原字符串中索引为offset的位置插入str
● 删除功能
public StringBuffer deleteCharAt(int index)
删除索引index的字符
public StringBuffer delete(int start,int end)
删除索引区间[start,end)的字符
● 替换功能
public StringBuffer replace(int start,int end,String str)
将字符串中[start,end)的子串替换为str
● 反转功能
public StringBuffer reverse();
将字符串翻转
● 截取功能
public String substring(int start)
将字符串从start位置至结束位置截取,并以String类型返回
public String substring(int start,int end)
将字符串从start位置至end位置(不包括end)截取,并以String类型返回
StringBuilder
与StringBuffer有相同的功能,并且都是AbstractStringBuilder的子类.唯一区别是StringBuilder是线程不安全的,StringBuffer是线程安全的.
String类StringBuffer类StringBuilder类区别
● String:是字符常量,适用于少量的字符串操作的情况
● StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
● StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况