区分Java中的ArrayList和LinkedList
一:ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
2.LinkedList基于链表的数据结构, 插入、删除元素时效率比较高 故:【插入、删除操作频繁时,可使用LinkedList来提高效率】
LinkedList提供对头部和尾部元素进行添加和删除操作的方法,插入/删除第一个和最后一个效率比较高;
3:ArrayList和LinkedList都是List接口的实现,都存储一组不唯一,有序(插入顺序)的对象, 对元素进行添加、删除等操作[ 即:List的性质]
4.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
5.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
6:LinkedList比ArrayList更占内存
eg:(代码示例01)----ArrayList与LinkedLis的数据添加和查找耗时对比
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class HFSD { static final int N=50000; //添加5000条数据 static long timeList(List list){ //添加数据所需时间 long start=System.currentTimeMillis(); Object o = new Object(); for(int i=0;i<N;i++) { list.add(0, o); } return System.currentTimeMillis()-start; } static long readList(List list){ //查找数据所需时间 long start=System.currentTimeMillis(); for(int i=0,j=list.size();i<j;i++){ } return System.currentTimeMillis()-start; } static List addList(List list){ Object o = new Object(); for(int i=0;i<N;i++) { list.add(0, o); } return list; } public static void main(String[] args) { System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList())); System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList())); List list1=addList(new ArrayList<>()); List list2=addList(new LinkedList<>()); System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1)); System.out.println("LinkedList查找"+N+"条耗时:"+readList(list2)); }
从以上结果,我i们可以看出 ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。
ArrayList:内部是使用可増长数组实现的,所以是用get和set方法是花费少数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
LinkedList:是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费少数时间。
二:ArrayList和LinkedList的共有方法(即List的方法):
eg:(代码示例02)----ArrayList代码示例
package JIhekuangjia006.ArrayList; /** * 小猪类 */ public class Pig { private String name; private String sex; public Pig(String name,String sex){ this.name=name; this.sex=sex; } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setSex(String sex){ this.sex=sex; } public String getSex(){ return sex; } }
package JIhekuangjia006.ArrayList; import java.util.*; /** * 使用ArrayList集合进行操作数据 */ public class Test1 { public static void main(String[] args) { //1.存储小猪信息 Pig xiaojia=new Pig("小佳","母");//索引为0 Pig xiaolong=new Pig("小龙","公");//索引为1 Pig jiajia=new Pig("佳佳","女");//索引为2 Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始) //为小猪排序 List list=new ArrayList(); //直接将元素添加排序 list.add(xiaojia); list.add(jiajia); list.add(xiaolong); //将龙龙添加到索引为2的位置 list.add(2,longlong); //list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象 //2.获得小猪的总数 //通过list.size()方法获取元素的个数 list.size(); System.out.println("小猪的总数为"+list.size()); //3.逐条打印小猪信息 //方法一:for循环与get()方法配合实现遍历 for(int i=0;i<list.size();i++){ Pig center=(Pig)list.get(i);//因为list.get()的返回值为Object的类型,所以需要强转为Pig的类型 System.out.println(center.getName()+","+center.getSex()); } //方法二:通过迭代器Iterator实现遍历 // Iterator it=list.iterator(); // while (it.hasNext()){ // Pig center=(Pig)it.next(); // System.out.println(center.getName()+","+center.getSex()); // } System.out.println("*********************************************************"); //4.删除小猪信息 //删除第一只小猪,小佳 list.remove(0);//与数组下标相对应 //删除指定小猪,小龙 list.remove(xiaolong); //将剩下的小猪信息进行输出 System.out.println("删除之后还有"+list.size()+"只小猪,\n分别是:"); for(int i=0;i<list.size();i++){ /** * Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型, * 使用前需要进行强制类型转换 */ Pig center=(Pig)list.get(i);//所以需要强转为Pig的类型 System.out.println(center.getName()+","+center.getSex()); } System.out.println("*******************************************************"); //5.判断集合中是否包含指定小猪 if (list.contains(xiaojia)){//使用list.contains()方法进行判断 System.out.println("集合中有小佳"); }else{ System.out.println("集合中没有小佳"); } } }
测试运行结果如下:
三:LinkedList的特有方法:
eg:(代码示例03)----LinkedList代码示例:
package JIhekuangjia006.LinkedList; /** * 小猪类 */ public class Pig { private String name; //昵称 private String sex; //性别 public Pig(String name,String sex){ this.name=name; this.sex=sex; } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setSex(String sex){ this.sex=sex; } public String getSex(){ return sex; } }
package JIhekuangjia006.LinkedList; import java.util.Iterator; import java.util.LinkedList; /** * 使用LinkedList集合操作数据 */ public class Test2 { public static void main(String[] args) { //1.存储小猪信息 Pig xiaojia=new Pig("小佳","母");//索引为0 Pig xiaolong=new Pig("小龙","公");//索引为1 Pig jiajia=new Pig("佳佳","女");//索引为2 Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始) //为小猪排序 LinkedList list=new LinkedList(); //直接将元素添加排序 list.add(xiaolong); list.add(longlong); list.addFirst(jiajia);//将佳佳添加到第一个位置 list.addLast(xiaojia);//将小龙添加到最后一个位置 //list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象 //2.获得小猪的总数 //通过list.size()方法获取元素的个数 list.size(); System.out.println("小猪的总数为"+list.size()); //3.逐条打印小猪的信息 //方法一:通过迭代器Iterator实现遍历 Iterator it=list.iterator(); while (it.hasNext()){ Pig center=(Pig)it.next(); System.out.println(center.getName()+","+center.getSex()); } //方法二:for循环与get()方法配合实现遍历 // for(int i=0;i<list.size();i++){ // Pig pig=(Pig)list.get(i); // System.out.println(pig.getName()+","+pig.getSex()); // } System.out.println("************************************************"); //4. //获取第一只小猪的信息 Pig center=(Pig)list.getFirst(); System.out.println("第一条狗狗信息是:"+center.getName()+","+center.getSex()); //获取最后一只小猪的信息 Pig center1=(Pig)list.getLast(); System.out.println("最后一条狗狗信息是:"+center1.getName()+","+center1.getSex()); System.out.println("*****************************************************"); //5.删除第一只小猪和最后一只小猪 list.removeFirst(); list.removeLast(); System.out.println("*****************************************************"); //6.输出剩下小猪的信息 System.out.println("剩下还有"+list.size()+"只小猪,\n分别是:"); for(int i=0;i<list.size();i++){ Pig pig=(Pig)list.get(i); System.out.println(pig.getName()+","+pig.getSex()); } //7.判断集合中是否存在小佳 if(list.contains(xiaojia)){ System.out.println("集合中存在小佳"); }else{ System.out.println("集合中不存在小佳"); } } }
测试运行结果如下:
以上就是区分Java中的ArrayList和LinkedList的详细内容,更多关于Java中ArrayList和LinkedList的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
- 这篇文章主要介绍了详解Java后端优雅验证参数合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18