跳转至

Java 包装类

2020/02/05 昨天虚拟机坏了,笔记没有git push,郁闷,今早恢复了,呵呵

1. 包装类

​ 我们知道,Java中有八种基本数据类型,它们又对应八种包装类型。那么,回想一下你在代码中使用基本数据类型或包装类型时,选择标准是什么?有没有标准呢?今天,我们就来了解一下包装类型。

Java有八种基本类型,byte, short, int, long, float, double, char, boolean

对应八种包装类,Byte, Short, Integer, Long, Double, Character, Boolean。

1.1 包装类

  包装类(Wrapper Class)

  Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。基本类型的数据不具备"对象"的特性(没有成员变量和成员方法可以调用),因此,java为每种数据类型分别设计了对应的类,即包装类。

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.

基本数据类型 对应的包装类
byte Byte
short Short
int Integer
long Long
char Character
floar Float
double Double
boolean Boolean
  • 所有包装类都是final类型,因此不能创建他们的子类。
  • 包装类是不可变类,一个包装类的对象自创建后,他所包含的基本类型数据就不能被改变。

1.2 基本类型

  • 基本数据类型转换为包装类
Integer intValue = new Integer(21);
或Integer intValue = new Integer("21");
Integer intValue = Integer.valueOf("21");
  • 包装类转换成基本类型
Integer integerId=new Integer(25);
int intId=integerId.intValue();
  • 基本类型和包装类的自动转换
Integer  intObject = = 5;
int intValue =  intObject =;

int intValue1 = 10;
Integer intObject1 = intValue;

包装类并不是用来取代基本 类型的

2. Integer类

2.1 装箱和拆箱

  • 装箱: 将基本数据类型变为包装类对象
  • 拆箱: 将包装类中包装的基本数据类型取出
int到Integer Integer到int
使用Integer类的构造方法 调用Integer类的intValue()方法
使用Integer类内部的valueOf( )方法 自动拆箱
自动装箱
自动装箱:
基本类型就自动地封装到与它相同类型的包装中,如: 
Integer i = 100; 

本质上是,编译器编译时为我们添加了: 
Integer i = Integer.valueOf(100);

自动拆箱:
包装类对象自动转换成基本类型数据。如:
int a = new Integer(100);
本质上,编译器编译时为我们添加了:
int a = new Integer(100).intValue();

2.2 int到Integer类:

三种方法:
(1)使用Integer类的构造方法
(2)使用Integer类内部的valueOf( )方法
(3)自动装箱

​ 使用Integer类的构造方法

  • public Integer(int value):将int类型转换为Integer类。
  • public Integer(String s):将String类型转换为Integer类

注意:使用此构造方法时,字符串内的字符必须由数字组成,不可以是字母或者其他形式,否则抛出NumberFormatException

public static void main(String[] args){

    //方式1:public Integer(int value)
    int i= 100;

    //将int类型的i转换为Integer类型的ii
    Integer num1 = new Integer(i);
    System.out.println("num1:"+num1);

    //方式2:public Integer(String s)
    String s = "100";
    //String s = "abc";//出错,因为这个字符串必须由数字字符组成。   
    Integer num2 = new Integer(s);
    System.out.println("num2:"+num2);//100  
}

方法2:使用Integer类内部的valueOf方法

  • public static Integer valueOf(int i):将int类型转换为Integer类。
Integer num3 = Integer.valueOf(100);

方法3:自动装箱的方法:

事实上,编译器自动执行了valueOf方法

Integer num4 = 100;//编译器自动执行了Integer num4 = Integer.valueOf(100)    
包装类 装箱 拆箱
Byte valueOf() byteValue()
Short valueOf() shortValue()
Integer valueOf() intValue()
Long valueOf() longValue()
Float valueOf() floatValue()
Double valueOf() doubleValue()
Character valueOf() charValue()
Boolean valueOf() booleanValue()

valueOf源码分析:

public static Integer valueOf(int i) {
     assert IntegerCache.high>= 127;
     if (i >= IntegerCache.low&& i <= IntegerCache.high)
     return IntegerCache.cache[i+ (-IntegerCache.low)];
     return new Integer(i); 
}

通过查看原码可知,java针对-128-127之间的数据做了一个数据缓冲池。如果数据是该范围内的,每次并不创建新的空间。如果数据是该范围内的,就new一个空间。

public static void main(String[] args) {
        int i = 100;
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 128;
        Integer i4 = 128;
        System.out.println(i1==i2); //true
        System.out.println(i3==i4); //false

        Integer num1 = 10;
        int a = num1;
        System.out.println(a==num1); //true
        System.out.println("------------");
        String str1 = "abc";
        String str2 = new String("abc");

        System.out.println(str1==str2); //false
        str2 = str2.intern();
        System.out.println(str1==str2); //true
        System.out.println(str1.equals(str2));//true
}

2.3 Integer类到 int

(1)调用包装类的intValue()方法
(2)通过自动拆箱
  • 方法1:调用包装类的intValue()方法 public int intValue():以 int 类型返回该 Integer 的值。
public void test() {
        Integer data1 = new Integer(14);
        Float f1 = new Float(12.3F);

        //1.调用包装类的XxxValue()方法  拆箱
        int data2 = data1.intValue();
        float f2 = f1.floatValue();

        System.out.println(data2);//data2 = 14
        System.out.println(f2);//f2 = 12.3
}
  • 方法2:通过自动拆箱: 编译器自动执行了valueOf方法
//5是基本数据类型,通过自动装箱变成对象类型。
//编译器执行了Integer num1 = Integer.valueOf(5)
Integer num1=5;

//自动拆箱,实际上执行了 int num2 = num1.intValue()
int num2=num1;
System.out.println(num2);

2.4 int类型数据和String形式之间的相互转换

int到String String到int
字符串的拼接 String–>Integer–>int
String类的valueOf()方法 int parseInt(String s)
int → Integer →String (所用方法:valueOf()+toString())
toString(int i)
//int--String把int类型的数据转化为字符串的形式
int number = 100;

//方式1:字符串的拼接
String s1 = "" + number;
System.out.println("s1:"+s1);
System.out.println("s1的数据类型是: " + s1.getClass().toString());

//方式2:String类的valueOf可以把任意类型的数据转换成String类型
String s2 = String.valueOf(number);
System.out.println("s2:"+s2);
System.out.println("s2的数据类型是: " + s2.getClass().toString());

//方式3
//int -- Integer -- String
Integer i = new Integer(number);
String s3 = i.toString();
System.out.println("s3:"+s3);
System.out.println("s3的数据类型是: " + s3.getClass().toString());

//方式4
//public static String toString(int i)返回一个表示该 Integer 值的 String 对象。
String s4 = Integer.toString(number);
System.out.println("s4:"+s4);


//String--int
String s ="100";
//方式1
//String--Integer--int
//String--Integer
Integer ii = new Integer(s);
//Integer--int
//public int intValue()以 int类型返回该 Integer的值
int x = ii.intValue();
System.out.println("x:"+x);

//方式2
//public static int parseInt(String s)
int y = ii.parseInt(s);
System.out.println("y:"+y);

结果是
s1:100
s1的数据类型是: class java.lang.String
s2:100
s2的数据类型是: class java.lang.String
s3:100
s3的数据类型是: class java.lang.String
s4:100
x:100
y:100

2.5 进制转换表

进制间转换 方法 说明
十进制到二进制 toBinaryString(int i) 将一个十进制整数转换成字符串形式的二进制数
十进制到八进制 toOctalString(int i) 将一个十进制整数转换成字符串形式的八进制数
十进制到十六进制 toHexString(int i) 将一个十进制整数转换成字符串形式的十六进制数
十进制到其他进制 toString(int i,int radix) 将一个十进制数转换字符串形式的radix进制数,radix为进制值
其他进制到十进制 int parseInt(String s, int radix) 将一个radix进制的数转换为十进制
//十进制到二进制,八进制,十六进制
System.out.println(Integer.toBinaryString(10)); //1010
System.out.println(Integer.toOctalString(10)); //12
System.out.println(Integer.toHexString(10));  //a
System.out.println("--------");

//十进制到其他进制
System.out.println(Integer.toString(100,10)); //100
System.out.println(Integer.toString(100,2)); //110100
System.out.println(Integer.toString(100,8)); //144
System.out.println("--------");

//其他进制转换为十进制
System.out.println(Integer.parseInt("100",10));//100
System.out.println(Integer.parseInt("100",2));//4
System.out.println(Integer.parseInt("100",4));//16
System.out.println(Integer.parseInt("100",16));//256
System.out.println(Integer.parseInt("100",23));//529

3.Character类

3.1 概述

Character类概述:

​ Character类在对象中包装了一个char的值,用于对单个字符进行操作。 该类提供了几种方法来操纵字符,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写等。

Character类的构造方法:

  • public Character(char value):将char类型转换为Character类。
Character ch1 = new Character('a');
System.out.println("ch1:"+ch1);  //ch1:97

注意:char和Character类之间的转换方法与int和Integer类之间的转换方法相同,不再赘述。

Character类的方法:

序号 方法 说明
1 isDigit() 是否是一个数字字符
2 isWhiteSpace() 是否是一个空格
3 isUpperCase() 是否是大写字母
4 isLowerCase() 是否是小写字母
5 toUpperCase() 指定字母的大写形式
6 toLowerCase() 指定字母的小写形式
7 toString() 返回字符的字符串形式
//public static boolean isUpperCase(int codePoint)判断给定的字符是否为大写字符
System.out.println(Character.isUpperCase('C'));
System.out.println(Character.isUpperCase('c'));
System.out.println(Character.isUpperCase('0'));

//public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
System.out.println(Character.isUpperCase('C'));
System.out.println(Character.isUpperCase('c'));
System.out.println(Character.isUpperCase('0'));

// public static boolean isDigit(int codePoint):判断给定的字符是否是数字
System.out.println(Character.isUpperCase('C'));
System.out.println(Character.isUpperCase('c'));
System.out.println(Character.isUpperCase('0'));

//public static char toUpperCase(char ch):把给定的字符转换为大写字符
System.out.println(Character.toUpperCase('c'));

//public static char toLowerCase(char ch):把给定的字符转换为小写字符
System.out.println(Character.toLowerCase('C'));

4. StringBuffer

​ 当对字符串进行修改的时候,需要使用 StringBufferStringBuilder 类。

和 String 类不同的是,StringBufferStringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。

​ 由于 StringBuilder 相较于StringBuffer有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer类。

public class Test{
  public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("JD 官网: ");
    sBuffer.append("www");
    sBuffer.append(".jd");
    sBuffer.append(".com");
    sBuffer.append(123);
    sBuffer.append(13.45);
    System.out.println(sBuffer);
  }
}

输出结果是

JD 官网: www.jd.com12313.45

4.1 StringBuffer 方法

以下是 StringBuffer 类支持的主要方法:

序号 方法描述
1 public StringBuffer append(String s) 将指定的字符串追加到此字符序列。
2 public StringBuffer reverse() 将此字符序列用其反转形式取代。
3 public delete(int start, int end) 移除此序列的子字符串中的字符。
4 public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。
5 replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。

下面的列表里的方法和 String 类的方法类似:

序号 方法描述
1 int capacity() 返回当前容量。
2 char charAt(int index) 返回此序列中指定索引处的 char 值。
3 void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。
4 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst
5 int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。
6 int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7 int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。
8 int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。
9 int length() 返回长度(字符数)。
10 void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch
11 void setLength(int newLength) 设置字符序列的长度。
12 CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。
13 String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14 String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
15 String toString() 返回此序列中数据的字符串表示形式。