@Test
public void test() {
Integer i3 =128;
Integer i4=128;
boolean integerGT127=i3==i4;
//false
System.out.println("Integer 128==128"+integerGT127);
Integer i1 =127;
Integer i2=127;
boolean integerLt127=i1==i2;
      //true
System.out.println("Integer 127==127"+integerLt127);
Integer i5 = 5001;
boolean unBoxingInteger=i5 > 500 && i5 < 1000;
System.out.println("Integer unbox "+integerLt127);
Integer i6=500,i7=1000;
boolean unBoxingInteger2=i5.compareTo(i6)>0&&i5.compareTo(i7)<0;
System.out.println("Integer compare "+integerLt127);
//装箱 将 10(int)转换为了 Integer
Integer i9=10;
//拆箱 将i9(Integer)转换为了int
int i10=i9;

}

输出结果:

1 .Integer 128==128false
2 .Integer 127==127true
3 .Integer unbox true
4 .Integer compare true

为什么会出现128==128的结果?输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。IntegerCache 下面这段代码是Integer的valueOf方法的具体实现:

private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[]; static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
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;
} private IntegerCache() {}
}

在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

Integer.valueOf(10)

 public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

Integer.valueOf(10);
Double.valueOf(23.00);
Boolean.valueOf(true);
Boolean b1=true,b2=true;
//true Boolean.valueOf(true);
// final修饰的对象只能指向唯一一个对象,不可以再将它指向其他对象,而static final修饰的对象则可以使一个常量真正做到不被修改
System.out.println(b1==b2);
// true Boolean.valueOf(true);
System.out.println(b1.equals(b2));
Double d1=20.00,d2=20.00;
// false Double.valueOf
System.out.println(d1==d2);
//true
System.out.println(d1.equals(d2));
Boolean.valueOf(true);返回了一个static final 的对象 ,final修饰的对象只能指向唯一一个对象,不可以再将它指向其他对象,而static final修饰的对象则可以使一个常量真正做到不被修改
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
} /**
* The {@code Boolean} object corresponding to the primitive
* value {@code true}.
*/
public static final Boolean TRUE = new Boolean(true); /**
* The {@code Boolean} object corresponding to the primitive
* value {@code false}.
*/
public static final Boolean FALSE = new Boolean(false);
Double.valueOf(23.00);new一个新的对象
    public static Double valueOf(double d) {
return new Double(d);
}

Java中封装类型.valueOf()的更多相关文章

  1. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  2. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  3. Java进阶(二十三)java中long类型转换为int类型

    java中long类型转换为int类型 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参 ...

  4. java中封装,继承,多态,接口学习总结

    ### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...

  5. Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...

  6. JAVA中值类型和引用类型的不同(面试常考)

    转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...

  7. Java中String类型细节

    Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...

  8. Java中String类型详解

    这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

  9. - Java中boolean类型占用多少个字节 MD

    目录 目录 Java中boolean类型占用多少个字节 1个bit(1位) 1个Byte(1字节,8位) 4个Byte(4字节,32位) 分析 官方文档中的描述 Markdown版本笔记 我的GitH ...

随机推荐

  1. vue中$refs、$slot、$nextTick相关的语法

    Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 1.$data和$el var data = { a: 1 } var vm = new Vue({ el ...

  2. numpy处理时间序列

    1. 字符串转成numpy.datetime64格式 import numpy as np #将字符串转换成numpy格式时间 #注意个位前补0,如1月写成01 nd=np.datetime64('2 ...

  3. unity开发多语言版本

    1.文字部分 ①.文字提取参考 http://www.xuanyusong.com/archives/2987: ②.把提取出来的文字放到excel总转换成繁体等版本: ③.把excel转换成txt文 ...

  4. VS调试SQL Server存储过程

    1.打开VS,视图-->SQL Server对象资源管理器.(我用的是VS2012) 2.添加链接,连接到数据库. 3.选择要调试的存储过程,右键,选择调试过程或者执行过程. 4.填写存储过程所 ...

  5. java学习之成员内部类

    //成员内部类:直接在类中定义 /*成员内部类的通常用法: * 通常是提供给外部类使用不进行内部类的实例化 * 因此一般把他设为私有的类用private限定 * * */ /*Demo*/ class ...

  6. IOT

    文档地址:http://www.owasp.org.cn/owasp-project/owasp-things?searchterm=iot 今天面试,面试官问到iot

  7. nginx解决跨域

    location ~* \.(eot|ttf|woff|woff2|svg)$ { add_header Access-Control-Allow-Origin *; add_header Acces ...

  8. 多线程之CEvent

    最近工作中要维护一个windows模块,用到了mfc中的CEvent类.这算是很久很久以前的老朋友了吧,估计和我超过10年没见过面了,不过工作就是工作,技术上来不得半点含糊,所以还是重新认识一下这位老 ...

  9. spring mvc get请求中文乱码问题

    使用Spring MVC进行get请求时发现get请求带上中文参数,后台收到的是乱码,即使加了encoding filter也没用. 原因是,encoding filter 是针对post请求的,to ...

  10. maven打包并上传到nexus3私服

    之前搭了个maven私服,接下来则要充分利用这个私服的优势上传自己的jar包了. 我们先在nexus上创建一个用来上传jar包的角色,并通过此角色创建若干帐号用来给开发者上传包.如图是我自己的配置: ...