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)

 
 

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

  1. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  2. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

  3. Java Web表达式注入

    原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为 ...

  4. 利用Java实现表达式二叉树

    (*^-^*) 什么是二叉树,这里不再介绍,可以自行百度:二叉树.在这里利用java实现“表达式二叉树”. 表达式二叉树的定义 第一步先要搞懂表达式二叉树是个什么东东?举个栗子,表达式:(a+b×(c ...

  5. Java Lambda表达式入门[转]

    原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...

  6. ref:一种新的攻击方法——Java Web表达式注入

    ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...

  7. Java基础知识陷阱系列

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

  8. Java Lambda表达式教程与示例

    Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...

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

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

随机推荐

  1. ACM编程技巧--常用字符操作函数

    字符串与基本数据类型的转换 int sscanf(buff,"%d%d",&a,&b); //返回值是参数个数 int sprintf(buff,"%d% ...

  2. windows下virtualenv使用报错

    virtualenv为python提供了一个独立的虚拟环境,使各种python依赖库的安装相互独立.在家里ubuntu上安装一切正常,但在公司的win7上安装总是报以下错误: "D:\Pro ...

  3. redis命令之lrange

    LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...

  4. 经典 Linux & VIM 教程

    简明 Vim 练级攻略: http://coolshell.cn/articles/5426.html VIM快捷键: http://coolshell.cn/wp-content/uploads/2 ...

  5. SPOJ4206Fast Maximum Matching(hopcroft-karp)

    题目请戳这里 题目大意:裸的二分匹配. 题目分析:数据比较强,用来测模版的.这题用hungry跑着会比较吃力,所以用hopcroft-karp算法.这个算法较hungry高效是因为每次bfs找到一个增 ...

  6. mac下apache启动关闭操作

    1.一般的命令如下: 2.但是这种方法在mac上有的时候不生效 3.根据上面的提示使用下面的方法,可以生效,mac上很多应用都可以采用这种方式启动.关闭应用 sudo launchctl load / ...

  7. vc关于文件拷贝

    单个文件的拷贝 system  针对单个文件 CopyFile  针对单个文件 /** @file_extension egg: .txt .png **/ void CopyFileToDir(CS ...

  8. IOS开发之TableView替换默认的checkmark为自定义图像

    直接上代码: On cellForRowAtIndexPath: UIButton*button =[UIButton buttonWithType:UIButtonTypeCustom];CGRec ...

  9. <Android>从窗口泄漏谈android:configChanges属性

    今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志.大致的意思就是android.view.windowleaked--窗口泄漏.我在网上查了资 ...

  10. [Javascript] Fetch API

    fetch() does the same thing as XHR, but fetch return a promise. fetch('password.txt', { 'method': 'P ...