String内存分配情况
String Str = “jack”这个语句会先检查字符串常量池是否存放这个”jack”这个字符串对象,如果没有存在,那么就会在字符串常量池中创建这个字符串对象,如果存在直接返回该字符串的内存地址值。
String str3 = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象
public static void main(String[] args) {
String string = "123456";
String string2 = "123456";
string.equals("123456");
System.out.println(string==string2);//true
}
StringBuffer
由于String是不可变的,所以导致String对象泛滥,在频繁改变字符串对象的应用中,需要使用可变的StringBuffer类。
常用方法
方法 | 内容 |
StringBuffer("") | 在创建对象的时候赋值 |
append() | 在缓冲区的尾部添加新的文本对象 |
insert() | 在指定的下标位置添加新的文本对象 |
toString() | 返回这个容器的字符串 |
indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引。 |
substring(int start) | 从开始的位置开始截取字符串 |
replace(int start int end String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符 |
setCharAt(int index char ch) | 指定索引位置替换一个字符 |
reverse() | 把字符串反序输出。 |
public class Test2 {
public static void main(String[] args) {
// StringBuffer
// 由于String是不可变的,所以导致String对象泛滥,在频繁改变字符串对象
StringBuffer buffer = new StringBuffer();
System.out.println(buffer.toString());
// append:追加东西到StringBuffer
buffer.append("123456");
System.out.println(buffer.toString());// 创建多少个对象/1StringBuffer 2."123456"
// 之后就是一直对StringBuffer操作,StringBUffer是可以改变的。
buffer.append("1");
System.out.println(buffer.toString());
StringBuffer buffer2 = new StringBuffer("9875641223");// 创建对象并且把 "9875641223"放进去
System.out.println(buffer2);
// insert在指定的下标位置添加新的文本对象
buffer2.insert(2, "abc");
System.out.println(buffer2);
// toString:返回这个容器的字符串
System.out.println(buffer2.toString() + "-------");
// indexOf(String str):返回第一次出现的指定子字符串在该字符串中的索引。
System.out.println(buffer2.indexOf("abc2"));
// substring(int start):从开始的位置开始截取字符串
System.out.println(buffer2.substring(2));
// replace(int start,int end,String str):使用给定 String
// 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符
System.out.println(buffer2.replace(2, 5, "ABC"));
// setCharAt(int index,char ch):指定索引位置替换一个字符
buffer2.setCharAt(0, '0');
System.out.println(buffer2);
// reverse():反序输出字符串
buffer2.insert(0, "123456789");
System.out.println(buffer2.reverse());
}
}
关于String的效率
long start = System.currentTimeMillis();//1970到现在一共经历了多少毫秒 1000ms = 1s
String s = "";
for(int i = 0;i<50000;i++){//创建了50000次对象所以慢
s+=i;// 0 01 012
}
long end = System.currentTimeMillis();//1970到现在一共经历了多少毫秒 1000ms = 1s
System.out.println("一共用了多少毫秒:"+(end-start));//14508毫秒
关于StringBuffer效率
long start = System.currentTimeMillis();//1970到现在一共经历了多少毫秒 1000ms = 1s
StringBuffer s = new StringBuffer();
for(int i = 0;i<50000;i++){
s.append(i);
//s+=i;//-> s = s+i;
}
long end = System.currentTimeMillis();//1970到现在一共经历了多少毫秒 1000ms = 1s
System.out.println("一共用了多少毫秒:"+(end-start));//16毫秒