【原】Java学习笔记024 - 包装类

时间:2022-02-19 12:20:14
 1 package cn.temptation;
2
3 public class Sample01 {
4 public static void main(String[] args) {
5 // 之前对于基本数据类型都是直接进行声明操作,缺少现成的成员方法可以使用
6 // Java针对基本数据类型缺少成员方法的问题,提供了解决方案 ----- 包装类(WrapClass),对基本数据类型进行包装的类
7
8 /*
9 * 基本数据类型 对应的包装类
10 * byte Byte
11 * short Short
12 * int Integer
13 * long Long
14 *
15 * float Float
16 * double Double
17 *
18 * char Character
19 *
20 * boolean Boolean
21 */
22
23 // 包装类Integer:Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。
24
25 // Integer类的常用字段:
26 // 1、static int MAX_VALUE :值为 2^31-1 的常量,它表示 int 类型能够表示的最大值。
27 // 2、static int MIN_VALUE :值为 -2^31 的常量,它表示 int 类型能够表示的最小值。
28 System.out.println("Integer.MAX_VALUE:" + Integer.MAX_VALUE); // 2147483647
29 System.out.println("Integer.MIN_VALUE:" + Integer.MIN_VALUE); // -2147483648
30
31 // Integer类的构造函数
32 // 1、Integer(int value) :构造一个新分配的 Integer 对象,它表示指定的 int 值。
33 // 2、Integer(String s) :构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
34 int i = 2;
35 Integer integer1 = new Integer(i);
36 System.out.println("integer1:" + integer1); // 2
37 System.out.println(integer1 instanceof Integer); // true
38 // 语法错误:Syntax error, insert "Dimensions" to complete ArrayType
39 // System.out.println(integer1 instanceof int);
40 System.out.println("-----------------------------------------");
41
42 String str = "123";
43 Integer integer2 = new Integer(str);
44 System.out.println("integer2:" + integer2);
45 System.out.println(integer2 instanceof Integer); // true
46
47 String strEx = "java";
48 // 执行异常:java.lang.NumberFormatException: For input string: "java"
49 Integer integer3 = new Integer(strEx);
50 System.out.println("integer3:" + integer3);
51 System.out.println(integer3 instanceof Integer);
52 }
53 }
 1 package cn.temptation;
2
3 public class Sample02 {
4 public static void main(String[] args) {
5 /*
6 * Integer包装类的常用成员方法:
7 * 1、static String toBinaryString(int i) :以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
8 * 2、static String toHexString(int i) :以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
9 * 3、static String toOctalString(int i) :以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
10 */
11 System.out.println(Integer.toBinaryString(3)); // 11
12 System.out.println(Integer.toHexString(10)); // a
13 System.out.println(Integer.toOctalString(9)); // 11
14 }
15 }
 1 package cn.temptation;
2
3 public class Sample03 {
4 public static void main(String[] args) {
5 /*
6 * int类型 和 string类型之间的转换
7 *
8 * int类型----->string类型
9 * string类型----->int类型
10 */
11
12 // int类型----->string类型
13 int i = 2;
14
15 // 方法1、使用String类的valueOf()方法
16 String str1 = String.valueOf(i);
17 System.out.println(str1);
18
19 // 方法2、使用int类型和空字符串做加法
20 String str2 = i + "";
21 System.out.println(str2);
22
23 // 方法3、使用Integer包装类作为中间桥梁,使用Integer的构造函数和toString方法
24 Integer integer1 = new Integer(i);
25 System.out.println(integer1.toString());
26
27 // 方法4、使用Integer包装类的toString(int i)方法
28 System.out.println(Integer.toString(i));
29
30 System.out.println("------------------------------------------------");
31
32 // string类型----->int类型
33 String str = "123";
34
35 // 方法1、使用Integer包装类作为中间桥梁,使用Integer的构造函数 和 intValue方法
36 Integer integer2= new Integer(str);
37 System.out.println(integer2.intValue());
38
39 // 方法2、使用Integer包装类的parseInt方法
40 int j = Integer.parseInt(str);
41 System.out.println(j);
42
43 // 执行异常:java.lang.NumberFormatException: For input string: "java"
44 System.out.println(Integer.parseInt("java"));
45 }
46 }
 1 package cn.temptation;
2
3 public class Sample04 {
4 public static void main(String[] args) {
5 /*
6 * Integer包装类的常用成员方法:
7 * 1、static String toString(int i, int radix) :返回用第二个参数指定基数表示的第一个参数的字符串表示形式。
8 * 2、static int parseInt(String s, int radix) :使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
9 */
10 System.out.println(Integer.toString(2, 2)); // 10
11 System.out.println(Integer.toString(10, 16)); // a
12 System.out.println(Integer.toString(8, 8)); // 10
13
14 System.out.println(Integer.toString(10, -2)); // 10
15 System.out.println(Integer.toString(17, 17)); // 10
16 System.out.println(Integer.toString(10, 17)); // a
17 System.out.println(Integer.toString(16, 17)); // g
18
19 // 查看Integer包装类的toString方法
20 //if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
21 // radix = 10;
22 // 查看Character包装类的字段
23 //public static final int MIN_RADIX = 2;
24 //public static final int MAX_RADIX = 36;
25
26 System.out.println("------------------------------------");
27
28 System.out.println(Integer.parseInt("2", 10)); // 2
29 System.out.println(Integer.parseInt("7", 8)); // 7
30 System.out.println(Integer.parseInt("F", 16)); // 15
31 System.out.println(Integer.parseInt("10", 16)); // 16
32
33 }
34 }
 1 package cn.temptation;
2
3 public class Sample05 {
4 public static void main(String[] args) {
5 /*
6 * 自动装箱(boxing) 和 自动拆箱(unboxing)
7 *
8 * 自动装箱:把基本数据类型装换为包装类类型(值类型----->引用数据类型)
9 * 自动拆箱:把包装类类型装换为基本数据类型(引用数据类型----->值类型)
10 */
11
12 // 自动装箱
13 Integer integer1 = new Integer(2);
14 System.out.println(integer1);
15
16 // 简化写法:把int类型的数字字面量直接赋值给Integer包装类的变量
17 Integer integer2 = 3;
18 // 通过反编译class文件,看到
19 // Integer integer2 = Integer.valueOf(3);
20 System.out.println(integer2);
21
22 System.out.println("---------------------------------------");
23
24 Integer integer3 = 4;
25 integer3 += 5;
26 // 通过反编译class文件,看到
27 // Integer integer3 = Integer.valueOf(4); // 自动装箱
28 // integer3 = Integer.valueOf(integer3.intValue() + 5); // 先做自动拆箱,拿着基本数据类型int和另一个基本数据类型int做加法,再做自动装箱
29 System.out.println(integer3);
30
31 System.out.println("---------------------------------------");
32
33 Integer integer4 = null;
34 System.out.println(integer4);
35 // 注意:37行语句上已经有警告:Null pointer access: The variable integer4 can only be null at this location
36 // 执行异常:java.lang.NullPointerException
37 // System.out.println(integer4.toString());
38
39 // 注意:41行语句上已经有警告:Null pointer access: This expression of type Integer is null but requires auto-unboxing
40 // 执行异常:java.lang.NullPointerException
41 // integer4 += 6;
42 // System.out.println(integer4);
43
44 // 对于包装类类型的对象进行非空验证
45 // 注意:47行语句上已经有警告:Dead code,因为eclipse判断了integer4就是null
46 if (integer4 != null) {
47 integer4 += 6;
48 System.out.println(integer4);
49 }
50 }
51 }
 1 package cn.temptation;
2
3 public class Sample06 {
4 public static void main(String[] args) {
5 // == 比较的是包装类对象的地址,自然不同;equals比较的是内容,自然相同
6 Integer integer1 = new Integer(127);
7 Integer integer2 = new Integer(127);
8 System.out.println(integer1 == integer2); // false
9 System.out.println(integer1.equals(integer2)); // true
10
11 System.out.println("----------------------------------------");
12
13 // == 比较的是包装类对象的地址,自然不同;equals比较的是内容,自然相同
14 Integer integer3 = new Integer(128);
15 Integer integer4 = new Integer(128);
16 System.out.println(integer3 == integer4); // false
17 System.out.println(integer3.equals(integer4)); // true
18
19 System.out.println("----------------------------------------");
20
21 Integer integer5 = 127;
22 Integer integer6 = 127;
23 System.out.println(integer5 == integer6); // true
24 System.out.println(integer5.equals(integer6)); // true
25
26 System.out.println("----------------------------------------");
27
28 Integer integer7 = 128;
29 Integer integer8 = 128;
30 System.out.println(integer7 == integer8); // false
31 System.out.println(integer7.equals(integer8)); // true
32
33 // 查看反编译后的class文件
34 // Integer integer5 = Integer.valueOf(127);
35 // Integer integer6 = Integer.valueOf(127);
36
37 // Integer integer7 = Integer.valueOf(128);
38 // Integer integer8 = Integer.valueOf(128);
39
40 // Integer.valueOf(127),传入127,使用byte缓冲区,所以使用==,比较的地址是同一个地址
41 // Integer.valueOf(128),传入128,使用new创建新的空间,所以使用==,比较的地址是不同的地址
42
43 // 推测可能是valueOf方法中的写法的差别
44 // 查看Integer类的valueOf方法源码
45 // public static Integer valueOf(int i) {
46 // if (i >= IntegerCache.low && i <= IntegerCache.high)
47 // return IntegerCache.cache[i + (-IntegerCache.low)];
48 // return new Integer(i);
49 // }
50
51 // 查看IntegerCache内部类的源码
52 // static final int low = -128;
53 // static final int high;
54 // static final Integer cache[];
55 // static {
56 // int h = 127;
57 // ...
58 // }
59 // high = h;
60
61 // IntegerCache内部类的cache范围:-128~127,也称为byte缓冲区/byte缓存区
62 }
63 }
 1 package cn.temptation;
2
3 public class Sample07 {
4 public static void main(String[] args) {
5 // 类 Character:在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。
6
7 /*
8 * Character类的构造函数:
9 * Character(char value) :构造一个新分配的 Character 对象,用以表示指定的 char 值。
10 *
11 * Character类的常用成员方法:
12 * 1、static boolean isUpperCase(char ch) :确定指定字符是否为大写字母。
13 * 2、static boolean isLowerCase(char ch) :确定指定字符是否为小写字母。
14 * 3、static boolean isDigit(char ch) :确定指定字符是否为数字。
15 * 4、static char toUpperCase(char ch) :使用取自 UnicodeData 文件的大小写映射信息将字符参数转换为大写。
16 * 5、static char toLowerCase(char ch) :使用取自 UnicodeData 文件的大小写映射信息将字符参数转换为小写。
17 */
18 Character character = new Character('a');
19 System.out.println(character); // a
20 System.out.println("------------------------------------");
21
22 System.out.println(Character.isUpperCase('A')); // true
23 System.out.println(Character.isUpperCase('a')); // false
24 System.out.println(Character.isLowerCase('A')); // false
25 System.out.println(Character.isLowerCase('a')); // true
26
27 System.out.println(Character.isDigit('1')); // true
28 System.out.println(Character.isDigit('a')); // false
29 System.out.println("------------------------------------");
30
31 System.out.println(Character.toUpperCase('a')); // A
32 System.out.println(Character.toLowerCase('A')); // a
33 }
34 }
 1 package cn.temptation;
2
3 import java.util.Scanner;
4
5 public class Sample08 {
6 public static void main(String[] args) {
7 // 需求:根据键盘录入的字符串(仅限大写字符、小写字符、数字字符),统计有多少个大写字符、多少个小写字符、多少个数字字符?(使用包装类)
8
9 String str = "";
10 // 大写字符个数
11 int upperCount = 0;
12 // 小写字符个数
13 int lowerCount = 0;
14 // 数字字符个数
15 int digitCount = 0;
16
17 System.out.println("输入一个字符串(仅限大写字符、小写字符、数字字符):");
18 Scanner input = new Scanner(System.in);
19 if (input.hasNextLine()) {
20 str = input.nextLine();
21 } else {
22 System.out.println("输入不正确!");
23 }
24 input.close();
25
26 char[] arrChar = str.toCharArray();
27
28 for (char item : arrChar) {
29 if (Character.isUpperCase(item)) {
30 upperCount++;
31 } else if(Character.isLowerCase(item)) {
32 lowerCount++;
33 } else if (Character.isDigit(item)) {
34 digitCount++;
35 }
36 }
37
38 System.out.println("字符串" + str + "中,大写字符有:" + upperCount + "个,小写字符有:" + lowerCount + "个,数字字符有:" + digitCount + "个");
39 }
40 }
 1 package cn.temptation;
2
3 public class Sample09 {
4 public static void main(String[] args) {
5 int[] arr1 = null;
6 System.out.println(arr1); // null
7 System.out.println("--------------------------------");
8
9 float[] arr2 = null;
10 System.out.println(arr2); // null
11 System.out.println("--------------------------------");
12
13 boolean[] arr3 = null;
14 System.out.println(arr3); // null
15 System.out.println("--------------------------------");
16
17 char[] arr4 = null;
18 // 执行异常:java.lang.NullPointerException
19 System.out.println(arr4);
20
21 // 查看反编译class文件,发现没有区别
22 // int arr1[] = null;
23 // System.out.println(arr1);
24 // System.out.println("--------------------------------");
25 // float arr2[] = null;
26 // System.out.println(arr2);
27 // System.out.println("--------------------------------");
28 // boolean arr3[] = null;
29 // System.out.println(arr3);
30 // System.out.println("--------------------------------");
31 // char arr4[] = null;
32 // System.out.println(arr4);
33
34 // 所以,推测打印方法println()是否有不同的处理
35 // 通过查看println()方法,可以看出,打印int[]、float[]、boolean[]数组,都是调用String的valueOf方法,打印出"null"
36 // 而打印char[]数组,调用write()方法,因为null没有相应的属性,所以使用时产生空指针异常
37
38 // public void println(Object x) {
39 // String s = String.valueOf(x);
40 // synchronized (this) {
41 // print(s);
42 // newLine();
43 // }
44 // }
45 //
46 // 调用String类的valueOf方法
47 // public static String valueOf(Object obj) {
48 // return (obj == null) ? "null" : obj.toString();
49 // }
50 //
51 // public void println(char x[]) {
52 // synchronized (this) {
53 // print(x);
54 // newLine();
55 // }
56 // }
57
58 // public void print(char s[]) {
59 // write(s);
60 // }
61 }
62 }