首页 > 编程语言 >Java中为什么要使用Integer呢?阐述Integer与int的区别

Java中为什么要使用Integer呢?阐述Integer与int的区别

时间:2023-05-05 15:36:34浏览次数:38  
标签:缓存 Java int 创建 cache high Integer

(1)设计Integer封装类型的原因是:

  Java本身就是一个面向对象的编程语言,一切操作都是以对象作为基础,如像ArrayList,HashSet,Hashtable,HashMap等集合类中存储的元素,只支持存储Object类型,又如同泛型的设计,统统表现出了Java对于封装类型的重用,而对于int,byte,short,float,char,long,double这种基本数据类型其实用的很少,且这类型的数据是无法通过集合来进行存储的。除此之外,在Java中,几乎处处都是以面向对象的思想来进行方法设计的。

(2)Integer与int的主要区别:

  ① Integer是一个引用类型,也是常说的包装类,而int是一个基本数据类型,二者可以通过装箱和拆箱来进行相互转化。

  ② Integer的初始值是null(因为它是一个实例对象),而int的初始值为0,Integer需要判空处理。

  ③ Integer是存储在堆内存中的(因为它是一个实例对象),而int类型是直接存储在栈空间的。

  ④ Integer是一个对象类型,它类的内部封装了很多的方法和属性,我们在使用的时候会更加灵活和充满选择。

  ⑤ Integer缓存机制:为了节省内存空间和提高性能,Integer类在内部通过使用相同对象引用实现缓存和重用,Integer类默认在-128~127之间,,这种机制仅在自动装箱时候有用,在使用构造器创建Integer对象的时候无用。

  代码演示:

 

@Test
public void testIntegerCache(){
    Integer c = 123; // 中间值
    Integer d = 123;
    Integer x = 129; // 超出范围     Integer y = 129;     
    // 判断 -123 == -123 ? true : false
    System.out.println(c == d);
    // 判断 129 == 129 ? true : false
    System.out.println(x == y);
} 
输出:true
   false

 

对于以上出现的现象简单的解释就是,对于在规定范围内的,是可以进行缓存的,即c创建完123后,当创建d的时候发现同样也是123,且存在于cache数组中,则就不再重复创建,两个引用的地址是相同的。

而对于x和y正好相反,当创建完x后,再创建y的时候,发现这个数值并不在这个缓冲数组cache范围内,所以会重新创建新Integer对象y,故x和y是不同的,两个引用的地址是不同的。

接下来看一下这个设计原理吧

// 私有静态类IntegerCache内的部分代码块和方法        
static final int low = -128; // Integer缓存数组的下界 static final int high;  // Integer缓存数组的上界,可以进行属性设置 static final Integer cache[]; // Integer缓存数组,是否创建一个新的Integer对象就看所创建的Integer的数值是否在这个缓冲数组的范围内了 static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); // 获取到设置的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; }
// 该方法会在创建完Integer i = value后执行,从而决定是给你缓存内的Integer对象还是新给你创建一个Integer对象
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// 重写的equals方法和hashcode方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
@Override
public int hashCode() {
return Integer.hashCode(value);
}

 

 

 

标签:缓存,Java,int,创建,cache,high,Integer
From: https://www.cnblogs.com/fxy0715/p/17374095.html

相关文章

  • 【Java】对pdf表格中的字符串进行换行处理
    需求:将数据库查出来的字符串数组放入pdf的表格中,并且每个字符串单独占一行解决:1、尝试在字符串后面加上/r或/n无效:只会在两个字符串之间加上一个空格 2、尝试在字符串后面加上/br无效,无法识别/br,只会识别成/b与字符串r 3、尝试使用第三方库的方法(成功)三方库为:com.i......
  • JavaScript 图片的上传前预览
    实例一: 实现要点● 对于 Chrome、Firefox、IE10 使用 FileReader 来实现。● 对于 IE6~9 使用滤镜 filter:progid:DXImageTransform.Microsoft.AlphaImageLoader 来实现。<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=......
  • java 根据URL 下载文件
    1、废话不多说,如下图所示@ApiOperation("文件下载")@GetMapping("/download")publicvoiddownload(@RequestParam("fileUrl")StringfileUrl,@RequestParam("fileName")StringfileName,HttpServletResponseresponse)throws......
  • 01_java面向对象编程语言的思考
    java的跨平台在各个操作平台上,有一层JVM(java虚拟机),这是支撑java程序能够运行的基础。java源代码→(编译)→java字节码→(运行)→java虚拟机jdk:java开发工具包jre:java运行环境jvm:java虚拟机api:应用程序接口程序目录主要结构lib目录:存放Java的类库文件bin:java编译器,解释器工具......
  • JAVA笔记2
    Java语言基础包括以下内容:数据类型:Java的数据类型分为基本数据类型和引用数据类型两种。其中,基本数据类型包括整型、浮点型、字符型和布尔型,而引用数据类型则包括类、接口、数组等。运算符:Java支持多种运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符等。这些运算......
  • 6-4 【CPP0026】以点类Point及平面图形类Plane为基础设计三角形类Triangle
    6-4【CPP0026】以点类Point及平面图形类Plane为基础设计三角形类Triangle分数 10作者 C++多态编程单位 石家庄铁道大学以平面图形类Plane为基类公有派生三角形类Triangle,main(void)函数完成对其的测试。Point类结构说明: Point类的数据成员包括:①私有......
  • java:找不到符号 符号:变量:log
    原文链接:https://blog.csdn.net/zhanghaoninhao/article/details/129180810问题:java:找不到符号 符号:变量:log环境:springbootidea解决方法:在idea中,点击file-Settings,打开配置页面,如图红框位置,输入:-Djps.track.ap.dependencies=false ......
  • ETF2100/5900 Introductory Econometrics
    ETF2100/5900IntroductoryEconometricsAssignment2—ACaseStudyontheBirth-weightofBabyImportantnotes:1.Thisisanindividualassignment.Thisassignmentisworth20%ofthisunit’stotalmark.Markswillbedeductedforlatesubmissiononthefoll......
  • vue-print 实现打印功能
    一、安装1.Vue2npminstallvue-print-nb--saveimportPrintfrom'vue-print-nb'//GlobalinstructionVue.use(Print);//or//Localinstructionimportprintfrom'vue-print-nb'directives:{print}2.Vue3npminstallvue-pri......
  • Java——lambda表达式
    Javalambda表达式是Java8中引入的一种新特性,它可以用来简化代码并提高程序员的生产力。Lambda表达式本质上就是一个匿名函数,它没有名称、修饰符和返回类型。在使用lambda时需要注意以下几点:Lambda表达式由箭头(->)分隔成两部分:左侧为参数列表,右侧为所需执行的功能。如果只有一......