包装类
8种基本类及其对应的包装类型
基本类型 | 包装类 |
---|---|
short | Short |
byte | Byte |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
- 基本数据类型都不是引用型,不继承任何类(包括Object);
- 包装类型都使用了 final 修饰,不能被继承重写,内部存储对应基本类型的值的成员变量也都是使用 final 修饰,不能修改其中存储的值,比如 Integer:private final int value;
拆箱、装箱
装箱:将基本类型的值转换为包装类型;拆箱:将包装类型转换为基本类型。
自动装箱:jvm根据需要自动将基本类型的值转换为包装类型;自动拆箱:jvm根据需要自动将包装类型转换为基本类型。
通过 == 比较包装类型和基本类型时,会先自动拆箱将包装类型转换为基本类型,再进行比较,如果包装类型为null,自动拆箱时会发生NPE。
类型转换
//整除,两个操作数都为整数时,结果舍弃小数、只保留整数部分
System.out.println(3/2);
//(目标类型) 类型转换
int a=(int)1.5;
//包装类型都提供了静态方法 parseXxx(String str) 将String类型转换为对应的基础类型
int integer1 = Integer.parseInt("1");
//包装类型、String都提供了静态方法valueOf(),把其它类型转换为目标类型
Integer integer2 = Integer.valueOf(10);
Integer integer3 = Integer.valueOf("10");
String str1=String.valueOf(1.5);
//包装类型、String都重写了根类Object的toString()方法,包装类型甚至还提供了静态的toString()方法
String str2 = integer2.toString();
String str3 = Integer.toString(2);
字符、字符串
1、String有空串"",char|Character有空字符 ‘\u0000’。在java中,2个单引之间必须要有字符、不能直接就是’‘,即不存在’'这种字符。
2、转义字符被认为是一个字符,第一个\只是用于表示转义。
//空串
String str = "";
//空字符
char char2 = '\u0000';
//空格字符
char char1 = ' ';
//转义字符
char char1 = '\\';
char char2 = '\n';
各类型的默认初始值
- 引用类型(包括String):默认初始值为null。
- 基本类型:整型默认初始值为0,浮点型默认初始值为 0.0,布尔型默认初始值为 false,char默认初始值为空字符 ‘\u0000’,对应常量 Character.MIN_VALUE,注意是空字符,!= null、空串、空格串。
整数默认为int,设置为long需要加后缀 L;小数默认为double,设置为float需要加后缀 F。
数组
元素的数据类型要相同
一维数组
// 静态初始化一个数组
int[] arr = new int[]{1, 2, 3, 4, 5};
// 可简写为
int[] arr = {1, 2, 3, 4, 5};
// 动态初始化一个数组,指定数组长度
int[] arr2 = new int[5];
arr2[0] = 1;
// 遍历时只能访问元素的值,不能修改
for(int ele : arr1){
}
数组创建后
- 容量|长度就固定了、不可改变,如果需要扩容,可以复制元素到新数组中。
- 未手动赋值的元素,会自动初始化为对应类型的默认值,length获取的是数组的容量,不是手动赋值的元素数量。
二维数组
每行的元素个数可不同
// 静态初始化一个二维数组,每行都是一个一维数组
int[][] arr1 = new int[][]{
{1, 2},
{1, 2, 3},
{1, 2, 3, 4, 5}
};
// 动态初始化一个二维数组,只需指定行数,列数可缺省,也可写上,以后再逐个赋值
int[][] arr2 = new int[3][];
数组工具类 Arrays
数组转其它类型
//数组转list,参数可以写成数组、参数个数不定的形式
List<String> list1 = Arrays.asList(arr);
List<String> list2 = Arrays.asList("zhangsan", "lisi", "wangwu");
//数组转stream
Stream<String> stream = Arrays.stream(arr);
//将数组转换为易于理解的String,便于打印、阅读
String arrStr = Arrays.toString(arr);
//将String数组|list中的元素拼接为一个String,可以使用stream,也可以使用String的静态方法join
String join1 = list.stream().collect(Collectors.joining(","));
//第二个参数是 Iterable<CharSequence>
String join2 = String.join(",", list);
填充、复制
//填充数组,会把数组元素都设置为指定值,不管该位置是否有值(有值即替换)
Arrays.fill(arr, "xxx");
//可以指定填充范围 [fromIndex,toIndex)
Arrays.fill(arr, 0, 3, "xxx");
//参数指定:源数组、要复制的元素个数(目标数组长度)。源数组的元素数量不足时,取对应类型的默认初始值,eg. int是0、引用型是null
int[] arr1 = Arrays.copyOf(arr, arr.length);
//可以指定复制的元素范围 [from,to)
int[] ints = Arrays.copyOfRange(arr, 0, 2);
数组比较
//比较2个数组是否相等,先比较是否是同一个数组(内存地址是否相同),如果不是再比较元素数量,如果相同再equals逐个比较元素
boolean equals = Arrays.equals(arr1, arr2);
//递归比较,如果数组的元素还是数组,也会递归比较其中的元素
boolean deepEquals = Arrays.deepEquals(arr1, arr2);
排序
//是直接在原数组上进行排序,数组自身改变
//默认自然排序、升序
Arrays.sort(arr);
//可指定排序区域,只对指定区域上的元素进行排序
Arrays.sort(arr, 2, 5);
//可指定排序方式、自定义排序
//第二个参数为 Comparator<T> 接口实例,T为数组元素类型,显式使用Comparator(泛型)时,数组元素类型不能声明为int、float之类的基本类型
Arrays.sort(arr, Comparator.comparing(User::getAge));
Arrays.sort(arr, Comparator.comparing(User::getAge, Comparator.naturalOrder()));
Arrays.sort(arr, Comparator.comparingInt(User::getAge));
//parallelSort() 使用方式和sort相同
二分搜索
//二分搜索的使用前提是数组有序,所以需要先使用sort()之类的方法对数组排序,否则结果存在问题
//如果数组中不存在指定元素,返回-1;如果数组中存在多个指定元素,无法保证返回其中哪一个的下标
int index1 = Arrays.binarySearch(arr, "zhangsan");
//可以指定检索范围 [fromIndex,toIndex)
int index2 = Arrays.binarySearch(arr, 0, 3, "zhangsan");
以parallel开头的方法和不带此前缀的方法使用方式、效果相同,只是parallel系列方法通过cpu并行,数据量较大时可以提高效率。