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
¶
当对字符串进行修改的时候,需要使用 StringBuffer
和StringBuilder
类。
和 String 类不同的是,StringBuffer
和 StringBuilder
类的对象能够被多次的修改,并且不产生新的未使用对象。
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() 返回此序列中数据的字符串表示形式。 |