特点、特有方法
ArrayList : 有序、可重复、有索引。
LinkedList:有序、可重复、有索引。
底层实现不同!适合场景不同!
List 集合的特有方法
List 集合因为支持索引,所以多了很多索引相关的方法,当然,Collection的功能List也都继承了。
方法名称 | 说明 |
---|---|
void add(int index, E element) | 在此集合中指定位置插入指定元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index, E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
public class ListTest1{
public static void main(String []args)
{
//1、创建一个ArrayList集合对象(有序、可重复、有索引)
List<String> list = new ArrayList<>();
list.add("蜘蛛精");
list.add("至尊宝");
list.add("至尊宝");
list.add("牛夫人");
System.out.println(list);//[蜘蛛精、至尊宝、至尊宝、牛夫人]
//2、public void add (int index,E element): 在某个索引位置插入元素
list.add(2,"紫霞仙子");
System.out.println(list);
//3、public E remove(int index) 根据索引元素,返回被删除的元素
System.out.println(list.remove(2));
System.out.println(list);
//4、public E get(int index) 返回集合中指定位置的元素。
System.out.println(list.get(3));
//5、public E set(int index,E element) :修改索引位置处的元素,修改成功后,会返回原来的数据
System.out.println(list.set(3,"牛魔王"));
System.out.println(list);
}
}
1、ArrayList 集合的底层原理
基于数组实现
数组的特点:
查询速度快注意:是根据索引查询数据快查询数据通过地址值和索引定位,查询任意数据耗时相同。
删除效率低:可能需要把后面很多的数据进行前移
添加效率极低:可能需要把后面很多数据后移,再添加元素;或者也可能需要进行数组扩容。
1、利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组
2、添加第一个元素时,底层会创建一个新的长度为10的数组
3、存满时,会扩容1.5倍
4、如果一次添加多个元素,1.5倍还放不下,则创建新数组的长度以实际为标准
List<String> list1 = new ArrayList<>();
list1.add("a");
...
List<String> list2= new ArrayList<>();
list2.add("all");
...
list1.addAll(list2); //把集合list2的数据全部倒入到list1集合
2、ArrayList集合适合的应用场景
1、ArrayList适合:根据索引查询数据,比如根据随机索引取数据(高效)!或者数据量不是很大时!
2、ArrayList不适合:数据量很大的同时,又要频繁进行增删操作!
3、LinkedList集合的底层原理
基于双链表实现的。
1、什么是链表?有什么特点?
单项列表
链表中的结点是独立对象,再内存中是不连续的,每个结点包含的数据值和下一个结点的地址。
链表的特点1:查询慢,无论查询那个数据都要从头开始找。
链表的特点2:链表的增删相对快
双向列表
特点:查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的。
LinkedList新增了:很多首位操作的特有方法。
方法名称 | 说明 |
---|---|
public void addFirst(E e ) | 在该列表开头插入指定的元素 |
public void addLast(E e ) | 将指定的元素追加到此列表的末尾 |
public E getFrist() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E remoceLast() | 从此列表中返回最后一个元素 |
LinkedList的应用场景之一:可以用来设计队列先进先出,后进后出。
public class ListTest3
{
public static void main(String[] args)
{
//1、创建一个队列
LinkedList<String> queue = new LinkedList<>();
queue.addLast("第1号人");
queue.addLast("第2号人");
queue.addLast("第3号人");
queue.addLast("第4号人");
System.out.println(queue);
//出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
}
}
LinkedList的应用场景之一:可以用来设计栈后进先出