Java 拆装箱与包装类

WHAT?
什么叫拆装箱(Boxing,Unboxing)?
拆装箱就像你包装快递,拆快递一样。
拆装箱的行为作用在 包装类上。
装箱就是把基本数据类型转换为包装类。拆箱则是把包装类转换为基础数据类型。
拆装箱给我们提供一种机制,可以在这两种数据类型之间进行转换。
什么是基本数据类型和包装类?
Java数据类型分为两种,一种是内置数据类型,一种是引用数据类型。
 
内置类型有八种:
四个整数型 byte short int long
两个浮点型  float double
一个字符型 char 
一个布尔型 boolean
 
对于引用类型的变量,它在java中类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。。
所以什么是包装类(Wrapping Class)?就是指基本数据类型的对象类,可以进行引用数据。
 
当我们引用这个类型的变量时,不再仅仅只是值传递,而是引用的传递,任何改变都会被应用在这个变量所在的内存块。
 
char
Character
int
Integer
short
Short
byte
Byte
long
Long
float
Float
double
Double
boolean
Boolean
WHY?
在我们知道拆装箱是基于包装类和基础类型的操作后。试问,为什么要有包装类?
这源于一个古老的理念“万物皆对象,对象皆有类“。这句话我一搜,可以搜出来”java有一个核心原则,叫做万物皆对象。“”python有一个重要理念,万物皆对象“”JavaScript有一个重要的原则叫做万物皆对象“”C#……“
对于这些语言而言,对象一定非常重要……(这是一个笑话
什么是对象?<———在这里。
总之,我们为了可以将基本数据类型也可以当做对象来使用,故而设计了包装类。并且给了它一套可以使用的操作。拆装箱只是在包装类与基本数据类型转换的一个操作。
HOW?
如今的java提供了一种自动化的拆装箱.
//手动装箱:
Integer in = Integer.valueOf(num);
//手动拆箱
Integer num = 10;//自动装箱
int i = num.intValue();
在如下几种情况,编译器会自动帮助我们干活:
  1. 进行 = 赋值操作(装&拆
  2. 进行+,-,*,/ 运算(拆
  3. 进行>,< == 比较运算(拆
  4. 使用equals进行比较(装&拆
  5. ArrayList,HashMap等集合类添加基本类型数据(装
 
//自动装箱
Integer num = 10;
//自动拆箱
int num = 10;
Integer num2 = 10;
int i = num+num2;
 
如何理解 使用集合类添加基本数据类型时的自动装箱?
HashMap<Integer,Integer> here = new HashMap<Integer,Integer>();
here.put(1,1);
here.put(2,2);
here.get(2);
HashMap存储了Integer与Integer对应的关系和值,我们传入的是int。自动装箱为Integer
当我们使用get,我们得到了对应key的值,从Integer自动拆箱为int
 
一道很经典的题:
以下代码会输出什么?
public class Main{
    public static void main(String[] args){
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}
结果是:true,false
这是因为编译器存在一个缓存数组,大小为-128~127,用于缓存这个范围内所有创建的实例对象。如果之前有存在就直接拿来用,不存在的话就new一个新的Integer对象。因为200大于127,所以每一次建立都是在建立一个新的Integer.
 
类的具体使用:
Integer类
  •     创造方法
        
//Integer(int value)
Integer integer1 = new Integer(100);
//Integer(String s)
Integer integer2 = new integer(“100”);
  • 常用方法
 
方法
返回值
功能
byteValue()
byte
以byte类型返回该Integer值
shortValue()
short
以short类型返回该Integer值
intValue()
int
以int类型返回该Integer值
toString()
String
返回一个表示该Integer值的String
equals(Object obj)
boolean
比较此对象与指定对象是否相等
compareTo(another Integer)
int
相等等于0,小于another返回负值,else返回正值
valueOf(String s)
Integer
返回指定String Integer值
parseInt(String s
int
将数字字符串转换为int数值
 
  • Integer类常量
  1. MAX_VALUE:值为2的31次幂-1,代表int类型可以达到的最大值
  2. MIN_BALUE:值为-2的31次幂,表示int类型能达到的最小值
  3. SIZE:用来以二进制不嘛表示int值的比特位数(32
  4. TYPE:表示基本类型int的class实例
int max_val = Integer.MAX_VALUE;
Class c = Integer.TYPE;
Float类
  • 构造方法
有三个:
//Float(double vaue)
Float float1 = new Float(3.1415926);
//Float(float value)
Float float2 = new Float(6.5f);
//Float(String s)
Float float3 = new Float(“3.1415”)
 
 
  • 常用方法
方法
返回值
功能
byteValue()
byte
以byte类型返回该Float值
doubleValue()
double
以double类型返回该Float值
floatValue()
float
以float类型返回该Float值
intValue()
int
以int类型返回该Float值(强制转换)
longValue()
long
以long类型返回该Float值(强制转换)
shortValue()
short
以short类型返回该Float值(强制转换)
isNaN()
boolean
如果此float是一个非数字值返回true,否则false
toString()
String
返回一个表示该float值的String
equals(Object obj)
boolean
比较此对象与指定对象是否相等
valueOf(String s)
Float
返回指定String Float值
parseFloat(String s
float
将数字字符串转换为float数值
  • 常用常量
    MAX_VALUE:值为1.4E38的常量,表示float类型能表示的最大值
    MIN_VALUE:值为3.4E-45常量 表示最小值
    MAX_EXPONENT:有限float变量可能具有的最大指数
    MIN_EXPONENT
    MIN_NORMAL:保存float类型树脂的最小标准常量 即2的-126次幂
    NaN:保存float类型的非数字值常量    
    SIZE:用来以二进制补码形式表示float值的比特位数
    TYPE :表示基本来兴float的clss实例
    DOUBLE 类类似Float
Character类
  • 创建
   
Character ch = new Charcter(’s’);
 
  • 常用方法
 
方法
描述
void Character(char value)
构造一个新分配的character对象,用以表示指定char值
char charValue()
返回此Character对象的值,此对象表示基本char值
int compareTo(Character anotherCharacter)
根据数字比较两个 Character 对象,这个值是两个字符比较厚标准代码差值
boolean equals(Character anotherCharacter)
将此对象与指定对象比较,当且仅当参数不是 null,而 是一个与此对象
包含相同 char 值的 Character 对象时, 结果才是 true
boolean isDigit(char ch)
确定指定字符是否为数字,如果通过 Character. getType(ch) 提供的字
符的常规类别类型为 DECIMAL_DIGIT_NUMBER,则字符为数字
boolean isLetter(int codePoint)
确定指定字符(Unicode 代码点)是否为字母
boolean isLetterOrDigit(int codePoint)
确定指定字符(Unicode 代码点)是否为字母或数字
boolean isLowerCase(char ch)
确定指定字符是否为小写字母
boolean isUpperCase(char ch)
确定指定字符是否为大写字母
char toLowerCase(char ch)
使用来自 UnicodeData 文件的大小写映射信息将字符参数转换为小写
char toUpperCase(char ch)
使用来自 UnicodeData 文件的大小写映射信息将字符参数转换为大写
compareTo的用法:
Character character = new Character('A');
int result1 = character.compareTo(new Character(‘A'));
System.out.println(result1);    // 输出:0
int result2 = character.compareTo(new Character('B'));
System.out.println(resuit2);    // 输出:-1
int result3 = character.compareTo(new Character('1'));
System.out.println(result3);    // 输出:-2
 
如何使用Character的静态方法验证用户名性别年龄邮箱地址符合标准:
public class Register {
    public static boolean validateUser(String uname,String upwd,String age) {
        boolean conUname = false;       // 用户名是否符合要求
        boolean conPwd = false;    // 密码是否符合要求
        boolean conAge = false;    // 年龄是否符合要求
        boolean con = false;    // 验证是否通过
        if (uname.length() > 0) {
            for (int i = 0;i < uname.length();i++) {
                // 验证用户名是否全部为字母,不能含有空格
                if (Character.isLetter(uname.charAt(i))) {
                    conUname = true;
                } else {
                    conUname = false;
                    System.out.println("用户名只能由字母组成,且不能含有空格!");
                    break;
                }
            }
        } else {
            System.out.println("用户名不能为空!");
        }
        if (upwd.length() > 0) {
            for (int j=0;j<upwd.length();j++) {
                // 验证密码是否由数字和字母组成,不能含有空格
                if (Character.isLetterOrDigit(upwd.charAt(j))) {
                    conPwd = true;
                } else {
                    conPwd = false;
                    System.out.println("密码只能由数字或字母组成!");
                    break;
                }
            }
        } else {
            System.out.println("密码不能为空!");
        }
        if (age.length() > 0) {
            for (int k = 0;k < age.length();k++) {
                // 验证年龄是否由数字组成
                if (Character.isDigit(age.charAt(k))) {
                    conAge = true;
                } else {
                    conAge = false;
                    System.out.println("年龄输入有误!");
                    break;
                }
            }
        } else {
            System.out.println("年龄必须输入!");
        }
        if (conUname && conPwd && conAge) {
            con = true;
        } else {
            con = false;
        }
        return con;
    }
}
 
Boolean类
  • 构造方法
    
Boolean(boolean boolValue);

Boolean(String boolString);

 

构造方法

方法

返回值

功能

booleanValue()

boolean

将 Boolean 对象的值以对应的 boolean 值返回

equals(Object obj)

boolean

判断调用该方法的对象与 obj 是否相等。当且仅当参数不是 null,且与调用该

方法的对象一样都表示同一个 boolean 值的 Boolean 对象时,才返回 true

parseBoolean(String s)

boolean

将字符串参数解析为 boolean 值

toString()

string

返回表示该 boolean 值的 String 对象

valueOf(String s)

boolean

返回一个用指定的字符串表示的 boolean 值

 

  • 常用常量

        TRUE:对应基值 true 的 Boolean 对象。

        FALSE:对应基值 false 的 Boolean 对象。    

        TYPE:表示基本类型 boolean 的 Class 对象。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值