1.集合架构
如图所示,集合下面分为单列集合Collection和双列集合Map,而在单列集合下面又有两个子接口List和Set,如图上所说两个子接口的特征又不一样,首先是List里面的元素是有序且可重复的,而Set恰恰和它相反是无序且不可重复的。
在List接口下面又三个实现类,分别是底层是数组的ArrarList和Vector,还有就是底层是链表的LinkedList,在这里需要注意一下这三者是使用频率是有区别的,其中ArrayList使用的最多,原因是因为他的底层是数组所以查找起来很快,在开发中查询使用的比较多,当然ArrayList也有缺点,就是增删比较慢。其次就是LinkedList,它的底层是链表所以查找起来比较慢,但增删比较快,只需找到前置结点和后继结点,最后就是Vector,虽然它的底层也是数组但它是线程安全的,所以效率比较低。
二.怎样学习集合
学习一个接口或者一个类无非就是学习它下面的方法,而List和Set通过继承Collection,也全部重写了它当中的抽象方法,所以我们只学习List和Set下面的方法就行了。
List下面的方法:
Collection下面的方法List肯定有的,因为是继承关系。上午讲了Collection下面的方法,在List中也可以用。接下来咱们讲List独有的方法。
List独有的方法:
增:
void add(int index, E e);在指定的位置上插入一个元素
boolean addAll(int index, Collection<? extends E> e);将一个集合插入到另外一个集合的指定的位置
删:
Collection删除的时候,通过元素来删除的。 remove(Object obj)
E remove(int index);通过索引来删除指定的元素。返回的是被删除的元素
改:
E set(int index, E e); 通过指定的索引修改数据元素,返回值是被修改的原数据
查:
E get(int index); 通过索引下标去获取指定元素
int indexOf(Object obj);通过元素获取指定的下标的
int lastIndexOf(object obj);通过元素获取最后一次出现的元素的下标
List<E> subList(int formIndex, int toIndex);截取一部分出来
import java.util.ArrayList;
import java.util.List;
public class Demo1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");
//有序的 可重复的
System.out.println(list);//[张三, 李四, 王五, 张三]
list.add(2, "狗蛋");
System.out.println(list);
List<String> list1 = new ArrayList<>();
list1.add("麻子");
list1.add("赵四");
list1.add("贝贝");
list.addAll(1, list1);
System.out.println(list);
System.out.println(list.remove(0));//在删除
System.out.println(list);//目的是删除以后的集合的数据展示一下
//[麻子, 赵四, 贝贝, 李四, 狗蛋, 王五, 张三]
System.out.println(list.set(2, "彩云"));//贝贝
System.out.println(list);//修改之后的集合
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
//System.out.println(list.get(89));
System.out.println(list.indexOf("麻子"));//0
list.add(2, "张三");
System.out.println(list.lastIndexOf("张三"));//7
System.out.println(list);
List<String> strings = list.subList(3, 5);
System.out.println(strings);
}
}
Set集合:
Set接口有两个实现类:
HashSet:
依靠hash值进行存储的,如果两个元素hash值一样的话,就不再存储了
TreeSet:
底层是二叉树,对存储数据进行自然排序
它下面的方法和ArrayList下面的方法很像。
三.ArrayList和LinkedList和Vector的区别
ArrayList和Vector 底层是数组,但是Vector是线程安全的,所以效率底,开发中不用Vector
接下来介绍ArrayList和linkedList区别:
1.ArrayList底层是数组
LinkedList底层是双向链表
2.ArrayList 的特征:
查询快: 底层是索引,有序的通过内存有序地址,直接找到 时间复杂度 o(1)
增删慢: 增加数据和删除数据有可能扩容。每次扩1.5倍。扩容的话,浪费内存浪费时间o(n)
3.LinkedList的特征:
查询慢:底层是二分法查找的算法 时间复杂度是log以2为底 n的对数
增删快:直接找前置结点 Node prev,后继结点 Node next
。时间复杂度是 o(1)
所以开发时候的用ArrayList
后续还要学习ArrayList的源码