基本数据类型与字符串的连接

在Java中,+不仅可作为加法运算符使用,还可作为字符串连接运算符使用。

当把任何基本数据类型的值与字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型。

public classPrimitiveAndString

{public static voidmain(String[] args)

{//下面的语句输出 7Hello!

System.out.println(3 + 4 + "Hello!");//下面的语句输出 Hello!34

System.out.println("Hello!" + 3 + 4);//下面的语句输出 Hello!a7

System.out.println("Hello!" + 'a' + 7);//下面的语句输出 104Hello!

System.out.println('a' + 7 + "Hello!");

}

}

上面程序中第一个”3 + 4 + "Hello!"“的表达式,这个表达式先执行”3 + 4“运算,这是执行两个整数之间的加法,得到7,然后进行”7 + "Hello!"“的运算,此时会把7当成字符串进行处理,从而得到7Hello!。

第二个,对于”"Hello!" + 3 + 4“表达式,先进行”"Hello!" + 3“运算,得到一个Hello!3字符串,再和4进行连接运算,4也被转换成字符串进行处理,最后得到Hello!34。

第三个表达式”"Hello!" + 'a' + 7“同第二个类似。

对于最后一个表达式”'a' + 7 + "Hello!"“,先进行”'a' + 7“加法运算,其中'a'自动提升到int类型,编程a对应的ASCⅡ值:97,从”97+7“将得到104,然后进行”104 + "Hello!"“运算,104会自动转换成字符串,将变成两个字符串的连接运算,从而得到104Hello!。

Integer自动装箱的缓存机制

(2016年腾讯实习生招聘笔试题,扩展)下面这段java代码的输出结果是?(不考虑java 1.5之前的老版本,因为老版本不支持自动装箱)

public classIntegerTest {public static voidmain(String[] args) {

Integer i1= 127; //autoboxing

Integer i2 = 127; //autoboxing

System.out.println(i1.equals(i2)); //true

System.out.println(i1 == i2); //true

Integer i3= 128; //autoboxing

Integer i4 = 128; //autoboxing

System.out.println(i3.equals(i4)); //true

System.out.println(i3 == i4); //false

Integer i5= new Integer(127);

Integer i6= new Integer(127);

System.out.println(i5.equals(i6));//true

System.out.println(i5 == i6); //false

Integer i7= 127; //autoboxing

Integer i8 = new Integer(127);

System.out.println(i7.equals(i8));//true

System.out.println(i7 == i8); //false

int i = 127;

System.out.println(i7.equals(i));//true

System.out.println(i8.equals(i)); //true

System.out.println(i7 == i); //true

System.out.println(i8 == i); //true

}

}

分析:本题的考察点在于Integer类对于[-128 , 127]之间的整数自动装箱缓存的机制,查看Java系统中java.lang.Integer类的源代码,其中有一个叫做IntegerCache的静态内部类如下:

/*** Cache to support the object identity semantics of autoboxing for values between

* -128 and 127 (inclusive) as required by JLS.

*

* The cache is initialized on first usage. The size of the cache

* may be controlled by the {@code-XX:AutoBoxCacheMax=} option.

* During VM initialization, java.lang.Integer.IntegerCache.high property

* may be set and saved in the private system properties in the

* sun.misc.VM class.*/

private static classIntegerCache {static final int low = -128;static final inthigh;static finalInteger cache[];static{//high value may be configured by property

int h = 127;

String integerCacheHighPropValue=sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try{int i =parseInt(integerCacheHighPropValue);

i= Math.max(i, 127);//Maximum array size is Integer.MAX_VALUE

h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

}catch( NumberFormatException nfe) {//If the property cannot be parsed into an int, ignore it.

}

}

high=h;

cache= new Integer[(high - low) + 1];int j =low;for(int k = 0; k < cache.length; k++)

cache[k]= new Integer(j++);//range [-128, 127] must be interned (JLS7 5.1.7)

assert IntegerCache.high >= 127;

}privateIntegerCache() {}

}

从上面的代码可以看出,系统已经把[-128 , 127]之间的256个整数自动装箱成Integer实例,并放入了cache数组中缓存起来。

当把[-128 , 127]之间的同一个整数自动装箱成Integer实例时,永远都是引用cache数组的同一个元素,(i1 == i2)结果为true;

当把一个不在[-128 , 127]范围内的整数自动装箱成Integer实例时,系统总是重新new一个Integer实例,开辟新的内存空间,因此(i3 == i4)、(i5 == i6)、以及(i7 == i8)的结果均为false;

Integer和int进行比较时,Integer会自动拆箱成int类型变成值比较,因此(i7 == i)和(i8 == i)的结果均为true;

Integer类重写了从Object类继承而来的equals方法进行值比较,所以上述equals的结果均为true。

java ==陷阱_Java小陷阱相关推荐

  1. java 骗局_Java有陷阱,用时需谨慎——慎用入参做返回值

    正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: @Named public class AServ ...

  2. java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类

    练习:使用java描述一个车类与一个修车厂类, 车具备的公共属性: 名字. 颜色. 轮子数. 车具备的公共 行为是跑的功能,但是跑之前必须要先检查轮子 是否够4个,如果不够4个轮子送去修车厂修理.修理 ...

  3. 圆周率java程序_Java小程序计算圆周率代码

    下面我们来介绍两种Java编程中实现计算圆周率的方法. 方法一:割圆法 计算公式为: π≈3*2^n*y_n 其中,n代表割圆次数,y_n代表圆中内嵌正6*n边形的边长 package 计算π的近似值 ...

  4. java 衣服_JAVA小程序-----买衣服

    import java.util.Scanner; //引用扫描器 public class TestDemo1 { public static void main(String [] args){ ...

  5. Java降落伞_Java 小例子:轮询淘汰 | 学步园

    一架飞机快要掉了,上面有 20 个人,但是只有 3 包降落伞.于是 20 个人凑成一圈,每数到第 7 个,就将他踢下去.--最后三包降落伞将落在哪几个人手里? 下面是示例代码.编写过程的录像在这里下载 ...

  6. java 陷阱_Java基础知识陷阱

    Java浮点数精确运算陷阱 System.out.println(2.0 - 1.1); 以上结果为0.899999999999999...; 如果需要精确运算,需要使用BigDecimal类进行运算 ...

  7. 时区 java 巴黎_java中的时区陷阱 - iasuna

    今天碰到一个很奇怪的问题,就是在调用SimpleDateFormat类的parse方法,得到了意外的结果. public static void main(String[] args) throws ...

  8. Java自动拆箱陷阱。 谨防!

    您认为以下代码段会显示什么? Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o); 是! 它将打印: 1 ...

  9. Java Comparable接口的陷阱

    Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法. 自然顺序对标量和其他非常简单的对象有意义,但是当我们使用面向业务的领域对象时,自然顺序就变得更加复杂. 从业务经理的角 ...

最新文章

  1. C语言网络编程:accept函数详解
  2. poj1182(加权值的并查集)
  3. C++运算符重载(10)
  4. WPF Grid动态显示或隐藏一列的一种方法
  5. 深入理解 ValueTask
  6. linux下解包bin二进制文件_linux下如何使用docker二进制文件安装_docker离线安装
  7. mini2440-Openwrt启动信息
  8. 24暴力枚举四平方和
  9. 运放虚短虚断的成立条件
  10. 漏洞复现之(MS17-010)
  11. [有源滤波器]Sallen-key开关电容电路(二阶低通滤波器)
  12. 职场中哪些职场很重要?
  13. 浏览器突然不能上网,DNS问题
  14. 0017-用目标图像对源图像进行直方图匹配
  15. 吉米_王:MySQL开启log_bin日志,误删数据库时你最后的救命稻草
  16. Android安全:禁止APP录屏和截屏
  17. mos管的rc吸收电路计算_正激式RC吸收电路计算
  18. 【Java】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
  19. android菜单_Android菜单简介
  20. python爬虫下载王者荣耀图片

热门文章

  1. c语言如何运行txt文件,如何使用EOF在C中运行文本文件?
  2. nparray和tensor的相互转化
  3. 代数学笔记4: Galois基本定理
  4. FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验
  5. 单电源运算放大器全波整流电路_精密半波、全波整流电路结构原理图解
  6. session和cookie_JSP学习
  7. python求解微分方程_python能解微分方程吗
  8. linux既能归档也能压缩的命令,Linux压缩及归档
  9. linux zabbix使用教程,《Zabbix安装部署》-Centos7
  10. 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...