自动装箱和拆箱

基本类型对应都有一个包装类型,目的就为了将基本数据类型可以String类型之间进行互相转换
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character

boolean Boolean

在这里我们主要对Integer和Character进行研究。

一、Integer

首先思考一个问题:需要将100 (整数默认十进制) 转换成二进制,八进制,十六进制...

查看API文档,Integer提供了静态功能:

public static String toBinaryString(int i)
public static String toOctalString(int i)

  public static String toHexString(int i)

需求:获取Integer的最值
public static final int MAX_VALUE(2的31次方-1)
public static final int MIN_VALUE(2的负31次方)

public class IntegerDemo {
	
	public static void main(String[] args) {
		System.out.println(Integer.toBinaryString(100));//二进制组成:有0和1组成
		System.out.println(Integer.toOctalString(100));//组成规则:以0开头  0144
		System.out.println(Integer.toHexString(100));//组成规则:0x开头 0-9,a-f
		System.out.println("-----------------------");
		
		System.out.println(Integer.MAX_VALUE);
		System.out.println(Integer.MIN_VALUE);
	}
}
Integer的构造方法:
public Integer(int value)

public Integer(String s)

public class IntegerDemo2 {
	
	public static void main(String[] args) {
		//创建一个Integer类对象
		Integer i = new Integer(100);
		Integer ii = 100 ; //底层实际代码执行的是:valueOf(int i) :该类中本身有一缓冲区的 :缓冲的值的范围:-128~127
		System.out.println("i:"+i);
		System.out.println("ii:"+ii);
		
		System.out.println("-----------------");
		
		//public Integer(String s)
		//当前String类型的值是一个数字类型的字符串
		Integer iii = new Integer("100");
		System.out.println("iii:"+iii);//java.lang.NumberFormatException
	}
}

这里的 Integer i = new Integer(100);和Integer ii = 100 ;其实是一样的,第二条语句实际上就是一个自动装箱的例子,编译器自动帮我们改进代码,改成第一条语句的样子。(这个等会具体讲)

这里还有一个很有趣的现象:

public class IntegerDemo2 {
	
	public static void main(String[] args) {
			Integer a = 127;
			Integer b = 127;
			System.out.println(a==b);//true
			System.out.println(a.equals(b));//true
			
			Integer c = 128;
			Integer d = 128;
			System.out.println(c==d);//false
			System.out.println(c.equals(d));//true
	}
}

为什么相同的情况下会出现不同的结果呢?

这就与上面说的缓冲值有关系了,处于[-128,127]之间的数,虽然被装箱,但在实际的处理的过程中仍然当做基本数据类型来处理,因为这样可以提高效率。


如何将int转换为String类型

valueOf(int i) ;

将String转换为int类型

static int parseInt(String s);

public class IntegerDemo3 {
	
	public static void main(String[] args) {
		
		//int---->String
		//定义一个int类型的变量
		int num = 100 ;
		
		//方式1: 字符串拼接
		String str = ""	+ num ;
		System.out.println("str:"+str);
		
		//方式2:valueOf(int i) ;
		//int -->Integer--->String
		Integer i = Integer.valueOf(num) ;
		String str2 = i.toString() ;
		System.out.println("str2:"+str2);
		
		//方式3:静态toString(int i):		static String toString(int i )
		String str3 = Integer.toString(num) ;
		System.out.println("str3:"+str3);
		
		System.out.println("----------------------");
		
		//String--->int
		String s = "100";
		
		//方式1:String-->integer--->int
		Integer ii = new Integer(s);
		//public int intValue()
		int num2 = ii.intValue() ;
		System.out.println("num2:"+num2);
		
		//方式2:(常用)public static int parseInt(String s)
		int num3 = Integer.parseInt(s) ;
		System.out.println("num3:"+num3);
		
	}
}
JDK5 以后提供了自动拆装箱
   可以将Integer-->拆箱  int类型

可以将int类型--->装箱  Integer类型

JDK5 还提供了哪些特性:

泛型,可变参数,增强for循环(在集合中)等等...这些我们之后再讲

看个自动拆装箱的例子:

public class IntegerDemo4 {
	
	public static void main(String[] args) {
		
		//创建Integer对象
		Integer i = 100 ;
		i += 200;		//先拆箱(Integer-->int),后装箱(int值---->Integer)
		System.out.println("i:"+i);
	}
}

用反编译工具查看,发现编译器实际上执行的是如下的代码:

                        Integer i = Integer.valueOf(100);
i = Integer.valueOf(i.intValue()  + 200);//(int类型的100 +200)

System.out.println((new StringBuilder("i:")).append(i).toString());

这实际上就是自动拆装箱的过程。

二、Character

Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。 

    以确定字符的类别(小写字母,数字,等等)

构造方法:

public Character(char value)

Character类的判断功能:

public static boolean isDigit(char ch)确定指定字符是否为数字
public static boolean isLowerCase(int ch): 确定是否是小写字母字符
public static boolean isUpperCase(int ch):确定是否大写字母字符

两个转换功能:

public static int toLowerCase(int codePoint)

public static int toUpperCase(int codePoint)

需求:键盘录入一个字符串,利用Charater类的这三个判断功能统计当前字符串中大写字母字符,小写字母字符,数字字符的个数(不考虑其他字符) 

public class CharacterDemo3 {

	public static void main(String[] args) {
		
		//定义三个统计变量
		int bigCount = 0 ;
		int smallCount= 0 ;
		int numberCount = 0 ;
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//接收数据
		System.out.println("请输入一个字符串:");
		String line = sc.nextLine() ;
		
		//把字符串转成字符数组
		char[] chs = line.toCharArray() ;
		
		//遍历,取出每一个字符
		for(int x = 0 ; x < chs.length ; x ++) {
			char ch = chs[x] ;
			
			//判断当前ch字符是否为大写字母字符,数字字符,小写字母字符
			if(Character.isUpperCase(ch)) {
				bigCount ++;
			}else if(Character.isDigit(ch)) {
				numberCount++;
			}else if(Character.isLowerCase(ch)) {
				smallCount++ ;
			}
		}
		System.out.println("大写字母字符有:"+bigCount+"个");
		System.out.println("小写字母字符有:"+smallCount+"个");
		System.out.println("数字字符有:"+numberCount+"个");
	}
}
Integer和Character的包装类到此就结束了,其他的包装类大家可以自己学习学习。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值