java之String 和StringBuffer和StringBuilder

package com.guaji.exer;

import org.junit.Test;

public class StringExer {
	/*
	 * 1:String是一个final类,代表不可变的字符序列 2:String对象的字符内容是存储在一个字符数组final value[]中的
	 * 3:String 声明了Serializable接口:表示字符串是支持序列化的,并且实现了Comparable:表示String可以比较大小
	 * 
	 * String代表不可变的字符序列体现: 1:当对字符串重新赋值的时候,需要重写指定内存区域赋值,不能使用原有的value进行赋值
	 * 2:当对字符串进行拼接操作的时候,也需要重写指定内存区域赋值
	 * 3:当调用String的replace()方法修改指定字符或者字符串时,也需要重写指定内存区域赋值 ......
	 *
	 * 关于String,StringBuffer,StringBuilder三者的异同? 1:String:不可变的字符序列,底层使用char[]储存
	 * 2:StringBuffer:可变的字符序列,线程安全,效率偏低 底层使用char[]储存
	 * 3:StringBuilder:可变的字符序列,非线程安全,效率高 jdk5.0新增 底层使用char[]储存
	 * 4:StringBuffer:底层创建了一个长度为16的char[]型数组,默认情况下,扩容为原来的一倍+2,同时将原来的数组元素赋值到新的数组中
	 */
	@Test
	public void stringBuilderExer() {
		StringBuilder str = new StringBuilder("hello");
		str.append("World");
		System.out.println(str);
		int indexOf = str.indexOf("o");// 返回该字符的下标
		System.out.println(indexOf);
		String substring = str.substring(5, 6); // 字符串的截取,包前不包后
		System.out.println(substring);
		StringBuilder delete = str.delete(2, 4);// 字符串的删除,包前不包后
		System.out.println(delete);
	}

	/*
	 * String的常用类有 int length():返回字符串的长度: return value.length  * char
	 * charAt(int index): 返回某索引处的字符return value[index]  * boolean
	 * isEmpty():判断是否是空字符串:return value.length == 0  * String
	 * toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写  * String
	 * toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写  * String
	 * trim():返回字符串的副本,忽略前导空白和尾部空白  * boolean equals(Object obj):比较字符串的内容是否相同 
	 * * boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写  *
	 * String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”  int
	 * compareTo(String anotherString):比较两个字符串的大小  * String substring(int
	 * beginIndex):返回一个新的字符串,它是此字符串的从 beginIndex开始截取到最后的一个子字符串。  String
	 * substring(int beginIndex, int endIndex)
	 * :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串 boolean
	 * endsWith(String suffix):测试此字符串是否以指定的后缀结束 boolean startsWith(String
	 * prefix):测试此字符串是否以指定的前缀开始 boolean startsWith(String prefix, int
	 * toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	@Test
	public void stringExer() {
		// 1: 通过字面量的方式(区别于new方法)给一个字符串赋值,此时的字符串声明在字符串常量池中,字符串常量中不会存储相同内容的值
		String str = "hello";
		String str1 = "World";

		// 2:常量和常量拼接结果在常量池,且常量池中不会存在相同内容的常量,只要其中有一个是变量,结果就在堆中
		String str2 = "helloWorld";
		String str3 = "hello" + "World";
		System.out.println(str2 == str3);
		String str4 = str + "World";
		System.out.println(str2 == str4);
		System.out.println("*******" + str2.equals(str4));// equals比较的是数值
		// 3:如果拼接的结果调用intern()方法,返回值就在常量池中
		String intern = str4.intern();
		System.out.println(str2 == intern);

	}

}

你可能感兴趣的:(#,Java基础)