java.util中包含一个集合框架 里面内置了很多的数据结构 比如:ArrayList、List、HashMap等等
数据结构是储存和组织数据的方式 但是这边我们重点讲的是如何使用 而并非如何实现 我以往的笔记中有讲到如何实现
1.无法动态扩容
在数组创建以后 就不能随意修改数组容量
2.操作元素过程中不够面向对象
数组内置的数组操作太少了 所以不够面向对象 比如不能够如ArrayList一样通过remove(int index)删除指定位置处的元素
这样一对比的话 那么动态数组的好处自然就多了:
1.他是一个可以动态扩容的数组
2.他里面封装了很多操作数组元素的方法
以下是一个案例:
如果对一个原始类型进行数组的添加操作的话 那么他支持添加所有类型的元素 因为原始类型会将泛型替换成Object类型 但是其实这种做法不推荐 推荐的是写明泛型的具体类型
list1.retainAll(list2)强调删除list1中除了list2以外的所有元素
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(11);
list1.add(22);
list1.add(33);
List<Integer> list2 = new ArrayList<>();
list2.add(22);
list2.add(44);
list1.retainAll(list2);
System.out.println(list1);
}
}
我们可以从结果得出 list1真的删除了list2以外的所有元素
该方法就是将动态数组转换成普通数组
根据对象数组的特点 我们不能够让子类引用指向父类对象
下面这个代码是可以编译通过的 我想提一嘴的就是 toArray()方法的返回值是Object[]类型
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
Object[] array1 = list.toArray();
System.out.println(array1);
System.out.println(Arrays.toString(array1));
}
}
由于toArray()的返回值是Object[]类型的 所以你不能够将其赋值给Integer[]类型的数组 就算强转也不行 是因为子类引用不能够指向父类对象 否则会报ClassCastException异常
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
Integer[] array1 = (Integer[])list.toArray();
System.out.println(array1);
System.out.println(Arrays.toString(array1));
}
}
但是如果非要将Object类型的数组赋值给Integer类型的数组 也不是不行 toArray有一个重载方法 支持传入一个类型参数(泛型) 返回相同类型的返回值
我们只需要传入一个没有开辟空间的Integer数组即可 那么现在就可以返回一个Integer类型的数组 也无需进行强转操作了
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
Integer[] array1 = list.toArray(new Integer[0]);
System.out.println(array1);
System.out.println(Arrays.toString(array1));
}
}