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. HDU 2509

    与HDU 1907一样... #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...

  2. org.apache.hadoop.hbase.TableNotDisabledException 解决方法

    Exception in thread "main" org.apache.hadoop.hbase.TableNotDisabledException: org.apache.h ...

  3. HW5.3

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. cocos2d-x触摸事件优先级的探究与实践

    如何让自定义Layer触发触摸事件? bool LayerXXX::init() { this->setTouchEnabled(true); CCTouchDispatcher* td = C ...

  5. CentOS开发环境LAMP搭建

    CentOS开发环境搭建 -------------------------------------------------------------------------准备工作---------- ...

  6. 详解QUiLoader 动态加载.ui文件

    http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...

  7. Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)

    1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...

  8. php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库

    1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo     mysql扩展库与mysql数据库 ...

  9. dateTimePicker日期时间插件-----限定节假日调休的可选择性

    需求:在项目中需要一款这样的日期插件,可以选择年月日,时分秒,对法定节假日不能选择,因法定节假日进行的调休可以选择: 现在使用的比较多的日期插件比如:Wdatepicker,jqueryUI的date ...

  10. bit,byte,char,string区别与基本类型认识

    bit.byte.位.字节.汉字的关系 1 bit     = 1  二进制数据        1 byte  = 8  bit        1 字母 = 1  byte = 8 bit       ...