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,那么元素重复。
-
- 往TreeSet添加元素 的时候,如果元素具备自然顺序的特点,那么TreeSet会根据元素 的自然顺序特性进行排序 存储。
-
- 往TreeSet添加元素 的时候,如果元素不具备自然顺序的特点,那么元素所属的类就必须要实现Comparable接口,把比较的规则定义在CompareTo方法上。
-
- 往TreeSet添加元素 的时候,如果元素不具备自然顺序的特点,那么元素所属的类就也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象。
-
比较器 的定义格式:
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) { HashSetset = new HashSet (); set.add(new Person(110,"狗娃")); set.add(new Person(110,"狗娃")); System.out.println("集合的元素:"+ set); } }
2 遍历集合##
2.1 遍历集合的几种方式
- 使用迭代器Iterator的方式。
- 使用增强for循环的方式。
- 如果有下标,则可以使用下标的方式。
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: Listlist = new ArrayList (); 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 iter = list.iterator(); iter.hasNext();) { String elt = iter.next(); System.out.println(elt); }}
2.4 遍历Set
public static void main(String[] args) { // 遍历Set: Setset = new HashSet (); set.add("dd"); set.add("ee"); set.add("ff"); // 1,增强的for循环 for (String elt : set) { System.out.println(elt); } // 2,迭代器 for(Iterator iter = set.iterator(); iter.hasNext() ; ){ String elt = iter.next(); System.out.println(elt); }}
2.5 遍历Map
public static void main(String[] args) { // 遍历Map: Mapmap = new HashMap (); map.put("aa", "xx"); map.put("bb", "yy"); map.put("cc", "zz"); // 1,增强的for循环(Entry集合) for (Entry 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); }}