String字符串
不可被继承;实现了Comparable、Serializable
String的不可变性
String的实例化方式
方式一:使用字面量方式。 String s = “hello”方式二:String s = new String(“hello”);【面试题】String s = new String(“hello”)在内存中创建了几个对象? 两个!内存解析:
jdk6时,字符串常量池是存放在永久代jdk7时,字符串常量池改为存放在堆空间jdk8时,取消了永久代,取而代之的是元空间(使用直接内存)
连接操作:+
String的常用方法
String与其他相关结构的转换:包装类、字符数组、字节数组
String的常用算法题目
二、String、StringBuffer、StringBuilder 2.1 String 与其他类之间的转换String与包装类、基本数据类型之间的转化
@Test
public void test1(){
//String-->包装类、基本数据类型:调用包装类Xxx的parseXxx()
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num);
// 包装类、基本数据类型--> String:调用String的valueOf()
String str1 = String.valueOf(num);
System.out.println(str1);
String str2 = num + "";//底层需要创建SringBuilder,并调用append()导致效率第一valueOf()
System.out.println(str2);
}
String与char[]之间的转化
@Test
public void test2(){
String str1 = "hello";
//String--->char[]:调动String的toCharArray()
char[] arr1 = str1.toCharArray();
for(int i = 0;i < arr1.length;i++){
System.out.println(arr1[i]);
}
//char[] ---> String:调用String的构造器
String str2 = new String(arr1, 0, arr1.length);//new String(arr1);
System.out.println(str2);
}
String与byte[]之间的转化
@Test
public void test3() throws Exception{
String str1 = "hello中国";
//编码:String--->byte[]:getBytes()
byte[] arr1 = str1.getBytes();//使用默认的字符集:UTF-8
System.out.println(Arrays.toString(arr1));
byte[] arr2 = str1.getBytes("gbk");//显式指定字符集。
System.out.println(Arrays.toString(arr2));
//解码:byte[] ---> String:使用构造器
String str2 = new String(arr1);//使用默认的字符集:UTF-8
System.out.println(str2);
String str3 = new String(arr2);
System.out.println(str3);//因为编码集和现在的解码集不一致,导致出现乱码!
String str4 = new String(arr2,"gbk");
System.out.println(str4);//因为编码集和现在的解码集都是使用gbk,没有乱码
}
String、StringBuffer、StringBuilder
//String --> StringBuffer、StringBuilder String str = "hello"; StringBuffer s1 = new StringBuffer(str); StringBuilder s2 = new StringBuilder(str); //StringBuffer、StringBuilder --> String String str1 = s1.toString(); String str2 = s2.toString(); String str3 = new String(s1); String str3 = new String(s2);2.3 String、StringBuffer、StringBuilder三者对比
@Test
public void test1() {
String str1 = "hello";
str1 += "world";// 新建一个内存空间保存helloworld
StringBuffer str2 = new StringBuffer("hello");
str2.append("world");// 与创建对象中的char[]数组是同一个
}
面试题:String、StringBuffer、StringBuilder的异同
对比三者的执行效率:
@Test
public void test3() {
// 初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
// 开始对比
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}
2.4 StringBuilder和StringBuffer的常用方法
@Test
public void test2() {
StringBuffer s1 = new StringBuffer();
s1.append("abc").append("def").append("123");// 方法链的调用
System.out.println(s1);
s1.replace(3, 6, "hello");
System.out.println(s1);
s1.insert(3, "123");
System.out.println(s1);
}



