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
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!