百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

List集合简单总结 list集合求和的方法

bigegpt 2024-10-12 06:07 7 浏览

参考书籍java疯狂讲义所做的学习总结。我相信我还会回来的!

一、概要:List集合是一个元素有序,可重复的集合,该接口是Collection接口的子接口。List接口下接口的实现类有,ArrayList、LinkedList、Vector,其中Vector年龄较大(1.0版本就存在了)

二、List接口中常用的方法

》void add(int index,Object element):将元素element插入到集合的index处。

》boolean addAll(int index,Collection c):将集合c所包含的元素都插入到List集合的index处。

》Object get(int index):返回集合index处的索引处的元素。

》int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。

》int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的索引。

》Object remove(int index):删除并返回index索引处的元素。

》Object set(int index,Object element):将index索引处的元素替换为element对象,返回新元素。

》List subList(int fromIndex,int toIndex):返回从索引fromIndex(包含)到toIndex(不包含)处所有集合元素组成的子集合。

部分用法如下:


  1. import java.util.ArrayList;
  2. import java.util.Vector;
  3. public class ListTest {
  4. public static void main(String[] args) {
  5. //创建集合对象
  6. ArrayList<String> list1 = new ArrayList<String>();
  7. //add(E e):添加元素
  8. list1.add("hello");
  9. list1.add("world");
  10. list1.add("java");
  11. //add(int index,E element):在指定的索引处添加一个元素
  12. list1.add(1, "android");
  13. System.out.println("array:"+list1);
  14. //========================================================
  15. //创建集合对象
  16. ArrayList<String> array = new ArrayList<String>();
  17. //添加元素
  18. array.add("hello");
  19. array.add("world");
  20. array.add("java");
  21. //public E get(int index):返回指定索引处的元素
  22. System.out.println("get:"+array.get(0));
  23. System.out.println("get:"+array.get(1));
  24. System.out.println("get:"+array.get(2));
  25. //public int size():返回集合中的元素的个数
  26. System.out.println("size:"+array.size());
  27. //public boolean remove(Object o):删除指定的元素,返回删除是否成功
  28. System.out.println("remove:"+array.remove("world"));//true
  29. System.out.println("remove:"+array.remove("world"));//false
  30. //public E remove(int index):删除指定索引处的元素,返回被删除的元素
  31. System.out.println("remove:"+array.remove(0));
  32. //public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
  33. System.out.println("set:"+array.set(0, "android"));
  34. //输出
  35. System.out.println("array:"+array);
  36. }
  37. }

三、遍历List集合的三种方式


  1. public class ListSearchTest {
  2. public static void main(String[] args) {
  3. List list = new ArrayList<>();
  4. list.add(0);
  5. list.add(1);
  6. list.add(2);
  7. list.add(3);
  8. //No1:for循环遍历
  9. for (int i = 0; i < list.size(); i++) {
  10. System.out.println(list.get(i));
  11. }
  12. System.out.println("==============================");
  13. //No2:foreach遍历
  14. for (Object object : list) {
  15. System.out.println(object);
  16. }
  17. System.out.println("==============================");
  18. //No3:使用Iterator迭代器
  19. Iterator iterator = list.iterator();
  20. while(iterator.hasNext()){
  21. System.out.println(iterator.next());
  22. }
  23. }
  24. }

关于迭代器Iterator的使用:Iterator接口也是java集合框架的成员,但它与Collection,Map集合不一样,Collection集合和Map集合主要用户装对象,而Iterator主要用于遍历,Iterator本身病不提供盛装对象的能力;还有一点需要注意的是,当时用Iterator遍历Collection集合元素时,只有通过Iterator的romove方法删除上一次next方法返回的集合元素才可以,否则的话,会引发java.util.ConcuurentModdificationException异常。

三、ArrayList的使用以及存储原理

ArrayList和Vector是基于数组实现的List类,所以AyyayList和Vector类封装了一个动态的、允许再分配的Object数组。ArrayList或Vector对象使用initialCapacity参数设置数组的长度,当向ArrayList和Vector中添加元素超出该数组的长度时,他们的initialCapacity会自动增加。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组的增长大约是其原容量的1.5倍。如果向ArrayList或Vector集合中添加大量元素时,可使用ensureCapacity(int X)方法一次性地增加initialCapacity.可减少重分配的次数,从而提高性能。(摘自疯狂java讲义)

关于具体ArrayList的实现原理,推荐前辈博客:https://www.cnblogs.com/ITtangtang/p/3948555.html

四、LinkedList的使用原理

1.LinkedList是一个双向链表,它也可以被当作堆栈、队列或双端队列进行操作。既然其底层的数据结构是链表,必然每个节点中的存储都是:前一个节点的位置信息,节点数据和后一个节点的位置信息。正是因为此结构,所以在进行增删元素的时候效率特别高,不需要像ArrayList那样还要按索引查找,在进行增加,删除元素,然后还需要更新索引结构。LinkedList在进行增删的时候,只需要修改上一个元素的后节点信息和下一个元素的前节点信息即可。但是在查询的时候就慢了,它只能依次访问集合中的每个元素,找不到的话,就根据链表继续向下走,去访问下一个元素。

2.使用LinkedList模拟队列:


  1. /*
  2. *LinkeList:链表集合.
  3. */
  4. public class LinkedListTest1 {
  5. public static void main(String[] args) {
  6. LinkedList<Object> ll = new LinkedList<>();
  7. ll.addFirst("a");
  8. ll.addFirst("b");
  9. ll.addFirst("c");
  10. ll.addFirst("d");
  11. System.out.println(ll); // 倒序的效果. 输出[d,c,b,a]
  12. Object first = ll.getFirst() ;
  13. System.out.println(first); //d
  14. Object last = ll.getLast();
  15. System.out.println(last); //a
  16. }
  17. }
  18. 3.使用LinkedList模拟栈:
  19. public class LinkedListTest2 {
  20. public static void main(String[] args) {
  21. //创建 LinkedList
  22. LinkedList<Object> ll = new LinkedList<>();
  23. //a先压栈,b,c以此压栈
  24. ll.push("a");
  25. System.out.println(ll);//[a]
  26. ll.push("b");
  27. System.out.println(ll);//[b,a]
  28. ll.push("c");
  29. System.out.println(ll); //[c,b,a]
  30. //弹栈,先进后出
  31. System.out.println(ll.pop()); //c
  32. System.out.println(ll);//[b,a]
  33. System.out.println(ll.pop()); //b
  34. }
  35. }

五、线程安全问题

ArrayList是线程不安全的集合,当有多个线程访问同一个Arraylist的集合时,如果有超过一个线程修改了ArrayList集合,则必须手动保证该集合的同步性。使用Conllections类中提供的syschronizedXXX()方法,该方法将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时带来的线程安全问题。


  1. public class CollectionTest {
  2. public static void main(String[] args) {
  3. //创建4个同步的集合对象
  4. Collection c = Collections.synchronizedCollection(new ArrayList());
  5. List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
  6. Set<Object> set = Collections.synchronizedSet(new HashSet<Object>());
  7. Map<Object, Object> map = Collections.synchronizedMap(new HashMap<Object,Object>());
  8. }
  9. }

六、ArrayList和LinkedList性能比较

1.ArrayList做查询比较快,但是增删的时候比较满。当插入或删除元素时,还要涉及数组元素的移动等内存操作。

2.LinkedList做增删比较快,但是查询慢。LinkedList使用双向链表实现存储,形成一个按序号索引的线性结构,与数组存储的方式相比,按序号索引数据需要进行前向或后向遍历,但是插入数据的时候,只需要记录本项的前后项即可,所以插入较快,删除同样。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...