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

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(); // 这样写表示底层用了双向链表
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值