文章目录
- 集合
- 特点(从整体性来看)
- 区别
- List接口
- (一)实现类:ArrayList
- (二)实现类:LinkedList
集合
- java集合可分为Set、List、Queue和Map四种体系。
- 其中List、Set、Queue均继承自Collection接口
特点(从整体性来看)
- 不固定大小
- 不固定元素类型
- 多样的实现:如List、Set、Map等,每种都有其特定的特性,后续文章会说明
- 可以使用泛型来指定其存储元素的类型
- 支持迭代器
区别
- 集合与数组的比较
数组int[] | 集合 | |
---|---|---|
长度 | 固定 | 可变 |
内容类型 | 基本类型&引用类型 | 引用类型 |
内容 | 必须为同一种类型 | 可以存储不同类型的(一般是同一种) |
元素多少 | 无法获知,length只是容量 | 通过size()方法获取 |
实现方式 | 顺序表 | 有链表和数组等 |
List接口
(一)实现类:ArrayList
-
特点
- ArrayList是List接口的一个实现类
- ArrayList内部封装了一个Object类型的对象
- ArrayList是动态数组,初始长度为10,可动态扩容
- ArrayList线程不安全
-
ArrayList集合的一些方法
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; public class Main { public static void main(String[] args) { Random random = new Random(); List<Integer> list = new ArrayList<>(); for(int i=0;i<20;i++){ // .add(Object element) 向列表的尾部添加指定的元素。 list.add(random.nextInt(100) ); } // .iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器。 Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+" "); } // .size() 返回列表中的元素个数。 System.out.println(list.size()); // .get(int index) 返回列表中指定位置的元素,index从0开始。 System.out.println(list.get(12)); // .add(int index, Object element) 在列表的指定位置(从0开始)插入指定元素 list.add(0,99999); // .set(int i, Object element) 使用元素element替换索引i位置的元素,并返回替换元素。 list.set(1,66666); // .isEmpty() 判断列表是否包含元素,不包含元素则返回 true,否则返回false。 System.out.println(list.isEmpty()); // .contains(Object o) 如果列表包含指定的元素,则返回 true。 System.out.println(list.contains(99999)); // .remove(int index) 移除列表中指定位置的元素,并返回被删元素,删除位置后面的元素(如果有)向前移动。 list.remove(19); // 删除的是索引为19的值 // .remove(Object o) 从List集合中移除第一次出现的指定元素,移除成功返回true,否则返回false。当且仅当List集合中含有满(o==null ? get(i)==null : o.equals(get(i)))条件的最低索引i的元素时才会返回true。 System.out.println(list.indexOf(12)); // 获取元素的索引值 int element = 19; list.remove(element); // 如果要删除的元素也是Integer的时候,需要这么操作。这个删除的是值19 // .clear() 从列表中移除所有元素。 list.clear(); } } ----------补充两个解决线程不安全的方法------------- List<Integer> list = new ArrayList<>(); // 上边所用 // 方法一 List<Integer> list = Collections.synchronizedList(new ArrayList<>()); // 方法二 List<Integer> list = new CopyOnWriteArrayList<>();
1、运行结果自己看吧,这里就不放了
2、注意remove方法,如果数组中的元素类型也正好是Integer时,需要对删除的这个元素外部创建个对象。
3、自己去试试这个线程安全的方法吧 -
时间复杂度
1、末尾添加add(),平常是O(1),如果数组扩容,则为O(N)
2、指定位置插入add()、删除指定位置元素remove(),移动元素,平均为O(N)
3、获取指定位置元素get()、替换指定位置元素set(),为O(1)
(所说的查询快)
4、查找元素contains()、查找元素索引indexOf(),为O(N)
(二)实现类:LinkedList
-
特点
- LinkedList是List接口的一个实现类
- LinkedList内部封装了一个双向链表
- LinkedList的增删快,查询慢
- LinkedList线程不安全
-
LinkedList集合的一些方法
import java.util.LinkedList; import java.util.Random; public class TestLinkedList { public static void main(String[] args) { LinkedList list = new LinkedList<>(); // add(Object element) 它将元素附加到列表的末尾。返回类型为boolean Random random = new Random(); for(int i=0;i<20;i++){ list.add(random.nextInt(100)); } System.out.println(list); // add(int index,Object element),指定位置插入。返回类型为boolean list.add(1,999); // addFirst(E element),元素附加到列表的头部。方法返回为为void list.addFirst(8888); // addLast(E element) 元素附加到列表的尾部。方法返回为void list.addLast(66666); System.out.println(list); // get(int index) 根据下标获取数据。返回类型为元素的类型 System.out.println(list.get(1)); // getFirst() 它返回链表的第一个元素 System.out.println(list.getFirst()); // getLast() 它返回链接列表的最后一个元素 System.out.println(list.getLast()); // contains(Object element)如果元素存在于列表中,则返回true。 System.out.println(list.contains(12)); // set(int index,Object element)它用于用新元素替换列表中的现有元素。返回类型为修改前的元素 System.out.println(list.set(20,222222)); // remove() 删除第一个元素并返回 System.out.println(list.remove()); // remove(int location) 删除指定位置的元素并返回该元素 System.out.println(list.remove(3)); // removeFirst() 删除并返回链接列表的头部一个元素 System.out.println(list.removeFirst()); // removeLast() 删除并返回链接列表的尾部一个元素 System.out.println(list.removeLast()); // iterator接口 Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.print(iterator.next()+" "); } // size() 获取链表长度 System.out.println(list.size()); // clear():它删除列表中的所有元素 list.clear(); } }
1、方法都比较简单,可以复制自己运行吧
2、注意set方法,返回的数值是修改前的值
3、解决线程不安全的方法同上ArrayList -
时间复杂度
1、插入add()、删除remove()、长度size()时间复杂度:O(1)
2、查找get()时间复杂度为O(N)