zoukankan      html  css  js  c++  java
  • JAVA集合框架(二)-List和Set

    List的常用实现类

    list集合是有序的,顺序即添加的顺序,元素是可重复的。

    • ArrayList
    • LinkedList
    • Vector

    ArrayList

    底层基于数组实现。在add元素的过程中,如果超过了数组容量,会自动扩容。
    主要特点:随机访问快(数组的特性),但是在中间插入和移除元素时较慢(涉及数组拷贝动作)。

    LinkedList

    底层基于链表数据结构设计。
    主要特点:在中间插入和删除操作快。但是随机访问较慢(需要遍历node指针)。
    LinkedList的一些专有方法:

    • void addFirst(E e) 将指定元素添加到此集合的开头
    • void addLast(E e) 将指定元素添加到此集合的末尾
    • E getFirst() 返回此集合的第一个元素
    • E getLast() 返回此集合的最后一个元素
    • E removeFirst() 删除此集合中的第一个元素
    • E removeLast() 删除此集合中的最后一个元素

    Vector的实现类似ArrayList。只是Vector是线程安全的。它的大部分方法都加了同步锁synchronized

    Set的常用实现类

    set集合不保存重复的元素。

    • HashSet
    • TreeSet
    • LinkedHashSet

    HashSet

    HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能。
    通过元素的hash()和equals()方法来判断元素是否重复。因此,HashSet中元素的存储顺序是和元素的添加顺序不一样的。

    LinkedHashSet

    LinkedHashSet是HashSet的子类。使用链表来维护元素的添加次序,因此存储顺序就是元素的添加顺序。

    TreeSet

    底层元素存储基于红黑树数据结构实现。TreeSet保证了存入集合中的元素处于有序状态。这种有序可以是自然排序和定制排序。
    自然排序:
    TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后让集合按照升序排列。
    加入集合中的元素需要实现Comparable接口,重写compareTo()。

    public class Person implements Comparable<Person>{
    
    	private String name;
    	private int age;
    	public Person(String name, int age){
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + "]";
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	// 按年龄排序
    	public int compareTo(Person person) {
    		int ret = (this.age - person.age);
    		return ret;
    	}
    }
    
    测试类:  
    public class setMain {
    	public static void main(String[] args) {
    		Set<Person> personSet = new TreeSet<Person>();
    		personSet.add(new Person("张三",10));
    		personSet.add(new Person("王五",23));
    		personSet.add(new Person("李四",15));
    		System.out.println(personSet);
    	}
    	
    }
    
    

    输出:

    [Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]

    定制排序:
    如果要定制排序,需要在TreeSet构造器中传入Comparator比较器。

    public class NameComparator implements Comparator<Person>{
    
    	public int compare(Person person1, Person person2) {
    		return person1.compareTo(person2);
    	}
    }
    
    测试类:   
    public class setMain {
    	public static void main(String[] args) {
    		Set<Person> set = new TreeSet<Person>(new NameComparator());
    		set.add(new Person("张三",10));
    		set.add(new Person("王五",23));
    		set.add(new Person("李四",15));
    		System.out.println(set);
    	}
    }
    

    输出:

    [Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]

  • 相关阅读:
    算法:二分图最大独立集
    算法:桶排序
    算法:二分图最小点覆盖——Konig定理
    jQuery基础整理之思维导图
    vue基础知识整理
    HTML总结
    JAVAScript总结
    栈和队列
    今日学习遇到的问题(2018.9.23)
    看了vue文档之后。。。。
  • 原文地址:https://www.cnblogs.com/happyone/p/11048406.html
Copyright © 2011-2022 走看看