集合框架之List集合

简介: 集合框架之List集合

前言

1.为什么要使用集合?

  • 数组的缺陷:定容[一旦数组定义好,数组的长度就无法改变],如果需要改变数组的长度,很复杂。学集合框架就是了解容器的数据结构(增删改查).

2.ArrayList数据结构也是数组那么为什么可以没有长度限制?

  • 论证:ArrayList数据结构是数组

public static void main(String[] args) throws Exception {
       List list = new ArrayList();
       for (int i = 0; i < 100; i++) {
           System.out.print(i+"==");
           list.add(i);
           elementDataLength(list);
       }

   }

public static void elementDataLength(List list) throws Exception {
       Field ed = list.getClass().getDeclaredField("elementData");
       ed.setAccessible(true);
       Object[] o = (Object[]) ed.get(list);
       System.out.println("当前List集合容量为:"+o.length);

}

  • 结论:
  • ArrayList的默认长度是10,如果超出规定长度会增长1.5倍,并向下取整
  • 例如 10*1.5=15、15*1.5=22、22*1.5=33 ...

1.什么是UML?

  UML是统一建模语言的简称.

2.集合框架

3.list集合

3.1.list集合特点

  • 有序:List集合数据存储进去顺序和读取顺序一致。
  • 不唯一:List集合数据允许添加重复的数据。

3.2.遍历方式(for;foreach;迭代器)

  • for下标遍历
List lst=new ArrayList();
lst.add("xx");
lst.add("aa");
lst.add("bb");
for (int i = 0; i < lst.size(); i++) {
  System.out.println(lst.get(i));
}

forreach遍历

List lst=new ArrayList();
lst.add("yy");
lst.add("hh");
lst.add("mm");
for (String str : lst) {
  System.out.println(str);
}
  • 迭代器
List lst=new ArrayList();
lst.add("ss");
lst.add("pp");
lst.add("qq");
Iterator iterator = lst.iterator();
while(iterator.hasNext()){
  System.out.println(iterator.next());

3.3.删除list集合内容(for正反向删除;迭代器删除)

for循环正向删除

List lst=new ArrayList<>();
lst.add(22);
lst.add(23);
lst.add(24);
lst.forEach(System.out::println);
System.out.println("删除之前集合大小:"+lst.size());
int size = lst.size();
for (int i = 0; i <size; i++) {
  lst.remove(0);
}
System.out.println("删除之后集合大小:"+lst.size());
  • ⚠注意这里正向删除必须先把集合长度利用一个变量保存,否则每次删除之后数组长度会发生变化随之原数组下标也会发生变化,i++后从而删不干净,并且remove(0)的好处就是每次都会有下标为0的数组存在。

for遍历逆向删除

List lst=new ArrayList<>();
lst.add(12);
lst.add(13);
lst.add(14);
lst.forEach(System.out::println);
System.out.println("删除之前集合大小:"+lst.size());
int size = lst.size()-1;
for (int i = size; i >=0; i--) {
  lst.remove(i);
}
System.out.println("删除之后集合大小:"+lst.size());
  • ⚠注意这里同样用变量接收但是长度需要减一,因为数组下标是从0开始的。
  • 迭代器删除
List lst=new ArrayList<>();
lst.add(12);
lst.add(13);
lst.add(14);
lst.forEach(System.out::println);
System.out.println("删除之前集合大小:"+lst.size());
Iterator<String> iterator = lst.iterator();
//判断下一个元素是否存在
while(iterator.hasNext()) {
    //若存在,移动到下一个元素位置
    //易出错
    iterator.next();
    //删除元素
    iterator.remove();
}
System.out.println("删除之后集合大小:"+lst.size());

3.4List优化 ( 初始容量10,负载因子1.5 )

 作为数组而言:下标不能超越定义的范围,而集合长度却是没有范围限制的。 由于list集合底层是数组,当我们每次添加到list集合中就会改变集合的容量。所以我们把list初始容量调高就会提升运行的效率。

4.LinkedList和ArrayList的区别

1. LinkedList的特点

如图所示:  LinkedList是一种链表

该特点:根据节点依次往下查找元素,因此查询效率比ArrayList。因为该集合是无序的,删除该集合中的某一元素并不会对其他元素造成变化,所以在新增和删除的时候比ArryList要快.

2. ArrayList数据结构

2.1 ArrayList的特点

首先ArrayList底层是一个数组,顾名(Array)思义。如数组的特点有序根据下标进行排序,元素可重复。

如图所示:数组可根据下标找到指定元素,并按加入顺序进行排序。

5. 什么是堆栈与队列?

         都是一种数据结构

①队列&堆栈区别:       队列:先进先出

                                      堆栈:先进后出

我们可以把堆栈想象成给枪装子弹,先装的就会后打出去。而队列则相反。

6.增长因子论证

4.1 存储过程(list集合)

ArrayList为例以数组方式进行存储,数组长度是不可变的,默认是10;

4.2 list的扩容因子

public class yaya {

   public static void main(String[] args) throws Exception {

       ArrayList list = new ArrayList();

       for (int i = 0; i < 50; i++) {

           list.add(i);

           System.out.print("当前集合长度"+i+"\r");

           elementDataLength(list);

       }

   }

 

   // 该方法是获取底层数组的长度

   private static void elementDataLength(ArrayList l) throws Exception {

       Field f = l.getClass().getDeclaredField("elementData");

       f.setAccessible(true);

       Object[] o = (Object[]) f.get(l);

       System.out.println("当前集合底层数组容量长度为:" + o.length);

   }

}

 

运行结果:

由此这样可以得到一个结论:

当添加内容超过默认数组长度会自动扩容,增长因子为 ‘原容量的0.5倍 + 1++’(每扩容一次叠加1,如扩容第二次就加2),因此我们可对其进行调优,根据需求修改默认底层数组长度减少扩容次数,从而提高效率。

ArrayList list = new ArrayList(50);  可根据需求定义默认长度,超过该长度才进行扩容

最后,本期介绍结束呐,谢谢您的观看😊😊😊。

目录
相关文章
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
65 5
|
1月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
45 0
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
3月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
26 3
|
4月前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
46 5
|
6月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1019 1
|
5月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
5月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
6月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
210 3
下一篇
DataWorks