发布于2021-05-29 21:54 阅读(1283) 评论(0) 点赞(3) 收藏(1)
通过常量赋值:
String str = "pingtouge"
使用这种创建string对象时,首先从常量池创建常量“pingtouge”,而在创建常量pingtouge之前在常量池内先进行判断,判断该对象是否被创建,如果创建就返回该对象的引用地址。如果没有被创建那么就创建一个该字符串。
通过String构造函数创建:
String str = new String("pingtouge")
使用这种方式创建字符串对象比较复杂。首先在编译过程中字符串会被加入到常量结构中,类加载的时候就会在常量池中创建字符串。然后调用new方法,jvm调用String构造函数,并引用常量池中的字符串,并在堆内存中创建String对象并返回堆内存地址。
在使用==判断两个值是否相等时是false,因为两者一个指向常量池引用的地址,一个指向堆内存的引用地址
String是一个不可变得对象。通过源码可以看到,string对象的方法由一个final修饰,方法内部的char字符串则由private和final修饰,我们可以看到这就是一个从内到外不可变得对象。
Java 公司为什么要将String设置成不可变的,主要从以下三方面考虑:
1、保证 String 对象的安全性。假设 String 对象是可变的,那么 String 对象将可能被恶意修改。
2、保证 hash 属性值不会频繁变更,确保了唯一性,使得类似 HashMap 容器才能实现相应的 key-value 缓存功能。
3、可以实现字符串常量池
你有用过 str = str + i;这样的表达式么;
其实上从原理来讲这样是会再创建一个String对象的,那么他是不是就会影响性能呢?其实上java公司已经帮助我们考虑过这些问题了,在编译器编译过程中会将这段代码进行优化,一点也不会影响性能了。
你知道intern吗?
String str = new String("pingtouge");
String str1 = new String("pingtouge");
System.out.println("未使用intern()方法:"+(str==str1));//返回值:false
String str2= new String("pingtouge").intern();
String str3 = new String("pingtouge").intern();
System.out.println("使用intern()方法:"+(str2==str3));//返回值:true
为什么呢?
因为被intern形容的字符串在被创建之前会先从常量池中判断是否有和这个对象相同的对象;如果没有就将这个对象创建,并将这个String对象放入常量池中;如果有那就直接使用这个对象的内存地址指向当前创建的对象。
而没有被intern形容的string哪怕赋的值相同也会因为String的特性在常量池创建一个内存地址不同的相同对象。
而==判断的是两个对象之间的内存地址,所以普通对象会返回一个false。而intern对象会返回true。
spring的split方法:
split方法是string切割方法,一般用于较多的字符处理,和正则表达式进行联用。这个方法由于处理的字符串有时候比较多,而相对比的他的切割准则也是依赖于正则表达式的,那么一旦正则有一点问题可定能就会出现内存被大量占用,程序运行时间长,程序崩溃等问题。
推荐大家在使用切割时,如果字符串处理难度不高可以使用indexof或者不适用正则split。
原文链接:https://blog.csdn.net/Beatleschasemoon/article/details/117294218
作者:小泽圈儿郎
链接:http://www.javaheidong.com/blog/article/207689/618b9edcaaaaeb680d4b/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!