黑马程序员——java语言——集合
1 一.List 有序, 可重复 2 3 1.ArrayList 4 数组结构, 查找快, 增删慢 5 2.LinkedList 6 链表结构, 增删快, 查找慢 7 3.Vector 8 原理和ArrayList相同, 线程安全, 效率低, 已被淘汰 9 4.List集合的迭代 10 a.普通for循环 11 由于List是有序的, 我们可以通过索引逐个获取, 定义for循环从0循环到length-1, 逐个获取元素 12 b.迭代器Iterator 13 使用List的iterator()获取迭代器对象 14 使用hasNext()判断是否有下一个 15 使用next()获取下一个 16 c.枚举Enumeration 17 使用Vector的elements()获取枚举 18 使用hasMoreElements()判断是否有下一个 19 使用nextElement()获取下一个 20 d.增强for循环 21 for(类型 变量名 : 容器) 22 每次循环的时候, 会获取容器中的一个元素用变量引用 23 实现了Iterable接口的类都可以使用b和d两种方式, 增强for循环是JDK5新增的方法, 其内部就是使用Iterator来完成的 24 5.循环中删除元素 25 使用普通for循环迭代时, 删除元素后要将循环变量减1 26 使用迭代器迭代时, 要用迭代器的remove()而不是List的remove() 27 增强for循环迭代时, 不能修改 28 29 二.Set 30 1.HashSet 31 存储原理 32 每次存储对象的时候, 调用该对象的hashCode()方法得到哈希值, 在集合中查找是否有哈希值相同的对象. 33 如果没有哈希值相同的对象, 直接存入. 34 如果有哈希值相同的对象, 则和哈希值相同的对象逐个进行equals()比较. 35 比较结果为false直接存入, 结果为true则不存. 36 过滤属性相同元素 37 如果我们希望HashSet能够过滤属性重复的元素, 那么就需要重写hashCode()和equals(). 38 属性相同的对象hashCode()方法要返回同一个哈希值, 属性相同的对象equals()方法要返回true. 39 为了提高效率, hashCode()方法在属性不同的时候尽量返回不同的哈希值. 40 2.LinedHashSet 41 HashSet的子类, 保留了存储顺序 42 3.迭代Set集合 43 a.迭代器Iterator 44 b.增强for循环 45 4.TreeSet 46 使用二叉树算法进行存储, 需要指定比较算法 47 自然顺序: 在要存储的对象的类上实现Comparable接口, 重写Comparable接口中的compareTo()方法 48 比较器顺序: 在构造函数中传入一个Comparator接口的子类对象, 那么TreeSet在存储对象的时候就会调用这个对象的compare方法 49 如果两种方式都存在, 那么优先比较器 50 51 三.Map 52 1.HashMap: 53 在每次存储键值对的时候, 调用Key对象的hashCode()方法计算一个哈希值. 在集合中查找是否有哈希值相同的Key对象. 54 如果没有哈希值相同的Key对象就直接存入键值对. 55 如果有哈希值相同的Key对象, 那么和这些相同的Key对象进行equals()比较. 56 比较结果为false就直接存入, 比较结果为true则将Value对象覆盖. 57 2.TreeMap: 58 使用二叉树算法对Key对象排序. 和TreeSet原理相同, 有两种指定算法的方式. 59 3.Hashtable: 60 原理和HashMap相同, 线程安全, 效率低. 不允许null键和null值 61 4.LinkedHashMap: 62 HashMap的子类, 可以保留存储顺序 63 5.Properties: 64 Hashtable的子类, 通常用来操作配置文件, Key和Value都是String. 65 66 67 学习集合的同时,可以应用JDK5新特性对其进行操作: 68 1.泛型 69 在集合指定泛型之后, 只能存储同一类型的对象, 获取对象时得到的也是该类型对象, 无序强转. 70 2.增强for循环 71 for(类型 变量名 : 容器) 72 3.可变参数 73 在参数列表中使用"类型... 变量名"形式定义一个形参, 该参数可以接收同一类型的0个,1个,多个或者一个数组. 74 该参数只能放在参数列表的最后一个