String源码查看以及相关知识理解

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);	
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值