Java list 用法及排序和遍历
Java List 接口一共有三个实现类,分别是 Vector、ArrayList、LinkedList
List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。
三个具体实现类的相关区别如下:
1. Vector与ArrayList一样,也是通过数组实现的,不同的是Vector支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
2. ArrayList是最常用的List实现类,内部是通过数组实现,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
3. LinkedList是用链表结构存储数据,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。ArrayList默认大小是16,Vector默认大小是10
1. Vector
// Vector public static void TestVector() { Vector<String> vector = new Vector<String>(); vector.add("list11"); vector.add("list22"); vector.add("list44"); vector.add("list33"); System.out.println("TestVector - vector.size : " + vector.size()); // 4 System.out.println("TestVector - vector : " + vector.toString()); // [list11, list22, list44, list33] vector.remove(0); // 按索引移除元素 vector.remove("list22"); // 按对象移除元素 System.out.println("TestVector - vector.size2 : " + vector.size()); // 2 System.out.println("TestVector - vector2 : " + vector.toString()); // [list44, list33] }
2. ArrayList
// ArrayList public static void TestArrayList() { List<String> list = new ArrayList<String>(); list.add("list11"); list.add("list22"); list.add("list44"); list.add("list33"); System.out.println("TestArrayList - list.size : " + list.size()); // 4 System.out.println("TestArrayList - list : " + list.toString()); // [list11, list22, list44, list33] list.remove(0); // 按索引移除元素 list.remove("list22"); // 按对象移除元素 System.out.println("TestArrayList - list.size2 : " + list.size()); // 2 System.out.println("TestArrayList - list2 : " + list.toString()); // [list44, list33] }
3. LinkedList
// LinkedList public static void TestLinkedList() { LinkedList<String> list = new LinkedList<String>(); list.add("list11"); list.add("list22"); list.addFirst("list44"); // 在链表头插入元素 list.addLast("list33"); // 在链表尾插入元素 System.out.println("TestLinkedList - list.size : " + list.size()); // 4 System.out.println("TestLinkedList - list : " + list.toString()); // [list44, list11, list22, list33] list.remove(0); // 按索引移除元素 list.remove("list22"); // 按对象移除元素 System.out.println("TestLinkedList - list.size2 : " + list.size()); // 2 System.out.println("TestLinkedList - list2 : " + list.toString()); // [list11, list33] }
4. 数字排序
// numberSort public static void TestNumSort() { List<Integer> list = new LinkedList<Integer>(); list.add(2); list.add(5); list.add(1); list.add(3); list.add(4); Collections.sort(list); // 默认升序 System.out.println("TestNumSort -- list : " + list.toString()); // [1, 2, 3, 4, 5] // 函数降序 Collections.sort(list, Collections.reverseOrder()); System.out.println("TestNumSort -- list2 : " + list.toString()); // [5, 4, 3, 2, 1] // 自定义降序 Collections.sort(list, new Comparator<Integer>() { public int compare(Integer a, Integer b) { return b > a ? 1 : (b < a) ? -1 : 0; } }); System.out.println("TestNumSort -- list3 : " + list.toString()); // [5, 4, 3, 2, 1] }
5. 中文排序
// ChineseSort public static void TestChineseSort() { List<String> list = new ArrayList<String>(); list.add("米扑代理"); list.add("米扑支付"); list.add("米扑博客"); list.add("米扑域名"); list.add("米扑财富"); Collections.sort(list); // 直接采用默认排序函数,对中文是乱序的 System.out.println("TestChineseSort -- list : " + list.toString()); // [米扑代理, 米扑博客, 米扑域名, 米扑支付, 米扑财富] Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINESE); Collections.sort(list, cmp); System.out.println("TestChineseSort -- list2 : " + list.toString()); // [米扑博客, 米扑财富, 米扑代理, 米扑域名, 米扑支付] }
6. 对象排序
// ObjectSort public static void TestObjectSort() { List<User> list = new ArrayList<User>(); list.add(new User("杨小欢", 20)); list.add(new User("杨大亮", 20)); Comparator<User> cmp = new ComparatorUser(); Collections.sort(list, cmp); System.out.println("TestObjectSort -- list : " + list.toString()); // [杨大亮:20, 杨小欢:20] }
对象类 User
class User { private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return this.name + ":" + this.age; } }
比较器类 ComparatorUser
class ComparatorUser implements Comparator<User> { @Override public int compare(User u1, User u2) { int result = u1.getAge().compareTo(u2.getAge()); if(0 == result) { result = u1.getName().compareTo(u2.getName()); } return result; } }
7. List 遍历
// TestLoop public static void TestLoop() { List<String> list = new ArrayList<String>(); list.add("list11"); list.add("list22"); list.add("list44"); list.add("list33"); System.out.println("TestLoop - loop1 : "); for(String str : list) { System.out.println(str); } System.out.println("TestLoop - loop2 : "); for(int i=0; i<list.size(); i++) { System.out.println(list.get(i)); } System.out.println("TestLoop - loop3 : "); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } }
8. List 移除
// TestRemove public static void TestRemove() { List<String> list = new ArrayList<String>(); list.add("list11"); list.add("list22"); list.add("list44"); list.add("list33"); List<String> list1 = new ArrayList<String>(list); for(String str : list1) { if("list44".equals(str)) { list1.remove(str); } } System.out.println("TestRemove - list1 : " + list1.toString()); // [list11, list22, list33] List<String> list2 = new ArrayList<String>(list); for(int i=list.size()-1; i>=0; i--) { if("list44".equals(list2.get(i))) { list2.remove(list2.get(i)); } } System.out.println("TestRemove - list2 : " + list2.toString()); // [list11, list22, list33] List<String> list3 = new ArrayList<String>(list); Iterator<String> iterator = list3.iterator(); while(iterator.hasNext()) { if("list44".equals(iterator.next())) { iterator.remove(); } } System.out.println("TestRemove - list3 : " + list3.toString()); // [list11, list22, list33] }
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2018-02-05 00:45:39
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!