java基本类型和包装类型的区别

news/2024/7/6 13:39:08 标签: java

本文转载自博客作者“十一月的天蝎兽”,原文链接https://blog.csdn.net/cynthia9023/article/details/17413375

Java的类型分为两部分,一个是基本类型(primitive),如int、double等八种基本数据类型;
另一个是引用类型(reference type),如String、List等。而每一个基本类型又各自对应了一个引用类型,称为包装类型(或装箱类型,boxed primitive)。
基本类型与包装类型的主要区别在于以下三个方面:

1、基本类型只有值,而包装类型则具有与它们的值不同的同一性(identity)。这个同一性是指,两个引用是否指向同一个对象,如果指向同一个对象,则说明具有同一性。(与此类似的还有等同性。)

来看一段代码:

Integer g = new Integer(0); 
 Integer h = new Integer(0);
System.out.println(g==h)

以上代码,两个对象虽然具有相同的值,但其引用指向的对象却不相同,因此会输出false。
再来看一段代码:

Integer a = 0;  
Integer b = 0;    
System.out.println(a==b);

这个会输出什么呢?别急,再看一段代码:

Integer d = 128;  
Integer f = 128;  
System.out.println(f==d);

如果你没有运行这两段代码,就知道答案,那么相信你对常量池有一定的了解了。
其实,当我们直接给一个Integer赋予一个int值的时候,它会调用一个valueOf()的方法。所以,如上代码就相当于:

Integer a = Integer.valueOf(0);

Integer的常量池是由-128至127组成。当我们给一个Integer赋的值在这个范围之类时就直接会从缓存返回一个相同的引用,所以a == b会输出true。而超过这个范围时,就会重新new一个对象。因此,f==d就会输出一个false。
现在我们再来看一段代码:

int e = 128;  
Integer d = 128;  
System.out.println(e==d);

这个会输出什么呢?答案是true.
因为当在一项操作中混合使用基本类型与包装类型时,包装类型会自动拆箱。因此,e和d的比较其实就是int值的比较了。

2、基本类型只有功能完备的值,而包装类型除了其对应的基本类型所有的功能之外,还有一个非功能值:null。

现在来看一段简单的代码:

 static Integer i; 
public static void main(String[] args) {  
  if(i == 128){   
  System.out.println("Unbelieveable~");  
  }
 }

你认为会输出什么呢?不知道?自己运行一下~~~~
其实这段代码并不能正确的运行,因为它会报一个NullPointException异常,为什么?因为在定义i的时候,它是Integer类的一个引用,而i没有初始化,就像所有对象引用一样,如果没有初始化那么就赋一个null值。既然现在i是一个null,那么上面已经提到,当混合使用基本类型与包装类型时,包装类会自动拆箱。现在i都没有指向任何对象,因此拆箱的时候就会报一个NullPointException异常。

3、基本类型通常比包装类型更节省时间与空间。

看如下代码:

Long sum = 0L;    
for(long i = 0;i<Integer.MAX_VALUE;i++)
{
   sum +=i;
  }
  System.out.println(sum);

毫无疑问,这段代码能正常运行,但是花费的时间会比较长。因为,在声明sum变量的时候,一不小心声明为Long,而不是long。这样,在这个循环当中就会不断地装箱和拆箱,其性能也会明显的下降。如果把Long改为long,那么经过我的试验,这段代码所花费的时间将只有原来的1/5.
经过这三个比较,貌似感觉基本类型已经完胜了包装类型。但是在如下三个地方,包装类型的使用会更合理:

1、作为集合中的元素、键和值。
2、在参数化类型中。比如:你不能这样写——ArryList,你只能写ArrayList.
3、在进行反射方法的调用时。

总之,当可以选择时候,基本类型是要优先于包装类型。基本类型更加简单、更加快速。

注: 此文章只为记录开发过程中的错误,学习,如发现侵权请私信删除


http://www.niftyadmin.cn/n/1691623.html

相关文章

BREW学习笔记-IBitmap 接口(二)

IBITMAP_BltIn()说明&#xff1a;此函数可以将对应于像素矩形的数据从指定的源位图位块传输到此位图。 源中每个像素均与目标中的相应像素关联。 此函数会为每对源和目标像素执行逻辑操作&#xff0c;并将结果写入目标像素。 原型&#xff1a;int IBITMAP_BltIn (IBitmap * po,…

深度学习知识十四 yolo v2 损失函数源码(训练核心代码)解读和其实现原理、网络的输出格式

前提说明&#xff1a; 1, 关于 yolo 和 yolo v2 的详细解释请移步至如下两个链接&#xff0c;或者直接看论文&#xff08;我自己有想写 yolo 的教程&#xff0c;但思前想后下面两个链接中的文章质量实在是太好了_(:з」∠)_&#xff09; yolo: https://zhuanlan.zhihu.com/p/2…

BREW学习笔记-IBitmap 接口(三)

IBITMAP_FillRect()说明&#xff1a;此函数用于绘制指定颜色的实心矩形。 原型&#xff1a;int IBITMAP_FillRect (IBitmap * po, const AEERect *prc, NativeColor color, AEERasterOp rop ) IBITMAP_DrawHScanline()说明&#xff1a;此函数用于绘制水平线段。 原型&#xff…

什么是节点流和处理流?

本文转载自博客作者“浪漫的程序员”&#xff0c;原文链接https://blog.csdn.net/qq_40406929/article/details/84202772 按照流是否直接与特定的地方(如磁盘、内存、设备等)相连&#xff0c;分为节点流和处理流两类。 节点流&#xff1a;可以从或向一个特定的地方(节点)读写数…

python pyplot画图_matplotlib绘图——再谈axes和pyplot方法

简介在matplotlib绘图过程中&#xff0c;经常会出现axes绘图和pyplot绘图这两种方法&#xff0c;但是如果不搞清楚它们的区别&#xff0c;往往会得不到你想要的图形。所谓axes绘图是指调用axes对象(坐标轴对象)去完成绘图任务&#xff0c;而pyplot绘图就是常规的简单绘图方式。…

BREW学习笔记 - IDIB 接口(一)

IDIB说明&#xff1a;此结构用于定义 BREW 设备无关位图的格式。IDIB 是一种结构和接口。 IDIB 继承了 IBitmap 的全部成员函数&#xff0c;因此通过类型转换&#xff0c;IDIB 可用作 IBitmap。 &#xff08;IDIB_TO_IBITMAP 内联函数用于实现安全的类型转换。&#xff09; 与其…

yolo训练时的训练数据读取代码注释!代码质量很高。

1、yolo训练时的加载图像数据的主要函数就是&#xff1a;load_data_region()&#xff0c;其里面包含了很多图像预处理&#xff0c;像各种曝光度调节、图像crop等操作。具体实现如下&#xff1a; //data.c data load_data_detection(int n, char **paths, int m, int w, int h, …

python对不同图片进行分类_python数据处理 根据颜色对图片进行分类的方法

import osimport numpy as npimport skimageimport matplotlib.pyplot as pltfrom skimage import io #读取图片from skimage import exposure#调用调对比度的方法rescale_intensity、equalize_histfrom skimage.filters import gaussian#高斯from skimage import img_as_float…