目录
集合
首先提个问题:集合是干什么的?
字面上呢就是一个存放引用数据类型的一个容器,集合中存放的是引用类型(对象的内存地址),集合不能储存基本数据类型,如果你看到了那就是系统自动进行装箱拆箱操作了主要是方便我们操作数据的。
集合分为两个:
一:Collection<E>,存放单只的最大父接口
List<E>:线性表:和数组类似,List可以动态增长,查找元素效率高,插入删除元素的效率低,因为会引起其他的元素位置的改变。------是一个泛型
Set<E>:也是线性表,检索元素效率低,删除和插入的效率高,插入和删除不会使元素移位。-----也是一个泛型
二:Map<K,V>,存放对值的最大父接口
Map(映射)用于保存具有映射关系的数据,Map保存着两组数据,key和value key和value都可以是任意的引用数据类型,但key是不能重复的。
List集合
一:ArrayList集合
- 内部结构是一个动态的Object[]的数组
- 默认的容量为10,在添加第一个元素时将这个默认容量添加给底层数组。
- 扩容:扩容1.5倍
常用方法:
首先先创建一个集合
List<E> list=new ArrayList<>();(利用多态,向上转型)
list.add(E e) | 向list里添加元素,元素可以是null,元素可以重复添加 |
list.addAll(list2) | 将list2添加到list后面 |
list.get(int index) | 从List里获取下标为index的元素 |
list.remove(int index) | 从List里删除下标为index的元素 |
list.removeAll() | 删除List里所有元素 |
list.contains(E e) | 判断list集合里是否有e元素 |
list.isEmpty() | 判断list集合是否为空 |
List.of(数组) | 把这个数组当作一个元素存到集合中(数组转集合) |
List集合中存放的数据的特点:
1.数据有顺序,按照添加的顺序排列
2.数据可以重复
用List集合写一个工具类用于数组与List之间的转换:
public class ArrayConvertUtil {
public static Object[] toArrayConvert(List list){
// return list.toArray();
Object[] objects=new Object[list.size()];
for (int i = 0; i <list.size() ; i++) {
objects[i]=list.get(i);
}
return objects;
}
public static List toListConvert(Object [] arr){
// return List.of(arr);
List list = new ArrayList(arr.length);
for (Object o : arr) {
list.add(o);
}
return list;
}
}
二:LinkedList集合
- LinkedList底层采用双向链表的结构,比较适合做高频率的新增和删除。不适合检索元素(链表的特点)
- 无默认容量
三:Vertor集合
- 底层采用的是数组结构。
- 默认容量为10
- 扩容:扩容为原来的2倍。
Vertor中的方法都是被synchronized所修饰的,这就代表了他的效率会比较低
三种集合的区别:(面试题)
ArrayList和LinkedList的区别:
ArrayList是基于动态数组实现的集合,LinkedList是基于双链表实现的集合。
查找时ArrayList速度比LinkedList快,增加或删除时LinkedList比ArrayList速度快
ArrayList是通过下标找到元素,LinkedList是移动指针遍历每个元素找到需要的元素
相同点:
都是线程异步的不安全线程的集合,都实现了List接口(继承了Collection)
ArrayList与Vector的区别:
ArrayList:线程异步,线程不安全,性能高
Vertor:线程同步,线程安全,性能低
相同点:
都实现了List接口,都是有序集合。
Collection和Map的区别:一个是单向链表,一个是双向链表。