介绍了arraylist集合去重的三种方式,以及排序的两种方式,以及反射获取arraylist的容量,以及array和arraylist的区别。
array 和 arraylist都是存放数据的容器.array是代表的是数组,arraylist是一个集合,arraylist底层使用的封装了一个object数组。它的可变就是数组扩容。
区别:
array可以包含基本类型和对象类型,arraylist只能包含对象类型,jdk1.5之后传入基本类型会自动装箱。array数组在存放的时候一定是同种类型的元素。arraylist就不一定了,因为arraylist可以存储object。array大小是固定的,arraylist的大小是动态变化的。arraylist作为array的增强版,当然是在方法上比array更多样化,比如添加全部addall()、删除全部removeall()、返回迭代器iterator()等。使用条件:
当存放的内容数量不固定,不确定,有限时采用arraylist。如果想要保存一些在整个程序运行期间都会存在而且不变的数据,可以放在数组里。如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用arraylist的效率很低,使用数组进行这样的容量调整动作很麻烦,我们可以选择linkedlist。借助辅助集合
arraylist<string> al = new arraylist<string>();al.add("aa");al.add("bb");al.add("aa");al.add("dd");al.add("dd");al.add("dd");al.add(null);al.add("ee");al.add("ee");//去重思路一 借助辅助集合arraylist<string> al2 = new arraylist<string>();for (string s : al) { if (!al2.contains(s)) { al2.add(s); }}al.clear();al.addall(al2);system.out.println(al); //[aa, bb, dd, null, ee]
直接利用列表迭代器,无需借助辅助集合(打乱顺序)
listiterator<string> sli = al.listiterator();while (sli.hasnext()) { string next = sli.next(); //获得下一个元素 sli.remove(); //移除获得的元素 if (!al.contains(next)) //判断源集合是否包含被移除的元素 { sli.add(next); //没包含就再添加进来 }}system.out.println(al);
注意: contains(obj); remove(object obj);
以上两个方法底层是依据equals方法:根据equals方法返回的值,判断是否移除/或者是判断是否存在。因此对对象去重时,需要重写equals方法,使得equals比较的是具体值而不是地址。
使用java8的lambda表达式轻松实现集合去重
al = al.stream().collect(collectors.collectingandthen(collectors.tocollection(hasht::new), arraylist::new));system.out.println(al);
clooections的sort方法快速实现排序:
public static <t extends comparable<? super t>> void sort(list list) –自然排序 public static void sort(list list,comparator<? super t> c) –自定义排序
明显我们无法直接通过可用方法获取arraylist的容量,因此只有使用反射获取:
// 获取lis邮递员的英文t容量public static integer getcapacity(arraylist list) { integer length = null; class clazz = list.getclass(); field field; try { field = clazz.getdeclaredfield("elementdata"); field.taccessible(true); object[] object = (object[]) field.get(list); length = object.length; return length; } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } return length;}
public class arraylisttest { static list<integer> list = new arraylist<integer>(); static { for 日美战争(int i = 1; i <= 100000000; i++) { list.add(i); } } public static long arrayfor() { //开始时间 long starttime = system.currenttimemillis(); for (int j = 0; j < list.size(); j++) { object num = list.get(j); } //结束时间 long endtime = system.currenttimemillis(); //返回所用时间 return endtime - starttime;花艺插花 } public static long arrayiterator() { long starttime = system.currenttimemillis(); iterator iterator = list.iterator(); while (iterator.hasnext()) { object next = iterator.next(); } long 三阶矩阵的逆矩阵endtime = system.currenttimemillis(); return endtime - starttime; } public static void main(string[] args) { long time1 = arrayfor(); long time2 = arrayiterator(); system.out.println("arraylist for循环所用时间==" + time1); system.out.println("arraylist 迭代器所用时间==" + time2); }}
本文发布于:2023-04-04 05:58:09,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/064637ca45b0ca50ba32f26f363f5090.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java去重的方法(java高并发解决方案).doc
本文 PDF 下载地址:java去重的方法(java高并发解决方案).pdf
留言与评论(共有 0 条评论) |