百科狗-知识改变命运!
--

java中 String str="abc";和String str=new String"abc";有什么区别

百变鹏仔1年前 (2023-12-17)阅读数 16#综合百科
文章标签常量池中

如果是String str = "abc";编译器首先会在常量池中寻找有没有"abc"这个字符串,如果有则直接从常量池中取,不会new,如果常量池中没有,则会new一个,并将"abc"存放到常量池中。

而String str = new String( "abc");则编译器直接new一个字符串,不会到常量池中查询。

所以:

java中 String str="abc";和String str=new String"abc";有什么区别

String str1 = "abc";

String str2 = "abc";//str1是"abc",常量池中已经有了"abc",所以str2直接从常量池中取

String str3 = new String("abc");

String str4 = new String("abc");

System.out.println(str1 == str2);//true

System.out.println(str2 == str3);//false

System.out.println(str3 == str4);//false

首先告诉你,java里的String类型保存的就是引用地址,就像你下面说的,如果用String a="你好" 这种方式赋值的话,a里会保存一个地址,双引号字符串是常量字符串,在java文件编译的时候就放在虚拟机的常量池中,“你好”的真正位置也是在常量池中,另外还有一种方式:String a = new String("你好"),如果这样写就和第一种不一样了,这个对象是在程序运行时创建,不是创建在常量池而是和其他java对象一样在java堆上创建,因此它的地址和第一种的不用。

第二个问题,String和int直接赋值的区别。首先,最大的区别,一个是对象,一个是数值,对象可以为null,数值却必须有值,哪怕你没赋值,系统也会自动赋值为0。int b = 3是直接在内存空间分配了一块空间b内容是3,b的内容是可变的,可以变为5,6……而String对象是不可变的,“你好”实际是在堆中存在的,把引用给了a,如果String a = "bbb"则是把另一个新的对象"bbb"的地址引用给了a,之前的对象“你好”是没有改变的。

第三个问题,为什么引用类型赋值不能像基本数据类型呢?因为引用类型远比基本数据类型复杂啊,基本数据类型只有数值、字符、布尔三种数据类型,可以很简单得表示出来,像2、'a'、true这样,赋值也自然容易,但是引用类型就不一样了,可能要引用的类型是个人,或者是一个职业,这样复杂的东西都是同时包含好多不同属性的,这总不能直接用一个数值就能表示吧,所以要想找它的话只能找它的地址了,然后再根据地址找到对应的对象,虽然麻烦一些,但是也无法避免。

好了,希望我的回答能够对你有所帮助。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)