前面介绍了java的8种基本数据类型,包括boolean, byte, char, short,  int, long, float, double。同时,java也提供了这些类型的封装类,分别为Boolean, Byte, Character, Short, Integer, Long, Float, Double。这些封装类被放在了java.lang包下。

  

  这是数据在内存中的存放情况,局部变量、封装类的引用会存放在栈内存中,成员变量、引用类型的实例(值)会存放在堆内存中。

1、为什么需要基本类型的封装类?

  通过查看资料及个人分析,封装类与基本类型的区别及优势主要可归结为以下4点:

  1)int是面向机器底层的数值类型,是Primitive类型的数据类型,一般只用在数值计算中,而Integer是int的Warpper类,是面向对象的即OOP的对象类型,是用在Java的其它要使用对象的地方,比如Map的Key与Value,List与Set的Element若要保存数值信息都要把int包装成Integer对象使用。int 一般做为数值参数就够了,integer 一般做类型转换的时候用的较多。

  2)基本数据类型都有默认值,无法表达空的情况。Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

  3)int 是基本类型,Integer是引用类型。封装类需要涉及到对象的实例化和回收,效率相比基本数据类型要低。封装类实现了很多对基本数据类型的操作的工具方法及整数的最大值最小值常量等,易用性要比基本数据类型要好。

  4)存储位置不同,封装类的对象的引用放在栈里面,对象的实例放在堆里面。而基本数据类型是成员变量的时候放在堆里面,是局部变量的时候放在栈里面(方法栈)。

2、java的自动装箱、拆箱

  从Java 5开始,引入了自动装箱/拆箱机制,使得基本数据类型和其封装类间实现方便快捷的转换

  装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。

  如:Integer a = 100;  //这是自动装箱  (编译器调用的是static Integer的valueOf(int i)方法)

  拆箱:和装箱相反,将引用类型的对象简化成值类型的数据

  如:int     b = new Integer(100); //这是自动拆箱(编译器调用的是Integer intValue()方法)

  装箱机制存在一个小陷阱需要注意一下

 public static void main(String arg[]){
Integer i1 = 123;
Integer i2 = 123;
System.out.println("i1 equal i2 : " + (i1.equals(i2)));
System.out.println("i1 == i2 : " + (i1 == i2));
}

  在执行上述代码之后,我们会发现以下神奇结果:

i1 equal i2 : true
i1 == i2 : true

  查看源码很快发现问题所在,源码如下(其中low=-128,high=127)

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

  原来是java在自动装箱时将值在-128~127之间的数值放在了cache中,通过自动装箱的引用都指向这个固定的cache地址,而不是分配新的存储空间(这种现象在Byte、Short、Integer、Long、Character这些封装类中均是这样,有兴趣的看看源码就可知道)。

  相信小伙伴们在看了上面的代码之后都开始怀疑人生了,觉得自己之前对“==”和“equal”的理解是不是错了,接下来给出正常逻辑结果的代码

 public static void main(String arg[]){
Integer i1 = 128;
Integer i2 = 128;
System.out.println("i1==i2 : " + (i1 == i2));
System.out.println("i1 equal i2 : " + i1.equals(i2)); Integer i3 = new Integer(1);
Integer i4 = new Integer(1);
System.out.println("i3==i4 : " + (i3 == i4));
System.out.println("i3 equal i4 : " + i3.equals(i4));
}

  运行结果

i1==i2 : false
i1 equal i2 : true
i3==i4 : false
i3 equal i4 : true

  哈哈,世界还是美好的,相信现在心情美丽多了。

  从上面代码及运行结果可以看出,当自动装箱的值不在-128~127之间时,java虚拟机会为该对象分配新的存储空间,即new一个新的对象。

  

3、封装类的方法

  1)构造方法:每个封装类都会提供一个带基本数据类型的构造方法

    如Boolean(boolean value)、Byte(byte value)、Character(char value)等,用于将对应的基本数据类型手动分装。

  2)拆装方法

    如booleanValue()、byteValue()、charValue等,将引用类型转为对应的基本数据类型。

    如parseFloat(String s)、parseByte(String s)等,将String类型转为对应的基本数据类型,parseFloat("3.14")转化为float类型。

  3)封装方法(分为两类)

    如valueOf(boolean value)、valueOf(byte value)、valueOf(char value)等,将对基本数据类型转换为对应的封装类。

    如valueOf(String s) 将String类型转为对应的封装类型,Float.valueOf("3.14")会将字符串“3.14”转化为Float类型。

  4)字符串化方法

    如toString()、toString(Float value)等,将封装类型转化为Stirng类型。

  5)比较方法

    如compareTo()用于比较两个值大小,equals()比较两个值是否相等。

  上面是基本数据类型封装类的一些公共方法,也是在日常工作中经常用到的方法。各个封装类还有自己独有的一些方法,有时间可以自己研究研究。

    

  

java基础知识(一)数据类型(下)的更多相关文章

  1. JAVA基础知识之数据类型

    JAVA的数据类型知识点主要包括基本数据类型,包装类,字符串类(String,StringBuffer, StringBuilder区别和用法),数组,数据类型转换等等,暂时只想到这么多,后面会再补充 ...

  2. (6)java基础知识-基本数据类型、数据类型转换

    一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte:  1字节 取值范围 -128~127 short: 2字节    取值范围 -32768~32767 int:     4字节 取 ...

  3. Java基础知识——windows系统下安装JDK

    (作者声明:文章引用了其他作者的文章,但因为笔记内容时间过久,已经忘记从哪里摘录下来的了.若无意间侵犯到原作者您的权利,对不起!您可以联系我,我这边会马上进行修改,谢谢!) 1.首先我们需要下载jav ...

  4. 01-Java基础知识:数据类型与变量、标识符、运算符、表达式

    Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2).  int ( ...

  5. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  6. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  7. java 基础知识三 java变量

    java  基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...

  8. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  9. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  10. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

随机推荐

  1. 嵌入式Linux驱动学习之路(十六)输入子系统

    以前写的一些输入设备的驱动都是采用字符设备处理的.问题由此而来,Linux开源社区的大神们看到了这大量输入设备如此分散不堪,有木有可以实现一种机制,可以对分散的.不同类别的输入设备进行统一的驱动,所以 ...

  2. python3循环语句while

    Python的循环语句有for和while语句,这里讲while语句. Python中while语句的一般形式: while 条件判断 : 语句 需要注意冒号和缩进.另外,注意Python中没有do. ...

  3. Intellij Idea中定制getter setter的模板

    Alt + Ins, 调出快捷菜单后选择 Getter and Setter, 在对话框里, 选择对应的template, 右侧点开后, 可以新建自己的模板并编辑 将getter和setter都生成到 ...

  4. 微信小程序之触控事件(四)

    [未经作者本人同意,请勿以任何形式转载] >>>什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执 ...

  5. SQLite应用之实例代码

    目录 一.获取表的Schema信息 二.常规数据插入 三.高效的批量数据插入 四.数据查询 一.获取表的Schema信息    1). 动态创建表.    2). 根据sqlite3提供的API,获取 ...

  6. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  7. ajax 多个表单值问题,表单序列化加其它表单值

    $.ajax({ type: "post", url: "{:u('cart/totalByCard')}?t="+Math.random(9999), dat ...

  8. NGUI 滑动特效之中间放大滚动

    效果图如下: 其实很简单,在NGUI原有的滑动组件的基础上处理一下比例系数就好,每个块的位置是固定的,移动的是Panel. 所以呢用Panel的位置与块的位置做差在比几个块不就成了比例系数了么..自然 ...

  9. 狼人杀BETA阶段计划简介

    狼人杀beta阶段任务与目标 简介 一.前言 狼人杀alpha阶段终于在组团刷夜中结束了,我们取得了一些成绩,同时也暴露了团队的一些问题.但不管怎样,有了在alpha版本中收获的经验,我们将在beta ...

  10. Codeforces Round #342 (Div. 2) C. K-special Tables(想法题)

    传送门 Description People do many crazy things to stand out in a crowd. Some of them dance, some learn ...