String内存分配情况

String Str = “jack”这个语句会先检查字符串常量池是否存放这个”jack”这个字符串对象,如果没有存在,那么就会在字符串常量池中创建这个字符串对象,如果存在直接返回该字符串的内存地址值。

String str3 = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象

java String 的内存多久GC 一次 java 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毫秒