在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包装类练习.doc
java包装类和集合类详解,如果对这两个类库还不清楚的 可以参考
Java 包装类的使用说明
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
Java包装类
该文件显示了包装类中的自动装箱和自动拆箱!就是类容比较少
java原始数据类型的包装类 java系统自定义原始封装类
面向对象程序设计中,可以将一个类的定义 放在另一个类的内部,这就是内部类(有的地方叫嵌套类), 包含内部类的类也被称为外部类(有的地方也叫宿主类) 匿名内部类就是没有名字的内部类 正因为没有名字,所以匿名内部...
包装类是Java提供的一种特殊类,它的主要作用是将基本数据类型转换为对象,从而可以调用对象的方法。 包装类的使用场景 当我们需要使用基本数据类型进行面向对象的操作时,就可以使用包装类。例如,我们需要对一个...
对java的jdbc进行简单的封装,在连接不同数据库(如:mysq、sqlserver、oracle)时只需要改动一下propoties配置文件,供java初学者参考
总结了一些Java包装类常用方法,以Excel表格的形式呈现给大家,希望对阅读的你有所帮助。关注作者7旅病娘,一起学习更多的有意思的编程相关知识。
6、本文档结构(自上而下)个人信息—求职意向—专业技能(解析+教包装+高频面试题划出来)—项目经验(解析+教包装+亲自示范手把手带你包装手上的图书管理系统项目)用你最熟练的项目来包装最好;—一份我的简历...
深入理解包装类[java](csdn)————程序
包装类 byte-Byte short-Short int -Integer long -Long float -Float double -Double char-Character boolean-Boolean 1、所属的包 java.lang 2、类的继承关系、实现接口 前面6个包装类是与数字相关的 ...
Java学习资料—包装类;Java学习资料—包装类;Java学习资料—包装类;Java学习资料—包装类;Java学习资料—包装类;Java学习资料—包装类;
string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO...
【Java工程师面试复习指南】本仓库架构大部分Java工程师所需要掌握的核心知识,整合了互联网上的很多优质Java技术文章,力求打造为最完整最实用的Java开发者学习指南,如果对你有帮助,给个star告诉我吧,谢谢!...
Java 基本数据类型与包装类之间的转换的思维脑图
Java包装类、拆箱和装箱详解.docx
但在Java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,Java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了。这些包装类有:Boolean...