java从基础知识(一)数据类型(下)

  前面介绍了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()比较两个值是否相等。

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

    

  

时间: 2025-01-05 00:02:35

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

初识Java及基础知识

java不仅仅是一种程序设计语言,他还是一个完整的平台,有一个庞大的代码库.首先你要做的,可能需要下载 jdk 包,下载和安装,自行百度. 下载完 jdk 之后,JDK目录树如下:  目录结构 描述 bin 编译器和工具 demo 演示 docs HTML格式的类库文档(解压 2sdkversion-doc.zip 之后j) include 用于编译本地方法的文件 jre Java 运行环境 lib 类库文件 src 类库源文件 java 中基本程序设计会用的基础知识:数据类型.变量.运算符.字

黑马程序员——Java集合基础知识之Collection

集合基础知识--Collection Java中集合框架由常用的Collection接口和Map接口组成,而Collection接口又有两个子接口,是List接口和Set接口,常用的集合框架由这三个类组成. List接口的功能方法 List的使用最为简单,创建集合,通过add方法添加元素,get方法获取元素,通过迭代器获取元素.List接口存放的数据无序的,添加速度快,但是查询速度慢,因为查询的时候必须遍历,每次都重头开始,效率较低.常用实现类有ArrayList,LinkedList. Lis

Java Web基础知识之Filter:过滤一切你不想看到的事情

不要相信客户端, 所以做后端的人都应该铭记的事情.因为前端传过来的数据并不总是合法和有效的,所以后端是对访问资源的最后一道保护伞.之前我们在Spring中说到过AOP编程,AOP基础知识,它就可以在执行我们的方法之前进行一些预处理和验证来保护后端的资源.不难想到她的实现方式和本篇要说的过滤器的实现原理应该是相同的,都是通过Java的动态代理实现的(自己的理解). 在Java Web的开发中,过滤器用于拦截请求,并对ServletRequest对象进行处理,我们可以想到的,它可以用来验证权限.加密

黑马程序员——Java集合基础知识之Map

Map概念 要同时存储两个元素Key和Value,他们之间有映射关系,每个键不能重复,每个键只能映射到一个值. 当数据之间存在映射关系的时候,考虑使用Map集合. Map常用方法 如果添加的键原来有值,后添加的值会覆盖前面的值,并返回之前的值.put会返回来先添加的值,后添加的值会覆盖原有的值. Map tm =new TreeMap(); tm.put (key, value);//MAP没有add tm.remove (key) ;//去除一个key和对应的value,若不存在key返回nu

什么才是java的基础知识?

近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. 我做j2ee开发已经超过十载,作为过来人,心路历程估计和大家差不多.编码的前几年,很长一段时间觉得java简单,开发实现各种功能都很轻松,代码写起来根本不费劲(主要是因为写的代码都是一些功能业务逻辑).但同时自己心里明白,自己其实没有什么水平,自己这3,4年以来学懂的东西就那么多,其他人几个月就可以

java多线程基础知识

1.ThrTest.java 继承Thread类方式 public class ThrTest extends Thread { private String name; public ThrTest() { } public ThrTest(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i

黑马程序员——java多线程基础知识1

多线程 进程是一个正在执行的程序. cpu在同时执行这些程序,其实是跳跃式的,做快速的切换,时间很短.一个进程可能存在多条路径.迅雷的多路径.每一个进行执行都有一个执行顺序,该顺序是一个执行路径,或这叫一个控制单元.每一个进程至少有一个线程,线程就是进程中的一个独立的控制单元,线程控制进程的执行.jvm启动的时候会有一个进程就叫做java,exe,该进程中至少有一个线程在控制Java程序的执行 ,而且该线程的执行代码在 主函数中.该线程称为主线程.虚拟机至少也有两个线程,一个主线程执行,另一个负

黑马程序员——Java多线程基础知识2

多线程协同 线程间的通讯:我们对资源的操作动作不同,比如说两个卡车一个拉煤一个装煤.但是他们共享了一个资源. 怎么样把这个资源拿出来?怎样把车装满?这个资源当然是一个类,他里面的组成元素就是对象!!现在我们就要有操作对象的思想了,我用对象把这车装满,现在一车装一个对象. 等待唤醒机制: 用的不是sleep是wait.flag标记,这是两人沟通的方式.其实每个标记就要做一次等待或者notify,判断wait,改值notify.线程池.notify唤醒里面的线程,按顺序唤醒.wait和notify必

Java 接口基础知识

一.Java接口基础知识 1, Java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承. 2, 与Java接口相关的设计模式: 1, 定制服务模式 设计精粒度的接口,每个Java接口代表相关的一组服务,通过继承来创建复合接口 2, 适配器模式 当每个系统之间接口不匹配时,用适配器来转换接口 3, 默认适配器模式 为接口提供简单的默认实现 4, 代理模式 为Java接口的实现类创建代理类,使用者通过代理来获得实现类的服务 5, 标识类型模

javascript 基础知识1 数据类型

首先javascript是一种具有面向对象能力的,解释型程序设计语言. js对大小写敏感,一定要采取一致的字符大小写形式,在js中的结束分号(:)是可选的,为了避免JS语句错误,我们还是要注意添加,养成良好的编写习惯. 下面看看数据类型和值. JS有7种数据类型:字符串.数字.布尔.数组.对象.Null.Undefined 字符串类型:由Unicode字符,数字,标点符号组成的序列,可以为多个字符,也可以为0个字符. 1 <script> 2 // var用于声明一个变量 3 var stri