文章目录
ArrayList
List接口
Vector
LinkedList
ArrayList
概述
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现
List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector类,除了此类是不同步的。)
数据结构: 数据的存储方式
和集合相关的数据结构: 数组 栈 队列 链表 哈希表 二叉树
主要是观察集合的add方法
特点:
- 底层数据结构是数组。
- 增删效率低,改查效率高。
- 能够存储null值。
- 线程不安全,效率高可以通过
Collection.Collections.synchronizedList()
;变安全。 - 有索引,能够方便检索。
- 元素可重复,我们可以通过选择排序去重复(添加一组不重复的元素)。
- 不可以排序,但是可以通过
Collections.sort();
方法排序
Collection.Collections.synchronizedList()方法的使用
List list = Collections.synchronizedList(new ArrayList<>());
list.add(1);
list.add(2);
list.add(3);
synchronized (list){
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
为什么只锁遍历的代码?经过看源码发现add方法已经锁过了,无需再锁。
Java中Collections.sort()的使用!
在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提共了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。
怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口啦。然后重写里面的。
public class Student implements Comparable<Student>{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Student o) {
//降序
//return o.age - this.age;
//升序
return this.age - o.age;
}
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student(1,"25"));
list.add(new Student(3,"21"));
list.add(new Student(2,"18"));
list.add(new Student(4,"32"));
list.add(new Student(5,"36"));
list.add(new Student(6,"16"));
System.out.println("排序前:");
for (Student student : list) {
System.out.println(student.toString());
}
Collections.sort(list);
System.out.println("默认排序后:");
for (Student student : list) {
System.out.println(student.toString());
}
}
}
这里说一下重写的 public int compareTo(Student o){}
这个方法,它返回三种 int
类型的值: 负整数,零 ,正整数。
返回值 | 含义 |
---|---|
负整数 | 当前对象的值 < 比较对象的值 , 位置排在前 |
零 | 当前对象的值 = 比较对象的值 , 位置不变 |
正整数 | 当前对象的值 > 比较对象的值 , 位置排在后 |
这个时候需求又来了,默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了。
Comparator 的使用有两种方式:
Collections.sort(list,Comparator<T>)
;
list.sort(Comparator<T>)
;
其实主要是看 Comparator 接口的实现,重写里面的 compare 方法。代码如下:
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId-o2.getId;
}
});
compare(Student o1, Student o2)
方法的返回值跟 Comparable<>
接口中的 compareTo(Student o)
方法 返回值意思相同。另一种写法如下:
//自定义排序2
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() - o2.getId();
}
});
去重复
- 创建一个新集合
List list = new ArrayList();
list.add(2);
list.add(1);
List list2 = new ArrayList();
list2.add(1);
for (Object o : list) { //遍历旧集合,看新集合中是否包含旧集合的内容
if (!list2.contains(o)){
list2.add(o);
}
}
for (Object o : list2) {
System.out.println(o);//遍历新集合
}
- 选择排序思想去重复
Vector
类似于ArrayList,底层数据结构是数组,插入和移除性能较差,线程安全,效率低。
特点:
- 底层数据结构是数组
- 有索引,能够方便检索
- 增加和删除的效率低,查询和修改的效率高
- 线程安全,效率低
- 能够存储 null 值
- 元素可重复【我们自己可以通过选择排序思想去除重复元素】
- 不可以排序,但是可以通过 Collections.sort();方法排序
Vector类特有功能
1.public void addElement(E obj) 添加元素 obj 到集合中
2.public E elementAt(int index) 获取指定索引 index 的元素
3.public Enumeration elements() 使用 Enumeration 迭代器遍历集合中的元素
ArrayList和Vector的区别?
- Vector的方法都是同步的,线程安全的,但是线程的同步必然会影响到性能,所以ArrayList效率比Vector高
- 当两者中的元素超过他们的初始大小时,Vector会以2倍扩容,但是ArrayList以1.5倍扩容,这样ArrayList有利于节约内存空间。
LinkedList
特点:
-
底层数据结构是链表。
-
链表的特点是有序,查找跟修改的效率低,增加跟删除效率高。
-
可以存储null值。
-
线程不安全。
-
允许重复。
-
不可排序
特有方法:
- void addFirst(E e)
- void addLast(E e)
- E getFirst()
- E getLast()
- E removeFirst()
- E removeLast()