List接口本身常用的方法
List集合存储的特点:
(1)有序(有下标),可重复
(2)List集合中的元素有下标,从0开始,
List既然是Collection接口的子接口,那么肯定List接口有自己"特色"的方法。
以下记录List接口的常用方法:
(1)boolean add(int index, element) - 不常用,效率较低。
向集合指定位置插入元素 。
public class A extends B {
public static void main(String[] args) {
List l = new ArrayList();
l.add(1);
l.add(2, 10);
System.out.println(l.get(1)); // 10
}
}
(2)get ( int index )
public class A extends B {
public static void main(String[] args) {
List l = new ArrayList();
l.add(1);l.add(2);
int len = l.size();
for(int i = 0; i < len; i ++) {
System.out.println(l.get(i));
}
}
}
(3)indexOf ( Object o )
指定对象第一次在集合中出现的索引。
(4)lastIndexOf ( Object o )
指定对象最后一次在集合中出现的索引。
(6)remove ( int index )
删除指定下标位置的元素。
(5)set ( int index, Object element )
修改指定下标的位置的元素。
public class A extends B {
public static void main(String[] args) {
List l = new ArrayList();
l.add(1);l.add(2);
l.set(0, 10);
System.out.println(l.get(0)); //10
}
}
List接口下的ArrayList、LinkedList类的常用方法
一、ArrayList集合
特点:
(1)它的初始化容量为10(底层会先创建一个长度为0的数组,当添加第一个元素的时候,初始化容量为10)
(2)ArrayList底层是一个Object类型的数组
(3)ArrayList的构造方法,如果无参,默认初始化容量为10;也可以有参,默认初始化容量为传的参数
源码,会new一个Object类型的数组,把参数作为数组长度,赋值给ArrayList。
例:
public class A extends B {
public static void main(String[] args) {
// 默认初始化微量为10
ArrayList l = new ArrayList();
// 指定初始化容量
ArrayList l1 = new ArrayList(100);
}
}
(4)一个集合重要的优化策略:ArrayList的扩容是原容量的1.5倍,尽可能少的扩容,因为数组扩容效率比较低,建议在使用ArrayList的时候,预估计一个元素个数,给定一个初始化容量。
(5)面试中最长问的:集合中用哪个用的最多
答:ArrayList
因为数组的检索效率比较高,内存地址连续的,而且向数组末尾添加元素,效率很高,但是缺点:随机的增删元素,效率比较低!另外数组无法存储大数据量的数据。
(6)ArrayList是非线程安全的。
(7)把ArrayList变为线程安全的。
使用Collections 工具类:
import java.util.Collections;
public class A{
public static void main(String[] args) {
List list = new ArrayList();
Collections.synchronizedList(list); // 此时list集合就是线程安全的
}
}
二、LinkedList集合
特点:
(1)对于链表数据结构来说,最小的基本存储单元是节点Node;
(2)对于单向链表来说,任何一个节点Node中都有两个属性:
第一:存储的数据;第二:下一节点的内存地址。
链表优点:
随机增删元素效率较高,因为内存地址在空间储存上不是连续的,同时随机增删元素时也不会涉及到大量的元素位移,以后开发中如果遇到随机增删集合中元素的业务比较多,建议使用LinkedList。
下边是插入数据原理图:
删除数据原理图:
链表缺点:
查询效率较低,每一次查找某个元素的时候,都需要从头元素开始查找,它不能通过数学表达式计算被查找元素的内存地址!
LinkedList 与ArrayList对比
LinkedList有下标,但是之所以它查询慢,因为它只能从头开始查找,LinkedList是把增删发挥到极致;
ArrayList也有下标,之所以它查询的快,因为底层是数组,且内存是连续的,ArrayList时把检索发挥到极致。
相对来说ArrayList用的还是多一些。
双向链表
双向链表上的基本单元还是节点Node
特点:
(1)LinedList集合没有初始化容量;
(2)不管是ArrayList还是LinkedList,以后写代码时,不需要关心具体时哪一个集合。因为我们要面向接口编程,调用的都是接口的方法。
public class A{
public static void main(String[] args) {
ArrayList l = new ArrayList(); // 这样写表示底层用了数组
LinkedList l1 = new LinkedList(); // 这样写表示底层用了双向链表
}
}