【集合】--List

概述

  • ArrayList:加粗样式底层数据结构是数组Object[ ],查询快,增删慢,线程不安全,效率高,扩容方式:当前容量×1.5
  • LinkedList:底层数据结构是双向链表,查询慢,增删快,线程不安全,效率高,无需扩容因为底层是链表实现的(JDK1.6 之前为循环链表,JDK1.7 取消了循环。)
  • Vector:(已弃用)底层数据结构是数组带synchronized的ArrayList,查询快,增删慢,线程安全,效率低,扩容方式:当前容量的1倍

使用选择:

  1. 改查选择 ArrayList;
  2. 增删在尾部的选择 ArrayList;
  3. 其他情况下,如果时间复杂度一样,推荐选择 ArrayList,因为 overhead 更小,或者说内存使用更有效率。

ArrayList

1)基本运算

1. add(Object element) 向列表的尾部添加指定的元素。
2. size() 返回列表中的元素个数。
3. get(int index) 返回列表中指定位置的元素,index从0开始。
4. add(int index, Object element) 在列表的指定位置(从0开始)插入指定元素
5. set(int i, Object element) 使用元素element替换索引i位置的元素,并返回被替换的元素。
6. clear() 从列表中移除所有元素。
7. isEmpty() 判断列表是否包含元素,不包含元素则返回 true,否则返回false8. contains(Object o) 如果列表包含指定的元素,则返回 true9. remove(int index) 移除列表中指定位置的元素,并返回被删元素,删除位置后面的元素(如果有)向前移动。
10. remove(Object o)List集合中移除第一次出现的指定元素,移除成功返回true,否则返回false。当且仅当List集合中含有满(o==null ? get(i)==null : o.equals(get(i)))条件的最低索引i的元素时才会返回true11. iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器。

2)扩容机制
ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。

就比如我们现在有一个长度为10的数组,现在我们要新增一个元素,发现已经满了,第一步他会重新定义一个长度为15的数组。然后把原数组的数据,原封不动的复制到新数组中,这个时候再把指向原数的地址换到新数组,ArrayList就这样完成了一次扩容。

扩容因子:1.5
默认初始容量:10
1.5原因:因为1.5 可以充分利用移位操作,减少浮点数或者运算时间和运算次数。
+ 原长度右移一位
ArrayList最大容量是(Integer.MAX_VALUE-8)
3)ArrayList集合加入1万条数据,应该怎么提高效率

ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。因此,现在明确了10万条数据了,我们可以直接在初始化的时候就设置ArrayList的容量
初始化如何设置: list = new ArrayList<>(count);//初始容量为count

Vector

基本运算
①向Vector中添加元素。
向一个 Vector 中添加新元素有两种情况,可以用Vector提供的两种不同方法来实现。

addElement(Object obj):在Vector 的最后增加一个元素。

insertElementAt( Object obj,int index):在Vector的指定位置插入一个元素。
②从 Vector 中删除元素。
从 Vector中删除元素有3种情况,可以用Vector 提供的3种不同方法来实现。.

removeAllElement():删除 Vector 中的所有元素。
removeElement(Object obj):删除Vector中指定的元素(仅删除第一次出现的元素)。
removeElement( int index):删除 Vector 中一个指定位置的元素。

搜索 Vector 中的元素。
有时我们需要得到Vector中特殊位置上的元素或判断Vector中是否包含某个元素,可以使用如下的方法:
Object firstElement():返回这个Vector的第一个元素

Object lastElement():返回这个Vector的最后一个元素。
Object ElementAt(int index):返回这个Vector中指定位置的元素。
Boolean contains(Object elem):如果元素在这个Vector中,则返回true。

获取 Vector的基本信息。
int capacity():返回这个Vector的当前容量。

int size():返回这个Vector的元素个数。

LinkedList

1)基本运算

**1.添加**
boolean add(Object element) 它将元素附加到列表的末尾。
boolean add(int index,Object element) 指定位置插入。 
void   addFirst(E element)  元素附加到列表的头部 
void   addLast(E  element) 元素附加到列表的尾部**
2.获取数据**
Object get(int index) 根据下标获取数据
Object getFirst() 它返回链表的第一个元素。
Object getLast() 它返回链接列表的最后一个元素。
**3.查询**
boolean contains(Object element)如果元素存在于列表中,则返回true**4.修改**
Object set(int index,Object element)它用于用新元素替换列表中的现有元素**
5.删除**E 
remove()  删除第一个元素E 
remove(int location)  删除指定位置的元素E 
removeFirst() 删除并返回链接列表的头部一个元素E 
removeLast() 删除并返回链接列表的尾部一个元素   
**6. 清空**
void clear():它删除列表中的所有元素。

2)JDK1.7比1.6
JDK 1.7中的first/last对比以前的header有下面几个好处:

1、 first / last有更清晰的链头、链尾概念,代码看起来更容易明白。
2、 first / last方式能节省new一个headerEntry。(实例化headerEntry是为了让后面的方法更加统一,否则会多很多header的空校验)
3、 在链头/尾进行插入/删除操作,first /last方式更加快捷。

List遍历

1)for循环

  • 普通for循环

     for (int i = 0; i < list.size(); i++) {
               System.out.print(list.get(i) + "  ");
     }
    
  • 增强for循环

    for (String string : list) {
               System.out.print(string + "  ");
    }
    
  1. Iterator迭代器
Iterator<String> iterator = list.iterator();
       while (iterator.hasNext()) {
           String string = iterator.next();
           System.out.print(string + "  ");
       }
  1. Lambda表达式
list.forEach(System.out::println);
       System.out.println();
       list.forEach(string -> {
           System.out.print(string + "  ");
       });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值