在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面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
Java是一种广泛使用的编程语言,以其独特的优势在软件开发领域占据着重要的地位...以上仅是Java面试中的部分关键知识点,深入掌握这些内容对于Java开发者来说至关重要,能够提升面试成功率并增强实际项目中的编程能力。
14. **Integer与int**:Integer是int的包装类,用于处理对象操作,如比较、缓存等。int是原始类型,直接存储数值。 15. **Math.round**:Math.round(x)会四舍五入到最接近的整数。11.5会变为12,-11.5会变为-11。 ...
5. int是基本数据类型,而Integer是对应的引用类型,是int的包装类。 书中还提到了Java的内存管理,Java虚拟机(JVM)负责管理对象的生命周期,包括创建、使用和清理。了解JVM的内存模型和垃圾回收机制对于编写高效...
- `Integer`是`int`的包装类,用于处理对象和基本类型的互换。`Integer`对象在内存中占用更多空间,且有缓存范围(-128到127),超出这个范围则每次创建新对象。 4. 方法重载(Overload)与覆盖(Override): - ...
- 包装类和自动装箱拆箱。 3. **运算符与流程控制** - 掌握各种运算符,如算术运算符、比较运算符、逻辑运算符。 - 理解流程控制语句,如if-else, switch, for, while等。 4. **方法与异常处理** - 方法的定义...
例如,char类型能否存储中文字符,以及基本类型与它们的包装类之间的关系。Java的IO(输入/输出)是与文件系统和网络通信打交道的基础,书中提到了各种IO类的使用和区别。 在企业实战面试题方面,书中列举了大量...
string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO...
Java是一种广泛使用的编程语言,以其独特的优势在软件开发领域占据着重要的地位。以下是一些针对阿里巴巴2023年Java面试题的...在阿里巴巴这样的大型企业面试中,这些知识不仅要求理解,还需要能够灵活应用和深入分析。
- **int与Integer的区别**:解释了int作为基本类型与Integer作为包装类之间的区别。 - **原始数据类型的分类**:分类介绍了Java中的原始数据类型。 - **变量初始化**:讨论了变量初始化的重要性及其常见问题。 -...
- **包装类**:为了方便将原始类型与其他Java类型(如对象)一起使用,Java为每种原始类型提供了一个包装类,例如`Integer`包装`int`。 - **原始类型与包装类的区别**:原始类型占用的空间更小,而包装类对象可以是`...
8. 基本数据类型与包装类:在Java中,除了八种基本数据类型,还存在与之对应的包装类,如Integer、Double等。它们是不可变的,并且提供了各种有用的方法来处理对应的基本数据类型。 9. 集合框架:Java集合框架包括...
3. **自动装箱与拆箱**:基本类型和其对应的包装类之间的转换,如Integer和int,编译器会自动完成。 4. **重载和重写**:重载在同一类中,方法名相同但参数列表不同;重写发生在子类中,方法名、返回类型和参数列表...
字符串和包装类 关键字最终特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流...
本文将基于“初级Java面试题集锦(面试必备)”这一主题进行深入解析,帮助求职者更好地理解和掌握Java的基础知识及面试中常见的技术点。 #### 1. Java基本概念 Java是一种广泛使用的面向对象的编程语言,它支持跨...
int是基本数据类型,而Integer是int的包装类,适用于那些需要对象状态而非原始值的场景。 String和StringBuffer在Java中都是用于处理字符串的类,但StringBuffer是线程安全的,而String是不可变的。 运行时异常...
Java有八种基本数据类型,对应的包装类提供了一些高级特性,如自动装箱拆箱、比较、格式化等。面试中可能会测试这些知识以及它们与引用类型的差异。 8. **算法** - 35-算法常用面试题汇总.html 算法是解决问题的...
- Integer是int的包装类,提供了额外的功能,如parseInt()方法。 7. **String不是基本数据类型**: - String是对象,属于引用类型,不是Java的八大基本数据类型之一。 8. **访问修饰符的区别**: - `public`:...
自动装箱与拆箱是指在Java中将基本数据类型自动地转换为对应的包装类(如将int转换为Integer),反之亦然。装箱是指基本类型转换为包装类,拆箱是指包装类转换为基本类型。这种机制大大简化了基本类型与对象类型之间...