【Java基础】01 集合

Java基础 —— 01 集合#

1 集合的类型与各自的特性##

1.1 Collection:单列集合

  • List: 有存储顺序, 可重复数组

    • ArrayList: 数组实现, 查找快, 增删慢因为是数组实现, 在增和删的时候会牵扯到数组 增容, 以及拷贝元素. 因此慢。数组是能够直接按索引查找, 因此查找时较快。
    • LinkedList: 链表实现, 增删快, 查找慢因为链表实现, 增长时只要让前一个元素记住本身就能够, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时须要一个一个的遍历, 因此效率较低。
    • Vector: 和ArrayList原理相同, 但线程安全, 效率略低。 和ArrayList实现方式相同, 但考虑了线程安全问题, 因此效率略低。
  • Set: 无存储顺序, 不可重复安全

    • HashSet: 线程不安全,存取速度快。底层是以哈希表实现的。数据结构

      • 往hashSet添加元素的时候,首先会调用元素的hashCode方法获得元素的哈希码值,而后把哈希码值通过运算算出该元素存在哈希表中的位置。
      • 状况1:若是算出的位置目前尚未存在任何的元素,那么该元素能够直接添加到哈希表中。
      • 状况2: 若是算出的位置目前已经存在其余的元素,那么还会调用元素 的equals方法再与这个位置上 的元素比较一次。 若是equals方法返回的是true,那么该元素被视为重复元素,不容许添加。若是equals方法返回 的是false,那么该元素也能够被添加。
    • TreeSet: 红-黑树的数据结构,默认对元素进行天然排序(String)。若是在比较的时候两个对象返回值为0,那么元素重复。ide

        1. 往TreeSet添加元素 的时候,若是元素具有天然顺序的特色,那么TreeSet会根据元素 的天然顺序特性进行排序 存储。
        1. 往TreeSet添加元素 的时候,若是元素不具有天然顺序的特色,那么元素所属的类就必需要实现Comparable接口,把比较的规则定义在CompareTo方法上。
        1. 往TreeSet添加元素 的时候,若是元素不具有天然顺序的特色,那么元素所属的类就也没有实现Comparable接口,那么在建立TreeSet对象的时候必需要传入比较器对象。
      • 比较器 的定义格式:this

        class 类名 implements Comparator{ }线程

1.2 Map:双列集合

  • HashMap: 线程不安全,存取速度快。底层是以哈希表实现的。
  • TreeMap: 红-黑树的数据结构,默认对元素进行天然排序(String)。若是在比较的时候两个对象返回值为0,那么元素重复。
  • HashTable: 底层也是使用了哈希表维护的,存取的读取快,存储元素是无序的。

1.3 HashSet实例

class Person{
	
	int id;	
	
	String name;

	public Person(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
		
	@Override
	public int hashCode() {
		return this.id;
	}
	
	@Override
	public boolean equals(Object obj) {
		Person p = (Person)obj;
		return this.id == p.id;
	}
	
	@Override
	public String toString() {
		return "编号:"+ this.id +" 姓名: "+ this.name;
	}
}

public class Demo1 {
	
	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<Person>();
		set.add(new Person(110,"狗娃"));
		set.add(new Person(110,"狗娃"));
		System.out.println("集合的元素:"+ set);		
	}
	
}

2 遍历集合##

2.1 遍历集合的几种方式

  1. 使用迭代器Iterator的方式。
  2. 使用加强for循环的方式。
  3. 若是有下标,则可使用下标的方式。

2.2 遍历数组

public static void main(String[] args) {
	// 遍历数组:
	String[] arr = new String[] { "xx", "yy", "zz" };

	// 1,加强的for循环
	for (String elt : arr) {
		System.out.println(elt);
	}

	// 2,下标的方式
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}

2.3 遍历List

public static void main(String[] args) {
	// 遍历List:
	List<String> list = new ArrayList<String>();
	list.add("aa");
	list.add("bb");
	list.add("cc");

	// 1,加强的for循环
	for (String elt : list) {
		System.out.println(elt);
	}

	// 2,下标
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}

	// 3,迭代器
	for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
		String elt = iter.next();
		System.out.println(elt);
	}
}

2.4 遍历Set

public static void main(String[] args) {
	// 遍历Set:
	Set<String> set = new HashSet<String>();
	set.add("dd");
	set.add("ee");
	set.add("ff");

	// 1,加强的for循环
	for (String elt : set) {
		System.out.println(elt);
	}
	
	// 2,迭代器
	for(Iterator<String> iter = set.iterator(); iter.hasNext() ; ){
		String elt = iter.next();
		System.out.println(elt);
	}
}

2.5 遍历Map

public static void main(String[] args) {
	// 遍历Map:
	Map<String, String> map = new HashMap<String, String>();
	map.put("aa", "xx");
	map.put("bb", "yy");
	map.put("cc", "zz");

	// 1,加强的for循环(Entry集合)
	for (Entry<String, String> entry : map.entrySet()) {
		System.out.println(entry);
	}
	
	// 2,加强的for循环(Key集合)
	for(String key : map.keySet()){
		System.out.println(key + " = " + map.get(key));
	}
	
	// 3,遍历值的集合
	for(String value : map.values()){
		System.out.println(value);
	}
}
相关文章
相关标签/搜索