文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7d9309d3aabbe26f642f8fc0d9384ac.png)
1. 数组为什么特殊
- 数组与其他种类的容器之间的区别有三方面:效率、类型和保存基本类型的能力
- 在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式
- 数组就是一个简单的线性序列,这使得元素访问非常快速
- 因为速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变
2.数组是第一级对象
-
无论使用哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用
-
只读length只表示数组能够容纳多少元素,而不是实际保存元素个数
-
“[ ]”语法是访问数组对象唯一方式
-
对象数组和基本数组的区别:
- (1) 对象数组保存的是 引用
- (2) 基本类型数组保存的是 基本类型的值
- (1) 引用 自动初始化为:null
- (2) 基本类型中是数值型的 自动初始化为:0
- (3) 字符型(char)自动初始化为:(char)O
- (4) boolean 自动初始化为:false
- (1) Integer[] a;
- (2) Integer[] b = new Integer[5];
- (3) a = new Integer[]{1,2,3,4};
- (4) a = {1,2,3,4};
3.返回一个数组
- 在Java中,可以直接返回数组,且数组待你使用完,垃圾回收器才会清理它
4.多维数组
- 对于基本类型的多维数组,可以通过使用花括号将每个向量分隔开
- Arrays.deepToString()
- (1) 可以将多维数组转换成多个String打印
- (2) 这个方法对基本类型数组和对象都起作用
- 粗糙数组:数组中构成矩阵的每个向量都可以具有任意长度
- 自动包装机制对数组初始化器也起作用
5.数组与泛型
- 不能实例化具有泛型的数组
- 擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型,以强制保证类型安全
- 你可以参数化数组本身的类型
- 使用参数化方法而不使用参数化类的方便之处在于:你不必为需要应用的每种不同的类型都使用一个参数去实例化这个类,并且你可以将其定义为静态
- 你不能创建实际的持有泛型的数组对象,但是你可以创建 非泛型的数组,然后将其转型
List<String>[] ls;
List[] la = New List[10];
ls = (List<String>[]) la;
ls[0] = new ArrayList<String>();
6.创建测试数据
- Arrays.fill()
- (1) 只能用同一个值填充各个位置,而针对对象而言,就是复制同一个引用进行填充
- (2) 对某个区域进行填充
- (3)例如:
String[] c = new String[3];
Arrays.fill(c, 'a'); //[a,a,a]
Arrays.fill(c,1,2,'b'); //[a,b,a] 或 Arrays.fill(c,1,3,'b'); //[a,b,b]
7.Arrays实用功能
- (1) equals():比较两个数组是否相等(deepEquals()比较多维数组)
- (2) fill():见第六节
- (3) sort():对数组排序
- (4) binarySearch():在已排序的数组中查找元素
- (5) toString():产生数组的String表示
- (6) hashCode():产生数组的散列码
- (7) asList():接受任何序列或数组作为其参数
System.arraycopy(Object src, int srcPos, Object dest, int destPos,int length)
- (1) 用它复制数组比用for循环要快很多
- (2) 参数
- i.src:要复制的数组(源数组)
- ii.srcPos:复制源数组的起始位置
- iii.dest:目标数组
- iv.destPos:目标数组的下标位置
- v.length:要复制的长度
- (3) 浅复制:如果复制对象数组,只复制对象引用
- (4) 不会执行自动包装和在自动拆包,两个数组必须具有相同的确切类型
- (1) Arrays.equals(a1, a2);
- (2) Arrays类提供了重载后的equals()方法
- (3) 数组相等的条件是元素个数必须相等,并且对应位置的元素也相等
- (4) 对于基本类型,需要使用基本类型的包装器类的equals()方法,例如,对于int类型使用Integer.equals()作比较
- (1) 排序必须根据对象的实际类型执行比较操作
- (2) Java有两种方式来提供比较功能
- i.实现java.lang.Comparable接口
- 只有一个compareTo()方法,此方法接受另一个Object为参数
- 当前对象 > 参数,返回正值
- 当前对象 = 参数,返回0
- 当前对象 < 参数,返回负值
- 只有一个compareTo()方法,此方法接受另一个Object为参数
- ii.实现Comparator接口,利用Collections类的reverseOrder()方法
- 该方法可以产生一个Comparator,它可以反转自然的排序顺序
- i.实现java.lang.Comparable接口
- (3) 实现Comparator的public int compare(Pet o1, Pet o2) {}
- (4) 实现Comparable的public int compareTo(Pet o) {}
- (1) 使用内置的排序方法,就可以对任意的基本类型数组排序;也可以对任意的数组对象进行排序,只要该对象实现了Comparable接口或具有相关联的Comparator
- (2) 排序三种形式
Arrays.sort(sa); // 字典排序,大写字母在前,小写字母在后
Arrays.sort(sa, Collections.reverseOrder()); //反序
Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER); //忽略大小写的字典排序
- (3) 排序算法
- i.基本类型:快速排序
- ii.对象类型:归并排序
-
(1) 使用Arrays.binarySearch()前要使用Arrays.sort()排序
-
(2) binarySearch()
- i.返回大于等于零(元素算在下标)
- ii.返回负值:“ —(插入点)” 例如:“-1”,表示第一个大于查找对象的元素在数组中位置
- iii.如果数组中所有元素都可小于查找的对象,(插入点)就等于a.size()
-
(3) 如果使用Comparator拍虚了某个对象数组(基本类型数组无法使用Comparator排序),在使用binarySearch()时必须提供同样的Comparator(使用binarySearch()重载版本)
Arrays.binarySearch(sa,sa[10],String.CASE_INSEITIVE_ORDER)