`

【面试】深入java包装类

阅读更多
在JAVA中,已经将Java的基本数据类型与其提供了一些常用的类型操作的方法进行了封装,这样才有一切皆对象的感觉。

在学习包装类时,找了几个比较有意思的类进行了学习!

1.Integer
Integer i=3;
/**上述语句毫无疑问,是进行一个类的创建!但通过Java Decompiler进行反编译后,发现这条语句被编译器优化成了Integer integer = Integer.valueOf(1);比较有意思,于是就看看valueOf中是什么*/
 public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }
IntegerCache是什么
   private static class IntegerCache {
	private IntegerCache(){}
	static final Integer cache[] = new Integer[-(-128) + 127 + 1];
	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }
/**原来当创建Integer时,-128-127范围内的数据已经以static final的形式预先创建了,放在堆中。当用户声明该范围的Integer类型的变量时,直接从IntegerCache中读取。
可以做一个试验:/*
    Integer integer=1;
    Integer integer2=1;
    if (integer==integer2){
        	System.out.println("ok");
    }

结论是:integer与integer2(只要范围在-128~127之间的)所指的内存都是一致的,所以打印ok!
(在Java版经常看到很多人对堆与栈搞得很糊涂)


2.  Boolean
Boolean boolean1=true;   
/**这个代码与上述的Integer integer=1的做法类似,编译器对此进行优化(大家可以下载一个java Decompiler)。优化后的语句为Boolean boolean1 = Boolean.valueOf(true);这时可以看看valueOf的代码 */
 public static Boolean valueOf(boolean b) {   
        return (b ? TRUE : FALSE);   
   }   
//再看看TRUE与FALSE是什么?   
public static final Boolean TRUE = new Boolean(true);   
    
public static final Boolean FALSE = new Boolean(false);   
/**原来Boolean在创建时已经创建了二个static final的Boolean对象,True与False。这时做个实验: */
Boolean boolean1=true;   
         Boolean boolean2=true;   
         if (boolean1==boolean2){   
             System.out.println("ok");   
         }   


结果:boolean1与boolean2指向同一个堆地址。  

3.这里想说明一下==与equal,很难想像为什么每个博客都介绍这个的区别。
对于对象类型==肯定是栈指针地址的对比,而equal,可以点开String类的源码看一下  
public boolean equals(Object anObject) {   
    if (this == anObject) {   
        return true;   
    }   
    if (anObject instanceof String) {   
        String anotherString = (String)anObject;   
        int n = count;   
        if (n == anotherString.count) {   
        char v1[] = value;   
        char v2[] = anotherString.value;   
        int i = offset;   
        int j = anotherString.offset;   
        while (n-- != 0) {   
            if (v1[i++] != v2[j++])   
            return false;   
        }   
        return true;   
        }   
    }   
    return false;   
    }  


4.各个包装类缓存值范围
boolean:true和false
byte:-128~127
char:0~127
short:-128~127
int:-128~127
long:-128~127
特别:对于float和double没有缓存。

在对上述值进行装箱的时候(如:Character c1=127;or
Integer i= Integer.valueOf(1);
这个不行哦:Integer i2=new Integer(1);因为这是新建了一个对象出来。),并不是创建一个新对象而是使用缓存中的对象,,如果超出范围则需要新建立对象。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liangpei2008/archive/2010/01/30/5272501.aspx
分享到:
评论

相关推荐

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

    10万字面试总结Java.pdf

    Java是一种广泛使用的编程语言,以其独特的优势在软件开发领域占据着重要的地位...以上仅是Java面试中的部分关键知识点,深入掌握这些内容对于Java开发者来说至关重要,能够提升面试成功率并增强实际项目中的编程能力。

    java面试宝典java基础大全.pdf

    14. **Integer与int**:Integer是int的包装类,用于处理对象操作,如比较、缓存等。int是原始类型,直接存储数值。 15. **Math.round**:Math.round(x)会四舍五入到最接近的整数。11.5会变为12,-11.5会变为-11。 ...

    疯狂JAVA面试题

    5. int是基本数据类型,而Integer是对应的引用类型,是int的包装类。 书中还提到了Java的内存管理,Java虚拟机(JVM)负责管理对象的生命周期,包括创建、使用和清理。了解JVM的内存模型和垃圾回收机制对于编写高效...

    Java面试宝典2017版

    - `Integer`是`int`的包装类,用于处理对象和基本类型的互换。`Integer`对象在内存中占用更多空间,且有缓存范围(-128到127),超出这个范围则每次创建新对象。 4. 方法重载(Overload)与覆盖(Override): - ...

    JAVA面试题综合java面试知识

    - 包装类和自动装箱拆箱。 3. **运算符与流程控制** - 掌握各种运算符,如算术运算符、比较运算符、逻辑运算符。 - 理解流程控制语句,如if-else, switch, for, while等。 4. **方法与异常处理** - 方法的定义...

    Java面试宝典2018-最全面试资料

    例如,char类型能否存储中文字符,以及基本类型与它们的包装类之间的关系。Java的IO(输入/输出)是与文件系统和网络通信打交道的基础,书中提到了各种IO类的使用和区别。 在企业实战面试题方面,书中列举了大量...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO...

    2023java最新阿里巴巴面试题,2023java最新阿里巴巴面试题

    Java是一种广泛使用的编程语言,以其独特的优势在软件开发领域占据着重要的地位。以下是一些针对阿里巴巴2023年Java面试题的...在阿里巴巴这样的大型企业面试中,这些知识不仅要求理解,还需要能够灵活应用和深入分析。

    java面试题目精选

    - **int与Integer的区别**:解释了int作为基本类型与Integer作为包装类之间的区别。 - **原始数据类型的分类**:分类介绍了Java中的原始数据类型。 - **变量初始化**:讨论了变量初始化的重要性及其常见问题。 -...

    Java面试错误汇总.txt

    - **包装类**:为了方便将原始类型与其他Java类型(如对象)一起使用,Java为每种原始类型提供了一个包装类,例如`Integer`包装`int`。 - **原始类型与包装类的区别**:原始类型占用的空间更小,而包装类对象可以是`...

    java面试题大全.pdf

    8. 基本数据类型与包装类:在Java中,除了八种基本数据类型,还存在与之对应的包装类,如Integer、Double等。它们是不可变的,并且提供了各种有用的方法来处理对应的基本数据类型。 9. 集合框架:Java集合框架包括...

    Java面试八股文2023最新版

    3. **自动装箱与拆箱**:基本类型和其对应的包装类之间的转换,如Integer和int,编译器会自动完成。 4. **重载和重写**:重载在同一类中,方法名相同但参数列表不同;重写发生在子类中,方法名、返回类型和参数列表...

    Java工程师面试复习指南

    字符串和包装类 关键字最终特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流...

    初级Java面试题集锦(面试必备)

    本文将基于“初级Java面试题集锦(面试必备)”这一主题进行深入解析,帮助求职者更好地理解和掌握Java的基础知识及面试中常见的技术点。 #### 1. Java基本概念 Java是一种广泛使用的面向对象的编程语言,它支持跨...

    java面试资料汇总

    int是基本数据类型,而Integer是int的包装类,适用于那些需要对象状态而非原始值的场景。 String和StringBuffer在Java中都是用于处理字符串的类,但StringBuffer是线程安全的,而String是不可变的。 运行时异常...

    Java 面试全解析:核心知识点与典型面试题.zip

    Java有八种基本数据类型,对应的包装类提供了一些高级特性,如自动装箱拆箱、比较、格式化等。面试中可能会测试这些知识以及它们与引用类型的差异。 8. **算法** - 35-算法常用面试题汇总.html 算法是解决问题的...

    java 面试基础 java 面试基础

    - Integer是int的包装类,提供了额外的功能,如parseInt()方法。 7. **String不是基本数据类型**: - String是对象,属于引用类型,不是Java的八大基本数据类型之一。 8. **访问修饰符的区别**: - `public`:...

    java(BAT)面试题汇总

    自动装箱与拆箱是指在Java中将基本数据类型自动地转换为对应的包装类(如将int转换为Integer),反之亦然。装箱是指基本类型转换为包装类,拆箱是指包装类转换为基本类型。这种机制大大简化了基本类型与对象类型之间...

Global site tag (gtag.js) - Google Analytics