java中数据类型及基本数据类型的包装类

java中数据类型及基本数据类型的包装类

首先,我们要了解Java中数据类型的分类:

  • 基本数据类型
    在这里插入图片描述
    ps:
    java中默认小数是double型,整数是int型
    char类型的默认值为’\u0000’,打印出来是空字符,也就是什么都没有,强转为整数为0,char的取值范围是整个Unicode字符集
    一个boolean型数据占内存大小有很多说法:
    (1)boolean的true和false编译后是0和1,所以占一位就可以
    (2)计算机处理数据的最小单位是一个字节,所以占一个字节,前七位为0,后一位为0或1
    (3)《Java虚拟机规范》中提到编译后一个boolean数据用int代替,一个boolean型数组用byte型数组代替,也就是说,一个boolean数据占4个字节,boolean数组中每个boolean数据占一个byte,即一个字节。用int代替应该是因为cpu处理数据是处理的是32位数据,这样运行效率比较高,而数组转换为byte型占的字节数最少,也就是占的空间少。所以4个字节和1个字节都有可能,具体要看Java虚拟机如何实现,主要是在运行速度和空间利用上的舍去。
    个人认位第三种说法比较合理。
    在定义数据给数据赋值时,float必须在数后加f或F,long可以加大小写后缀也可不加,其他类型均不能加。注意是不能,加了编译器也无法识别而报错。
  • 引用数据类型
    引用数据类型不像基本数据类型,是一个对象的引用。
    包括:字符串型(String)、数组、类、接口、枚举、lambda等

基本数据类型包装类

Java中有8个类,可以看作是8个基本数据类型对应的引用数据类型,也就是基本数据类型的包装类。我们说“Java中一切皆对象”,所以jdk帮我们提供了基本数据类型对应的对象。

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

ps:
除了int和char的包装类,其他包装类都是基本数据类型关键字首字母大写,所以只用记住int和char,其他首字母大写就可以
Long和Float直接赋值时必须加后缀!!!不加会报错。new对象时可以不加后缀。
在这里插入图片描述
new对象时括号中可以传能自动类型转换成需要参数类型的参数,比如new Integer(b);b是short型,而这里需要int型,但b可以自动转换为int型,这里就不会报错。强制类型转换的参数不行。
在这里插入图片描述

  • 包装类的实例化:

  • new对象:例如:Integer i=new Integer(10);//有参构造函数,参数为int型;Character c=new Character(‘c’);//参数为char型

  • 直接赋值:以上例子可以写成:Integer i=10;Character c=‘c’;可以这样写的原因是包装类内部为我们进行了加包操作。
    什么是加包操作?
    加包操作:把一个基本数据类型的数据转换为包装类型,即为加包。与之对应的是拆包操作。
    Integer中加包:Integer i=Integer.valueOf(10);拆包:int a=i.intValue();
    Character中加包:Character c=Character.valueOf(‘c’);拆包:char g=c.charValue();
    其他包装类型的加包拆包操作与其类型,不再一一赘述。
    我们可以看一下Integer源码中valueOf()方法是如何实现的?
    在这里插入图片描述
    Integer中定义了一个缓存IntegerCache,由下面的代码可以看出IntegerCache中有一个Integer型的cache[],cache数组就是缓存,大小是127-(-128)+1=256(2^8)。从代码中int j=low开始往下看,cache数组存的是[-128,127]这个区间里的int型数据,我们再去看上面valueOf的源码,如果传进去的参数在-128~127之间,函数会返回该参数在cache中对应的Integer引用,不需要重新new对象,如果在这个范围之外,就根据参数new Integer对象。
    8个包装类中,除了浮点数对应的两个包装类Float、Double和Boolean没有中间缓存外,其他的5个包装类都有缓存,其中除了Character中的缓存大小是128,取值范围是(‘0’~‘127’)外,其余4个整型包装类缓存大小都是256,参数范围都是-128 ~127。
    在这里插入图片描述

由XXXCache(XXX为有缓存的5种包装类)引出的问题

大家都知道 == 和equals()的区别,不太清楚的可以去看一下我的另一篇博客: Java中 ==和equals()方法的比较

我们进入正题:

public class IntegerTest {
    public static void main(String[] args) {
        Integer i=10;
        Integer j=10;
        System.out.println("i==j:"+(i==j));
        System.out.println("i.equals(j):"+i.equals(j));
        Integer a=200;
        Integer b=200;
        System.out.println("a==b:"+(a==b));
        System.out.println("a.equals(b):"+a.equals(b));
    }
}

运行结果:
在这里插入图片描述
大家看看上面的代码和运行结果,我们都知道 == 判断对象是否相等时判断的是对象的地址是否相等,Integer中的equals()判断的是对象中int值是否相等,上面与equals方法有关的运行结果也都符合值相等就返回true的原则,那为什么i==j的结果是true呢?这是因为i和j的值都是10,在IntegerCache的参数范围内,两次传10进去返回的是同一个Integer对象的不同引用,而这两个引用都指向同一个Integer对象,所以地址相同, i ==j的结果为true。a和b的值是200,不在IntegerCache的参数范围内,每次传200进去都会new一个Integer对象,a和b指向的Integer对象不同,所以地址不同,a ==b的结果为false.

包装类中一些常用方法和常用属性

valueOf()和XXValue就不说了,上面已经做过解析

  1. parseXXX(String str):
    传入一个字符串,返回该字符串的XXX型数据;Character中没有该方法!!!
    在这里插入图片描述
    在这里插入图片描述
    由上面的代码和运行结果可以看出:
    四种整型包装类的parseXXX方法有两个参数,一个String,一个int,int为要把String转化为什么进制的数,可以不写,不写默认转换为十进制
    两种浮点型包装类的parseXXX方法的String可以写整数也可以写小数,都会打印成对应的小数
    四种整型包装类和两种浮点型包装类传的parseXXX方法的String只能包括数字,不能出现字母或其他字符,否则会抛异常NumberFormatException
    Boolean的parseBoolean方法的String可以是任何字符串,传true则返回true,其他的返回false

  2. equals():均为重写Object类的equals方法,判断两个对象的属性值是否相等,相等就认为两个对象相等

  3. toString():

public class User {
    public static void main(String[] args) {
        //Character.toString()传入一个字符,转换为String返回
        System.out.println(Character.toString('也'));
        //Integer.toString()必须传int数,第二个参数可以传进制数,也可以不传
        System.out.println(Integer.toString(123,2));
        //Byte.toString()不能直接传一个数,因为传的数默认为int型,不能自动转换为byte,没有传进制数的参数
        byte b=12;
        System.out.println(Byte.toString(b));
        //Short.toString()同Byte.toString()
        short s=10;
        System.out.println(Short.toString(s));
        //可以直接传int,会自动类型转换为long,也可以直接传加l后缀的数,第二个参数可以传进制数,也可以不传
        System.out.println(Long.toString(123,8));
        //必须传一个float型数,没有传进制数的参数
        System.out.println(Float.toString(10.0f));
        //可以传int、float、double任何一种,没有传进制数的参数
        System.out.println(Double.toString(10));
        //只能传boolean型值
        System.out.println(Boolean.toString(true));

    }
}

只有Integer和Long的toString()有第二个传进制数的参数,Byte和Short不能直接传数值,必须先定义一个对应类型的变量或常量,Float型必须传带f后缀的数

4.reverseBytes()和reverse():
Byte、浮点数包装类和布尔型包装类没有这两种方法
Short和Character只有reverseBytes()
Integer和Long两种方法都有
reverseBytes():按字节二进制反转
reverse():按位二进制反转
反转即反转顺序:1010–>0101
5.MAX_VALUE和MIN_VALUE:
每种包装类对应的基本数据类型所能表示的最大值和最小值
Boolean没有!!!

发布了19 篇原创文章 · 获赞 9 · 访问量 2221

猜你喜欢

转载自blog.csdn.net/weixin_44480874/article/details/98666195