结合源码和常量池详解Java中的String

本篇对String结合源码和常量池进行总结

String是java中一个常用的引用类型。

先看String源码


所以String底层是由char[]数组存储数据的。那么String的最大长度应该是多少呢?

由于String底层是char[]数组,所以其允许的长度是固定的, 由于char[]数组的元素是由下标来定位的,而下标的类型为int,所以char最多只能表示2^31 - 1(2G-1),也就是说string可以表示的长度为2^31 - 1,由于char占用两个字节,所以所占空间还要*2,既4G以内。

常量池

String a = "hello"; 其中a指向常量池中的"hello";

String a1 = "he"+"llo"; 其中a1指向常量池中的"he"和"llo"相加合并后的地址"hello",由于常量池中都是静态常量,hello字符串只有一个既a所以a1==a;

1.1,

String a = "hello";

                   String a1 = "he"+"llo";

                   System.out.println(a==a1);//true

                   String a2 = "he"+new String("llo");

                   System.out.println(a1==a2);//false

                   System.err.println(a1==a2);//false

                   System.err.println(a==a2);//false

a,a1都是在常量池中的,a2就是生成llo对象合并之后生成a2对象放在堆中的,所以用==判断内存地址时结果如上

 

1.2

         publicstatic void main(String[] args) {

                   Stringstr01 = "AB";

                   Stringstr02 = "AB";

                   StringBufferstr03 = new StringBuffer("AB");

                   StringBufferstr04 = new StringBuffer("AB");

                   testStr01(str01);

                   testStr02(str02);

                   testStr03(str03);

                   testStr04(str04);

                   System.out.println(str01);//AB

                   System.out.println(str02);//AB

                   System.out.println(str03);//ABCD

                   System.out.println(str04);//AB                

                  

         }

        

         privatestatic void testStr01(String str){

                    str = str+"CD";

         }

         privatestatic void testStr02(String str){

                    str = "CD";

         }

         privatestatic void testStr03(StringBuffer str){

                   str.append("CD");

         }

         privatestatic void testStr04(StringBuffer str){

                    str=new StringBuffer("CD");

         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值