java Collection下的子接口List接口中常用方法

刺骨的言语ヽ痛彻心扉 2022-10-06 05:49 425阅读 0赞

List接口本身常用的方法

List集合存储的特点:

(1)有序(有下标),可重复
(2)List集合中的元素有下标,从0开始,

List既然是Collection接口的子接口,那么肯定List接口有自己”特色”的方法。

以下记录List接口的常用方法:

(1)boolean add(int index, element) - 不常用,效率较低。
向集合指定位置插入元素

  1. public class A extends B {
  2. public static void main(String[] args) {
  3. List l = new ArrayList();
  4. l.add(1);
  5. l.add(2, 10);
  6. System.out.println(l.get(1)); // 10
  7. }
  8. }

(2)get ( int index )

  1. public class A extends B {
  2. public static void main(String[] args) {
  3. List l = new ArrayList();
  4. l.add(1);l.add(2);
  5. int len = l.size();
  6. for(int i = 0; i < len; i ++) {
  7. System.out.println(l.get(i));
  8. }
  9. }
  10. }

(3)indexOf ( Object o )
指定对象第一次在集合中出现的索引。

(4)lastIndexOf ( Object o )
指定对象最后一次在集合中出现的索引。

(6)remove ( int index )
删除指定下标位置的元素。

(5)set ( int index, Object element )
修改指定下标的位置的元素。

  1. public class A extends B {
  2. public static void main(String[] args) {
  3. List l = new ArrayList();
  4. l.add(1);l.add(2);
  5. l.set(0, 10);
  6. System.out.println(l.get(0)); //10
  7. }
  8. }

List接口下的ArrayList、LinkedList类的常用方法

一、ArrayList集合

特点:

(1)它的初始化容量为10(底层会先创建一个长度为0的数组,当添加第一个元素的时候,初始化容量为10)
20210612070911865.png

(2)ArrayList底层是一个Object类型的数组

20210612071101786.png

(3)ArrayList的构造方法,如果无参,默认初始化容量为10;也可以有参,默认初始化容量为传的参数

源码,会new一个Object类型的数组,把参数作为数组长度,赋值给ArrayList。
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzc4MDAx_size_16_color_FFFFFF_t_70
例:

  1. public class A extends B {
  2. public static void main(String[] args) {
  3. // 默认初始化微量为10
  4. ArrayList l = new ArrayList();
  5. // 指定初始化容量
  6. ArrayList l1 = new ArrayList(100);
  7. }
  8. }

(4)一个集合重要的优化策略:ArrayList的扩容是原容量的1.5倍,尽可能少的扩容,因为数组扩容效率比较低,建议在使用ArrayList的时候,预估计一个元素个数,给定一个初始化容量。

(5)面试中最长问的:集合中用哪个用的最多
答:ArrayList
因为数组的检索效率比较高,内存地址连续的,而且向数组末尾添加元素,效率很高,但是缺点:随机的增删元素,效率比较低!另外数组无法存储大数据量的数据。

(6)ArrayList是非线程安全的。

(7)把ArrayList变为线程安全的。

使用Collections 工具类:

  1. import java.util.Collections;
  2. public class A{
  3. public static void main(String[] args) {
  4. List list = new ArrayList();
  5. Collections.synchronizedList(list); // 此时list集合就是线程安全的
  6. }
  7. }

二、LinkedList集合

特点:

(1)对于链表数据结构来说,最小的基本存储单元是节点Node;
(2)对于单向链表来说,任何一个节点Node中都有两个属性:
第一:存储的数据;第二:下一节点的内存地址。
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzc4MDAx_size_16_color_FFFFFF_t_70 1

链表优点:
随机增删元素效率较高,因为内存地址在空间储存上不是连续的,同时随机增删元素时也不会涉及到大量的元素位移,以后开发中如果遇到随机增删集合中元素的业务比较多,建议使用LinkedList。
下边是插入数据原理图:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzc4MDAx_size_16_color_FFFFFF_t_70 2

删除数据原理图:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzc4MDAx_size_16_color_FFFFFF_t_70 3

链表缺点:
查询效率较低,每一次查找某个元素的时候,都需要从头元素开始查找,它不能通过数学表达式计算被查找元素的内存地址!

LinkedList 与ArrayList对比

LinkedList有下标,但是之所以它查询慢,因为它只能从头开始查找,LinkedList是把增删发挥到极致;

ArrayList也有下标,之所以它查询的快,因为底层是数组,且内存是连续的,ArrayList时把检索发挥到极致。

相对来说ArrayList用的还是多一些。

双向链表

双向链表上的基本单元还是节点Node

特点:

(1)LinedList集合没有初始化容量;
(2)不管是ArrayList还是LinkedList,以后写代码时,不需要关心具体时哪一个集合。因为我们要面向接口编程,调用的都是接口的方法。

  1. public class A{
  2. public static void main(String[] args) {
  3. ArrayList l = new ArrayList(); // 这样写表示底层用了数组
  4. LinkedList l1 = new LinkedList(); // 这样写表示底层用了双向链表
  5. }
  6. }

发表评论

表情:
评论列表 (有 0 条评论,425人围观)

还没有评论,来说两句吧...

相关阅读