集合体系
Collection
概述:
- public interface Collection
extends Iterable - Collection 是 单列集合 的根接口
- Collection有两个重要的子接口,分别是List和Set接口
- JDK不提供此接口的如何直接实现,提供更具体的子接口(无序Set 有序List)实现
常用方法:
- boolean add(E e) 添加单个元素
- boolean remove(Object o) 从集合中移除指定元素
- void clear() 清空集合中的元素
- boolean contains(Object o) 判断集合中是否存在指定元素
- boolean isEmpty(Object o) 判断集合是否为空
- addAll() 添加多个元素
- containsAll() 查找多个元素是否存在
- removeAll() 删除多个元素
int size() 集合的长度,也是集合中元素的个数 :::
List接口
概述:
List接口下的集合是有索引的,所以List接口在继承Collection方法的基础上,还提供一些特有的方法,可以通过索引操作集合元素。
常用方法:
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
:::
ArrayList集合
概述:
- ArrayList实现了List接口
- ArrayList:底层数据结构是数组,查询快,增删慢
ArrayList的底层源码分析
- ArrayList底层是什么数据结构?
- ArrayList底层是一个Object数组:transient Object = elementData;
- 底层的数组的初始化长度是多少?
- 使用无参构造方法创建集合时,数组的初始长度为 0
- 使用带参构造方法创建集合时,数组长度由参数值指定
- 首次调用add方法添加元素的时候,数组的长度变为多少?
- 如果初始化的数组长度为0,首次添加元素时,长度会扩容为10
如果添加的元素超过数组长度,怎么办?
数组会自动扩容,长度在原来的基础上增加一半。 ::: ```java public static void main(String[] args) { //添加元素 ArrayList
sAL = new ArrayList<>(); sAL.add(new Student(“张三”, 19)); sAL.add(new Student(“李四”, 17)); sAL.add(new Student(“王五”, 17)); sAL.add(new Student(“赵六”, 18)); //索引为0的年龄 int minage = sAL.get(0).getAge();
for (int i = 0; i < sAL.size(); i++) {
int age = sAL.get(i).getAge();
if (age < minage) {
minage = age;
}
} System.out.println(minage);
//倒过来遍历防止漏删元素(List集合删掉一个后面元素会替换上) for (int i = sAL.size() - 1; i > 0; i—) {
if (sAL.get(i).getAge() == minage) { sAL.remove(i); }
} for (Student student : sAL) {
System.out.println(student);
} }
class Student { private String name; private int age; //构造方法 setget toString方法 }
<a name="Uw78N"></a>
### LinkedList集合
:::tips
<a name="dI95p"></a>
#### 概述:
- LinkedList的底层是一个双向链表,增删快,查询慢
- 双向链表可以快速对首尾元素进行操作,所以LinkedList中有很多进行首尾操作的API
<a name="HzcZA"></a>
#### 常用方法
- public void addFirst(E e) 在该列表开头插入指定元素
- public void addLast(E e) 将指定的元素追加到此列列表的末尾
- public E getFirst() 返回此列表中的第一元素
- public E getLast() 返回此列表中的最后一个元素
- public E removeFirst() 从此列表中删除并返回第一个元素
- public E removeLast() 从此列表中删除并返回最后一个元素
:::
```java
public static void main(String[] args) {
LinkedList<String> sLL = new LinkedList<>();
sLL.add("11");
sLL.add("22");
sLL.add("33");
System.out.println(sLL);
//头尾添加
sLL.addFirst("00");
sLL.addLast("44");
System.out.println(sLL);
//头尾删除
sLL.removeFirst();
sLL.removeLast();
System.out.println(sLL);
//头尾获取
System.out.println(sLL.getFirst());
System.out.println(sLL.getLast());
}
Vector
概述
- 底层是一个对象数组,protected Object[ ] elementData;
- Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
-
Collections工具类
概述:
Collections 类在java.util包中,是一个操作集合的工具类
- Collections 类提供了许多操作集合的静态方法,可以实现集合元素的排序、批量添加,替换等操作
常用方法:
addAll(Collection
shuffle(List<?> list) 随机打乱集合中元素的顺序
sort(List
sort(List
public static void main(String[] args) {
ArrayList<String> sAL = new ArrayList<>();
//Collections批量添加
Collections.addAll(sAL, "aa", "bb", "cc");
//Collections打乱顺序
Collections.shuffle(sAL);
//根据自然顺序对list集合的元素进行升序排序
Collections.sort(sAL);
//根据指定的比较器,对list集合元素进行自定义排序
sAL.sort((o1, o2) -> o2.charAt(0) - o1.charAt(0));
//Collections.sort(sAL, (o1, o2) -> o2.charAt(0) - o1.charAt(0));
sAL.forEach(System.out::println);
}
泛型
概述:
- JDK5中引入的特性,它提供了编译时类型安全检测机制
- java泛型可以保证如果编译时没有发出警告,运行时就不会产生ClassCastException异常
好处:
定义位置
- 定义在类后面(泛型类) ArrayList
- 定义格式:修饰符 class 类名<泛型标记> {}
- 泛型类在创建对象时确定泛型的真实类型
- 类中引用到泛型的地方都会替换成具体类型。
- 定义在接口后面(泛型接口)List
- 定义格式:修饰符 interface 接口名<泛型标记> {}
- 实现类实现接口时确定泛型
- 接口中引用泛型的地方会替换成具体类型
- 定义在方法声明上(泛型方法)
- 定义格式:修饰符 <泛型标记> 返回值类型 方法名(类型 变量名) {}
- 调用方法,传参时确定泛型类型
- 方法中引用泛型的地方会替换成具体类型
类型通配符 ?
- 当使用泛型的时候,无法确定泛型的具体类型时,可以使用通配符 ? 来表示某一种类型
类型通配符上下限
- ? super Car
- 泛型只能是Car或者Car的父类,规定了下边界
- ? extends Car
- 泛型只能是Car或者Car的子类,规定了上边界
:::
```java
public static void main(String[] args) {
box
stringbox = new box<>(); stringbox.setValue(“qwer”); System.out.println(stringbox.getValue()); }
- 泛型只能是Car或者Car的子类,规定了上边界
:::
```java
public static void main(String[] args) {
box
class box
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
}
```java
public static void main(String[] args) {
Integer[] arr1 = {1, 2, 3, 4};
ptintArray(arr1);
Double[] arr2 = {1.1, 1.2, 1.3, 1.4};
ptintArray(arr2);
String[] arr3 = {"1", "2", "3", "4"};
ptintArray(arr3);
}
public static <T> void ptintArray(T[] arr) {
System.out.println(Arrays.toString(arr));
}