概述

  • 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,否则返回false。
8. contains(Object o) 如果列表包含指定的元素,则返回 true。
9. remove(int index) 移除列表中指定位置的元素,并返回被删元素,删除位置后面的元素(如果有)向前移动。
10. remove(Object o) 从List集合中移除第一次出现的指定元素,移除成功返回true,否则返回false。当且仅当List集合中含有满(o==null ? get(i)==null : o.equals(get(i)))条件的最低索引i的元素时才会返回true。
11. 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 + "  ");});

【集合】--List相关推荐

  1. do还是doing imagine加to_中学必背英语短语集合:54个doing动名词的固定搭配

    中学必背英语短语集合:54个doing动名词的固定搭配​mp.weixin.qq.com doing动名词是中小学英语教学中的重要内容.在小学的时候老师大概会把doing解释为一般进行时,但层级越往上 ...

  2. Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)

    zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...

  3. Redis 笔记(06)— set 类型(向集合添加元素、获取集合元素个数、判断集合中是否包含某个元素、删除给定元素、返回集合中所有元素、计算集合的交集、并集、差集)

    Redis 的 set 集合内部的键值对是无序的唯一的.它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL .当集合中最后一个元素移除之后,数据结构自动删除,内存被回收. ...

  4. 【C#】集合_哈希表_字典_泛型_文件

    数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...

  5. java集合中对象某属性比较排序

    TreeSet:它可以给Set集合中的元素进行指定方式的排序. 保证元素唯一性的方式:通过比较的结果是否为0. 底层数据结构是:二叉树. 排序的第一种方式: 让元素自身具备比较性.只要让元素实现Com ...

  6. 程序员应该吃透的集合List

    一:先看看集合框架接口图 (图片来源于网络) 从图中可以看到List实现了Collection接口. 二:Collection接口是什么? 在java类库中,Collection接口是集合类的基本接口 ...

  7. Java集合详解之Map

    一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...

  8. 第一个python程序:定义,列表,元组,集合,求并集交集,键和值,运算符,缩进

    ''' 来源:天善智能韦玮老师课堂笔记 ''' print("定义") a = 6 # python里无需定义 print("a=",a) a += 1 # + ...

  9. python 获取集合里面的某一个元素

    python 获取集合里面的某一个元素,想想呢集合是不支持所以,切片,相加,相乘操作的, 所以想获取集合里面的某一个元素需要转化下思路,比如把即可转成列表然后在利用索引获取 例如: list_a = ...

  10. python 把列表或者元组转成集合

    python 把列表或者元组转成集合 使用set 方法 list_a = ["张三", "李四", "王二"] # 把列表转成集合 prin ...

最新文章

  1. 紫色回归线:雅虎中国的运筹学
  2. Mybatis传多个参数(三种解决方案)
  3. python数据分析从入门到精通电子工业出版社_荐书丨Python数据分析从入门到精通...
  4. Linux中的In命令
  5. Git使用教程-命令总结大全
  6. tf.expand_dims 来增加维度
  7. 【转】centos安装vim7.4
  8. Elasticsearch Grok Pattern内置表达式大全
  9. 运维工程师是桥的护栏_【消息】秭归将建螺旋桥
  10. 计算机的典型网络地址 特殊0.0.0.0 本机127.0.0.1 内网192.168.xxx.xxx 172.xxx.xxx.xxx 10.xxx.xxx.xxx 外网
  11. linux安装工具的过程
  12. QTreeView设置branch图标大小
  13. Word中设置三栏式表格
  14. Merkle Tree、Merkle Proof、SPV安全性分析、Bloom过滤器
  15. 进行分词时,报错omw-1.4安装包未找到?
  16. 人工智能到底是什么?AI基础概念深度解析
  17. 那些SAP项目里的主流外围系统
  18. 解决图片处理后旋转问题
  19. 识别图片中的数字------基本思路
  20. 音量计算机的网红音乐,网红音乐10首抖音网红歌,抖音网红歌曲100首BGM精选

热门文章

  1. java与软件测试哪个好?
  2. Matlab:绘制不同颜色的柱状图bar
  3. jq简单实现点击按钮跳转页面到指定tab内容
  4. 集显、独显、核显、SOC、POP、微型计算机树莓派的资料
  5. 用深度学习完成3D渲染任务的蹿红
  6. vue使用过滤器,文字超出显示省略号
  7. 查看mysql数据库连接数、并发数相关信息
  8. SQLServer删除数据列
  9. 【产业互联网周报】销售易获腾讯1.2亿美元投资;国科恒泰完成11亿C轮融资;工信部、科技部推进大数据及人工智能...
  10. 基于51单片机篮球计分器proteus仿真设计