java之表达式陷阱

String str1 = "Hello Java的长度:10";

String str2 = "Hello Java的长度:10";

String str3 = "Hello Java的长度:"+"Hello Java".length;

String str4 = "Hello "+"Java的长度:10";

System.out.print(str1 == str2);    输出:true

System.out.print(str1 == str3);    输出:false

System.out.print(str1 == str4);    输出:true

通过以上例子可以得到。对于Java中字符直接量,JVM会使用一个字符串池来保存它们;一般情况下字符串池中的字符串对象不会被垃圾回收,当程序再次需要使用该字符串时,无需重新创建一个新的字符串,而是直接引用已有的字符串。通过表达式来创建字符串对象,如果这个字符串连接表达式的值可以在编译时确定下来。那么JVM会在编译时计算该字符串变量的值,并让它指向字符串池中对应的字符串。

字符串也许以后永远不会在被用到,但这个字符串并不会被垃圾回收,因为它将一直存在于字符串池中---这是Java内存泄漏的原因之一。

注:System.identityHashCode(str);可以得到某一个对象的唯一的hashcode值,这个indentityHashCode()的返回值与该类是否重写了hashcode()方法无关,只有当两个对象相同时,它们的值才会相同。

建议String字符串用StringBuiler创建。

StringBuilder str = new StringBuilder("Hello "); 
         System.out.println(str); 
         System.out.println(System.identityHashCode(str)); 
         str.append("Java"); 
         System.out.println(str); 
         System.out.println(System.identityHashCode(str)); 
         str.append(", crazyit.org"); 
         System.out.println(str);

System.out.println(System.identityHashCode(str));

输出结果:

Hello 
2046136590 
Hello Java 
2046136590 
Hello Java, crazyit.org

2046136590

复合赋值运算的陷阱:

short sValue = 5;

sValue = sValue - 2;

编译通不过。因为sValue-2表达式的类型将自动提升为int类型,所以程序将一个int类型的值赋给short类型时导致编译错误。

但是上述代码修改为

short sValue = 5;

sValue -= 2;

则不会编译错误。

复合赋值运算符含有自动强制类型转换。

上述代码即为:sValue = (short) sValue - 2;

存在的问题是:可能在强制转换过程中。存在高位截去,造成数据的损失。

String 类型的+=运算符左边的变量只能是String类型,而不可能是String的父类型(如:Object 或者 CharSequence)

时间: 2024-12-10 01:15:33

java之表达式陷阱的相关文章

Java的λ表达式(1)

λ表达式的基本用途 回调与Java8的λ表达式 说明了Java8的λ表达式的基本用途:完成了回调的原意--代码的参数化. 回调:可以简单地说,如果你的方法需要override底层或JDK的某个类的方法,而且你从来没有自己调用过该方法,则该方法(有时候,也指被改写的方法)就是回调.例如 Applet定义的init().start().stop()和destroy(): 图形绘制方法paint(Graphics).update(Graphics)和重载的repaint(): java.lang.Ru

Java Lambda表达式入门[转]

原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示例程序 Examples.zip .原文日期: 2014年4月16日 翻译日期: 2014年4月27日翻译人员: 铁锚简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要

Java Web表达式注入

原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为Jenkins的服务,可以在没有password的情况下受到攻击.而攻击方法比较有趣,Jenkins提供了一个Script Console功能,可以执行Groovy 脚本语言.下面我们来看下维基百科对于这个脚本语言的解释:  Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似P

Java Lambda表达式入门

原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 原文日期: 2014年4月26日 翻译日期: 2014年4月27日 翻译人员: 铁锚 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.) Lambda表

Java基础知识陷阱系列

Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四) Java基础知识陷阱(五) Java基础知识陷阱(六) Java基础知识陷阱(七) Java基础知识陷阱(八)

Java之四 表达式和流程控制

q    运算符和表达式的概念 q    运算符总结 q    运算符和表达式的示例 q    布尔运算 运算符和表达式的概念 运算符表示对操作数所进行的运算. 按操作数的数目来分,可分为如下3类: 一元运算符 (如 ++,--) 二元运算符 (如 +,-,*,/) 三元运算符 (如 ?:) 按照运算符功能来分,基本的运算符主要分为下面几类: 算术运算符 (+,-,*,/,%,++,--) 关系运算符 (>,<,>=,<=,==,!=) 布尔逻辑运算符 (!,&&,

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

Java Lambda表达式forEach无法跳出循环的解决思路

Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导致的,看下面的例子: public static void main(String[] args) { List<String> list = Lists.newArrayList(); list.add("a"); list.add("b"); list.

Java Web-EL表达式 in JSP

Java Web-EL表达式 in JSP 概念 EL(Expression Language)是一种表达式语言,可以替换和简化JSP页面上JAVA代码的书写 语法 ${<在这里写表达式>} 一般只用来写表达式,不写太过于复杂的东西,业务相关的由JavaBean负责 表达式的结果会作为HTML的资源进行直接展示 作用 运算 支持的运算符: 算术运算符:+-*/(也可以用div表示)%(也可以用mod表示) 比较运算符> < >= <= == != 逻辑运算符:&