1.String为什么是不可变的
答:经常的逻辑之中,String str=“aaa”,其中str就是“aaa”就是不可变的,我们说String不可变,指的就是String被final给修饰了,我们对String进行赋值的时候,就是让它指向了常量池的引用,我们再改变值的时候,其实并没有改变常量池中这个str对应的值,我们改变的只是引用。
2.String str=new String("abc") 创建了几个对象,答案是两个,一个是abc另一个是new String();如果常量池中abc已经存在了,那就是创建了一个对象
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class StringConstructor {
/**
* String类是被final修饰的因此string是不能被继承的,也就是没有子类
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* string对象不可变,引用可变,我们对String重新赋值,如果常量池中存在要赋值的对象
* 那么就会直接把引用改为指向新对象,但是之前的对象并不会发生改变,如果常量池中不存在
* 要赋值的对象,就会先在常量池中创建对象在改引用
*
*/
//这种赋值方式是把abc放入常量池
String str2="abc";
//通过下面构造器的方法创建的,都是放入堆中
/**
* 这个只有一句 this.value = "".value;我们知道String创建完之后是对象不可变的,
* 所以这个构造器是基本不用的
*/
String str=new String();
/**
* this.value = original.value;
* this.hash = original.hash;
* 这种创建方式也是没必要的,创建了String的副本,然后这个就会出现一个题,
* String str =new String("abc");创建了几个对象,答案是两个对象
* abc和new String()
*/
str=new String("123");
/**
* 赋值字符数组中的字符序列给字符串
* this.value = Arrays.copyOf(value, value.length);
*/
char cr[]= {'a','b','c','d','e'};
str =new String(cr);
System.out.println("String(char value[]):"+str);
/**
* public String(char value[], int offset, int count)
* value字符数组 offset可以理解为数组的下标,count长度
* 整体理解就是要从第offset位置开始,截取count长度的数组作为字符串
*/
str=new String(cr, 1,2);
System.out.println("String(char value[], int offset, int count)"+str);
/**
* public String(int[] codePoints, int offset, int count)
*/
str=new String(new int[]{1,2,3,4,8},1,2);
System.out.println(str);
/**
* String(byte bytes[], int offset, int length, String charsetName)
* bytes - 要解码为字符的字节
* offset - 要解码的第一个字节的索引
* length - 要解码的字节数
* charsetName - 支持的名称charset
*/
byte[] by = "testaaa".getBytes();
try {
str=new String(by,1,5,"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str);
/**
* String(byte bytes[], String charsetName)
*/
try {
str=new String(by,"UTF-8");
System.out.println(str);
/**
* 不需要指定字符集的时候
*/
str=new String(by,1,5);
System.out.println(str);
str=new String(by);
System.out.println(str);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* public String(StringBuffer buffer)
* 分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
* 字符串缓冲区的内容被复制; 字符串缓冲区的后续修改不会影响新创建的字符串。
*/
StringBuffer str1=new StringBuffer("112331");
str=new String(str1);
System.out.println(str);
StringBuilder str3=new StringBuilder("1122333");
System.out.println(str3);
}
}