java基础 之 包装类

什么是包装类

java中数据类型分为基本类型和引用类型两种。
我们平时操作对象时可以使用对象的方法和属性,但是基本数据类型不能操作。例如int a=10,我们想转成字符串,不能,这时候就引出了包装类了

基本类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

1、特殊记忆int和char类型的,剩下的记忆就是基本类型的首字母大写
2、在不用考虑性能的情况下建议使用包装类代替基本类型

包装类的作用

  • 1、将基本数据类型转换为对象
  • 2、提供方法操作基本数据类型
  • 3、实现泛型: Java中泛型不能直接使用基本数据类型,但可以使用对应的包装类。即List不允许,List允许

详解包装类(含自动装箱&自动拆箱)

基本类型和包装类的区别:

  • 1、基本类型都不具有可空性,但是包装类具有。如int i = null 会报编译错误,但Integer i=null 允许。
  • 2、基本类型的效率和性能要比包装类高。因为基本类型的数据直接存储在栈中,不需要进行堆内存的分配和垃圾回收。包装类的数据是一个对象,需要创建从而进行堆内存的分配和垃圾回收。
  • 3、基本类型不支持对数据操作,包装类封装了方法和属性,可以灵活的操作数据

自动装箱和自动拆箱

  • 在Java中,自动装箱和自动拆箱是编译器的特性,它允许你在基本数据类型和它们的包装类之间自动转换。
  • 自动装箱:基本数据类型自动转换成它们的对象包装类。
  • 自动拆箱:对象包装类自动转换成基本数据类型。

说明:
1、频繁的自动装箱和拆箱操作会导致额外的对象创建,影响性能
2、在自动拆箱时,由于基本类型的非可空性,如果包装类对象为null,会导致NullPointerException
3、使用==比较包装类对象时,比较的是对象的引用,而不是值,这里建议使用equals
4、Java会缓存一定范围内的整数值(通常是-128到127)。在这个范围内的装箱对象可能会被重用,而超出范围的值则不会。即使用包装类类型会出现128陷阱 戳这里→128陷阱
5、在集合(如List、Set)中频繁操作基本数据类型时,会频繁发生装箱和拆箱操作

  • 装箱 和 拆箱
    (int&Integer short&Short long&Long方法相同)
    // 
    Byte b = 8;
    byte b1 = b.byteValue();  //拆箱
    byte b2 = b; // 自动拆箱
    
    byte a1 = 8;
    Byte a2 = Byte.valueOf(a1); // 装箱
    Byte a3 = 10; // 自动装箱
    
    // 使用包装类将基本数据类型转换为对象
    Integer num1 = Integer.valueOf(10);
    Integer num2 = Integer.valueOf("20");
    // 使用包装类提供的方法操作基本数据类型,使用了自动拆箱
    int sum = num1+ num2;
    

Byte Short Integer Long Float Double

常用的静态常量 和 静态方法
// 获取当前包装类的最小值(Short、Integer、Long、Float、Double使用方法相同)
 Byte minNum = Byte.MIN_VALUE; // -128,-2**15(short),-2**31(int),-2**63(long)
 // 获取当前包装类的最大值(Short、Integer、Long、Float、Double使用方法相同)
 Byte maxNum = Byte.MAX_VALUE; // 127
 
 // valueOf为静态方法,多用于将字符串类型的数值转换为Byte或者byte类型
 // 该方法同样适用于 Short、Integer、Long、Float、Double类型
 Byte aa = Byte.valueOf("-1");
 Byte bb = 10;
 // 拆箱操作,用于将包装类型的数值转换为对应的基本类型
 // 该方法同样适用于 Short、Integer、Long、Float、Double类型
 byte b = bb.byteValue(bb);
 
 // 将包装类型的数据转换成字符串型。该方法同样适用于 Short、Integer、Long、Float、Double类型
 String s = bb.toString();

 // Double 和Float独有的(Double可替换为Float)
 Double d1 = Double.POSITIVE_INFINITY;   //正无穷
 Double d2 = Double.NEGATIVE_INFINITY;   // 负无穷
 Double d3 = Double.NaN;     // 非数,即存储非数值型的数据

总结:
1、包装类.MIN_VALUE / MAX_VALUE:多用于算法题存储数据时使用
2、包装类.valueOf(“xx”):xx多为字符串类型,即将字符串数值转换为对应的包装类
3、包装类对象.基本类型Value():即拆箱操作
4、正无穷、负无穷、非数是浮点型数据独有的方法

Character类 和String类

  • Chracter用于对单个字符的操作,其基本类型是char。新建的对象使用的单引号’x’;

    // Character的方法
    Boolean b1 = Character.isDigit('1'); //是不是一个数字:true
    Boolean b2 = Character.isLetter('b'); //是不是一个字母:true
    Boolean b3 = Character.isWhitespace('\t'); // 是不是一个空白字符。空格、换行符都算:true
    Boolean b4 = Character.isUpperCase('A'); //是不是一个大写字母:true
    Boolean b5 = Character.isLowerCase('A'); //是不是一个小写字母:false
    char A = Character.toUpperCase('a'); // 字符'a'转为大写形式。如果是大写的字母,则不变
    char b = Character.toLowerCase('B'); // 字符'B'转为小写形式。如果是小写的字母,则不变
    
  • char/Character 类型转换成String类型

    String s1 = String.valueOf('a');  // 方法一
    String s2 = Character.toString('a');  // 方法二
    String s3 = ""+'a'; // 方法三
    String s4 = new String(new char[] {'a'}); // 方法四,创建String对象时,传入的不能只是一个字符类型的
    
  • String转成char类型时,是数组char[]类型的

    String ss = "Hello\tWorld";
    char[] ch = ss.toCharArray();   //转成数组,挨个遍历
    char c = ss.charAt(1);      // 索引为1的位置的字符串
    System.out.println('w'-'a');  // 计算字符之间的差值
    
  • String是对字符串的操作。新建的对象使用的是双引号"x";

    // String的方法
    String nameLower = "jackJack";
    String nameUpper = "JACK";
    String ss1 = s1.concat(s2); // 连接字符串,方法一:aa
    String ss2 = s1+s2; // 连接字符串,方法二:aa
    System.out.println(nameLower.equalsIgnoreCase(nameUpper)); // 按字典顺序比较两个字符串,不考虑大小写。
    System.out.println(nameLower.endsWith("CK"));  // 是否已某字符串结尾,区分大小写:false
    System.out.println(nameLower.startsWith("CK"));  // 是否已某字符串开始,区分大小写:false
    int index1 = nameLower.indexOf('c'); // 字符'c'在字符串"jackJack"中第一次出现的索引,区分大小写
    int index2 = nameLower.lastIndexOf('c'); // 字符'c'在字符串"jack"中第一次出现的索引,区分大小写
    int length = nameLower.length(); // 字符串的长度,是个方法,注意要加上括号
    String str = new String(" Welcome-to-Java ");
    String[] strArr = str.split("-",2); // "-"分割符拆成2份,不写数值会按照实际的分隔符拆分
    String stra = str.trim(); // 去除前后空格
    String subStr = str.substring(2,10);  // 截取str的索引2到10的子串,不包括10
    System.out.println(str.isEmpty()); // 判断字符串是否为空
    
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值