Java的String及其包装类总结

Java为字符串维护了一个字符串常量池,在方法区中,方法区内存的是不会轻易改变的内容,而字符串一旦被赋值,便是不可改变的。这里对不可变性做个解释:

Java字符串的不可变是指值不可改变,但是引用可以改变,比如当为字符串s赋值为abcd后,再赋值成abcedl,不是在原有的内存地址上进行修改,而是重新指向一个新的对象、地址。

Java的String及其包装类总结_第1张图片
围绕着字符串常量池面试时经常会有很多考点,比如:

String s1 = new String("hello");
String s2 = "hello";
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true

这里的s1 == s2比较的是地址值,而new对象和给字符串赋值的地址值本质上是不同的,我们都知道new出来的对象是在堆内存中开辟空间,而给字符串赋值确是在常量池内创建,如下图所示。
Java的String及其包装类总结_第2张图片
s1指向的是堆内存中开辟的地址,而s2则直接指向了方法区里的字符串常量池,s1在堆内存中new出的对象存的也是字符串常量池中的字符串地址。
看懂了这幅图就能很好理解接下来的几个比较结果:

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
//s1、s2在堆内存开辟的地址不同,==自然为false
			
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true
//s5、s6都指向字符串常量池里的“hello”,==自然为true

String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true
//这里特别讲下,当两个字符串变量s1、s2相加时,是先在字符串常量池中开辟一个空间,然后再
拼接,新开辟空间的地址就是s1s2拼接后的地址,与s3不同。

System.out.println(s3 == "hello" + "world");// true
System.out.println(s3.equals("hello" + "world"));// true
//而当两个字符串常量相加时,是先拼接,然后去常量池内找是否有"helloworld",有则直接返回
该地址值,所以和s3是同一个字符串对象。

字符串的常用方法:

判断方法:
boolean equals(String s);
boolean isEmpty();//这里不能用于判断String为null的情况,会报空指针,仅相当于判断长度是否为0
boolean equalsIgnoreCase(String s);//字符串是否相等忽略大小写
boolean sartsWith(String s);//是否以s开头
boolean endsWith(String s);//是否以s结尾
boolean contains(String s);//是否包含s


获取方法:
int length();//获取长度
int indexOf(String s);//返回s在字符串中第一次出现的索引
int indexOf(String s,int fromIndex);//返回s在字符串中从指定位置起第一次出现的索引
char charA(int index);//返回字符串中指定位置的字符
String substring(int index);//从指定位置开始截取字符串,默认到结尾
String substring(int fromIndex,int endIndex);//截取指定位置区间的字符串,包左不包右

转换方法:
byte[] getBytes();//转成字节数组
char[] toCharArray();//转成字符数组
String toLowerCase();//转换成小写
Sting toUpperCase();//转换成大写
static String valueOf(char[] c);//把字符数组转换成字符串
static String valueOf(int i);//int型转String
String concat(String s);//把s拼接入字符串末尾

其它方法:
String replace(char o,char n);//替换字符
String replace(String old,String new);//替换指定字符串
String trim();//去除字符串头尾空格

String和int互转:

String->int:Integer.parseInt("100");
int->String:String.valueOf(100);

StringBuffer介绍
StringBuffer是线程安全可变字符串,能保证数据同步,效率低,相对于String来讲,长度和内容可变。
StringBuffer常用方法:

添加:
StringBuffer append();//将指定数据作为参数添加到已存在数据的结尾处
StringBuffer insert(int index,数据);将数据插入指定位置

删除:
StringBuffer delete(start,end);//删除指定区间的字符,包左不包右
StringBuffer deleteCharAt(index);//删除指定位置的字符

替换:
StringBuffer replace(start,end,str);//讲指定区间替换为指定字符串
void setCharAt(index,ch);//替换指定位置的字符

获取:
char charAt(int index);//获取指定位置的字符
int indexOf(String s);//获取指定字符第一次出现的位置
int lastIndexOf(String s);//如果出现字符串参数一次或多次,则返回最后一个这样的字符串的第一个字符的索引返回
int length();//获取长度
Sring substring(int start,int end);//获取子字符串,包含start,不包含end(注意:访问的是String,不是StringBuffer)

反转:
StringBuffer reverse(); //返回StringBuffer对象的颠倒顺序

String和StringBuffer互转:

StringBuffer->String:
1.构造方法2.toString()方法
String->StringBuffer:
1.构造方法2.append()方法

你可能感兴趣的:(Java的String及其包装类总结)