Java基础常用类总结(String)
Java基础常用类目录
- 1. java.long.string类的使用
-
- 1.1 String概述
- 1.2 String的不可变性
- 1.3 String实例化的不同方式
- 1.4 字符串的拼接方式
- 1.5 String、StringBuffer、String Builder之间的区别
- 1.6 String 、String Buffer、String Builder的转换
1. java.long.string类的使用
1.1 String概述
说明(大概了解即可,不需要深究):
String :字符串,使用一对“”引起来表示。
1.String声明为final的,表示不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的
3.String实现了Comparable接口:表示String是可以比较大小的
3.String内部定义了final char[] value 用于存储字符串数据
4.String:代表不可变的字符序列,简称:不可变性。
5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中。
6.字符串常量池是不会存储相同内容的字符串的。
1.2 String的不可变性
2.1描述(重点,需要细读):
体现:
1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
3.当调用String的replace()方法修改指定字符串时,同样需要重新指定内存区域赋值,不能使用原有的value进行赋值
2.2代码展示:
public void Test1() { String s1 = "abc"; String s2 = "abc"; s1 = "hello"; System.out.println(s2 == s1); String s3 = "abc"; s3 += "def"; System.out.println(s3); String s4 = "abc"; String s5 = s4.replace("a", "ttt"); System.out.println(s4); System.out.println(s5); }
1.3 String实例化的不同方式
面试时需要注意:
方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式
需要注意:只要是通过new出来或者是由变量相加得到的的对象都在方法区中,所以在使用==进行判断时,即使内容一样,它的地址也是不同的
代码展示
public void test2(){ //通过字面量定义的方式,此时的s1和s2的数据声明在方法区的字符串常量池中 String s1 = "java"; String s2 = "java"; //通过new + 构造器的方式:此时的s3和s4保存的地址值是数据在堆空间开辟空间以后的地址值 String s3 = new String("java"); String s4 = new String("java"); System.out.println(s1 == s2);//true System.out.println(s1 == s3);//false System.out.println(s3 == s4);//false Person p1 = new Person("李华",15); Person p2 = new Person("李华",15); System.out.println(p1.name.equals(p2.name));//true p2.name = "Tom"; System.out.println(p1.name.equals(p2.name));//false }
1.4 字符串的拼接方式
说明(和上面的对应简单理解):
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同的常量
2.只要其中有一个变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中
代码展示:
public void Test3(){ String s1 = "javaEE"; String s2 = "hadoop"; String s3 = "javaEEhadoop"; String s4 = "javaEE" + "hadoop"; String s5 = s1 + "hadoop";//存储结果在堆中 String s6 = "javaEE" + s2;//存储结果在堆中 System.out.println(s3 == s4);//true(都存储在常量池中,地址是一样的) System.out.println(s3 == s5);//false(存储在堆中) System.out.println(s3 == s6);//false //如果拼接的结果调用intern()方法,返回值就在常量池中 String s7 = s5.intern(); System.out.println(s3 == s7);//true}
String比较常用的方法总结(了解内容)
1.int length():返回字符串的长度: return value.length
2.char charAt(int index): 返回某索引处的字符return value[index]
3.boolean isEmpty():判断是否是空字符串:return value.length == 0
4 String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
5.String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
6.String trim():返回字符串的副本,忽略前导空白和尾部空白
7.boolean equals(Object obj):比较字符串的内容是否相同
8.boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
9.String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
10.int compareTo(String anotherString):比较两个字符串的大小
11.String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
12.String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
13.boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
14.boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
15.boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始子字符串是否以指定前缀开始
16.boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
17.int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
18.int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
19.int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
20.int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
21.String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
22.String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
23.String replaceAll(String regex, String replacement) : 使 用 给 定 的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
24.String replaceFirst(String regex, String replacement) : 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
25boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
26.String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
27.String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
1.5 String、StringBuffer、String Builder之间的区别
区别:
String :不可变的字符序列,底层使用char[] 存储
StringBuffer:可变的字符序列,线程安全的 效率比较低,底层使用char[] 存储
StringBuilder:可变的字符序列,线程不安全的 效率比较高,底层使用char[] 存储
说明(认真读一下):
实际上String Buffer 和StringBuilder是一样的,只是一个是安全的一个是不安全的,他们的父类都一样继承于String
String Buffer的常用方法:
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
1.6 String 、String Buffer、String Builder的转换
说明(好好体会一下):
String---->String Buffer、String Builder:调用String Buffer、String Builder的构造器
String Buffer、String Builder---->String:①调用String 的构造器②调用String Buffer、String Builder的toString()
代码实例:
public void test(){ //String 转化为String Buffer 、String Builder String s1 = "hello,java"; StringBuffer stringBuffer = new StringBuffer(s1); System.out.println(stringBuffer); StringBuilder stringBuilder = new StringBuilder(s1); System.out.println(stringBuilder); //StringBuffer、StringBuilder转化为String StringBuffer stringBuffer1 = new StringBuffer("hello,string"); String s2 = new String(stringBuffer1); String s3 = stringBuffer1.toString(); System.out.println(s2); System.out.println(s3); }