- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java基础复习笔03我们不会注意的陷阱
Java基础复习笔记03我们不太注意的陷阱
刘岩
Email:suhuanzheng7784877@163.com
虚拟机对字符串的处理
虚拟机是将字符串直接量(不用new声明的)对象放到一个对象池中去缓存的,第一次使用的时候会将其放入池中,如果下次有其他变量访问一摸一样的直接量的话直接从对象池中去取该直接量,而不是又再生成一个对象。一般该池中的对象都不会被垃圾回收器回收。
比如:
String str1 = 1;
String str2 = 1; 实际上这段代码仅仅创建了一个字符串直接对象,保存在对象池中,池中对象就是”1”。str1和str2指向了该对象池的对象位置。
编译时能确定的值
在编译时就能确定的值,在编译的时候就能够确定是否创建新的对象池对象。比如:
String str3 = suhuanzhen123;
String str4 = suhuanzhen + 1 + 2 + 3;
System.out.println(str3 == str4); 实际上str3和str4在内存池中都是指向了suhuanzhen123这个字符串对象,所以输出时true。因为str4在编译期间就能确定值是suhuanzhen123,所以JVM不会再创建新的对象。直接从对象池中去取。
在编译期间不能确定的值
如果字符串的拼接包含了函数、变量等等编译时不确定因素,那么此时就不能指向对象池中的变量了。比如
String str5 = suhuanzhen123;
String str6 = suhuanzhen + 1.length() + 2 + 3;
System.out.println(str5 == str6);
在编译时就能确定值的字符串变量创建值
比如代码
String str6 = suhuanzhen + 1 + 2 + 3; 实际上仅仅创建了一个对象——suhuanzhen123,缓存到对象池。
StringBuilder和StringBuffer的区别
一般在单线程的系统环境下优先使用StringBuilder,因为它是非线程安全的。而在多线程的环境下,比如Web系统,优先使用StringBuffer,因为它当中绝大部分方法都使用了synchronized进行修饰,保证了多线程环境下的线程安全问题。
字符串之间的比较
用一个线程池的常量对象和一个变量、函数返回值比较直接使用==其实就可以了比如:
String jqgridparams = request.getParameter(jqgridparams);
if (jqgridparams != null) {
if (getparams == jqgridparams) {
//……………………
}
} 更直观一点就是
static String getStr(){
return suhuanzhen123;
}
public static void main(String[] args) {
String str7 = getStr();
System.out.println(suhuanzhen123 == str7);
} 输出的是true;
如果是2个字符串变量之间比较就不能用==了
String str7 = getStr();
String str8 = new String(suhuanzhen123);
System.out.println(str8 == str7); 输出false。
应该用
System.out.println(str8.equals(str7));
赋值语句的类型提升
上图程序实际上就是类型自动提升发生了错误,num本身是int型,而num = num+33.567;表达式中使用了double类型的数值,那么此表达式会自动向最高级别的基本类型转型,但是呢num自身是int,会提示不能向上转换的编译错误。如果程序这么写
public static void main(String[] args) {
int num = 1;
double numDoub = num+33.567;
} 就不会报错了。
赋值运算中基本数据转型的级别从高到低排序是String-double-float-long-int-chart、short-byte。
如果运算中含有字符串变量,那么二话不说,此表达式所有的运算最后的返回值就是一个字符串了,比如
int num = 1;
double numDoub = num+33.567;
String str = num+numDoub+; 所以最高级别还是String。
符合运算符中的隐式类型转换
在符合运算符中
您可能关注的文档
最近下载
- 2025年辅助生殖行业深度分析报告.docx
- 视力加盟运营方案.pptx VIP
- 中华民族一家亲《可爱的中国》新疆地方教材(小学版)教学教案.pptx VIP
- 新人教版数学四年级上册全册各单元教材解读精品课件.pptx VIP
- 人教版高中物理必修二全册PPT课件.pptx
- 一例PICC置管后出现机械性静脉炎的个案护理.pptx
- 人造板有害物质检测及试题.ppt VIP
- 2025公路水运检测师_道路工程考前冲刺备考速记速练300题_含详解.pdf VIP
- 5eDnD_凡戴尔的失落矿坑_模组_中译(二校).pdf VIP
- 吕维智讲座《生成式人工智能(GAI)为初中物理教学增效实操》(第三部分).pptx
文档评论(0)