集合框架-集合查阅的技巧
1 集合类的由来: 2 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定 3 就使用集合容器进行存储。 4 5 集合特点:(数组和集合的区别) 6 1,用于存储对象的容器。 7 2,集合的长度是可变的。 8 3,集合中不可以存储基本数据类型值。 9 10 11 集合容器因为内部的数据结构不同,有多种具体容器。 12 不断的向上抽取,就形成了集合框架。 13 14 框架的顶层Collection接口: 15 16 Collection的常见方法: 17 18 1,添加。 19 boolean add(Object obj): 20 boolean addAll(Collection coll): 21 22 2,删除。 23 boolean remove(Object obj): 24 boolean removeAll(Collection coll): 25 void clear(); 26 27 28 3,判断: 29 boolean contains(Object obj): 30 boolean containsAll(Collection coll): 31 boolean isEmpty():判断集合中是否有元素 32 33 4,获取: 34 int size(): 35 Iterator iterator():取出元素的方式:迭代器。 36 该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。 37 所以该迭代器对象是在容器中进行内部实现的。 38 对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可 39 也就是iterator方法。 40 41 Iterator接口就是对所有的Collection容器进行元素取出的公共接口。 42 //一个事物访问另外一个事物内部的成员,可以用内部类实现 43 44 5,其他: 45 boolean retainAll(Collection coll):取交集。 46 Object[] toArray();将集合转成数组 47 48 ------------------------ 49 Collection 50 |--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。 51 |--Set:元素不能重复,无序。(有可能有序,因为如果你存的就是他这里面的顺序,你就会觉得是有序) 52 53 List:特有的常见方法:有一个共性特点就是都可以操作角标。 54 55 1,添加 56 void add(index,element); 57 void add(index,collection); 58 59 60 2,删除: 61 Object remove(index); 62 63 3,修改: 64 Object set(index,element); 65 66 4,获取: 67 Obejct get(index); 68 int indexOf(object); 69 int lastIndexOf(object); 70 List subList(from,to); 71 72 list集合是可以完成对元素的增删改查 73 74 List: 75 |--Vector:内部是数组数据结构。是同步的。效率低(是线程安全的) (增删,查询都很慢)jdk1.0就有 76 |--ArrayList:内部是数组数据结构,是不同步的。效率高,替代Vector。(查询速度快)(要么给ArrayList加锁,要么用其他方式,vector一般就不用了) 77 |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快(适合频繁增删)空间不连续所以查询慢 78 LinkedList也是有索引的,但是你查的数据是不连续 所以可能是5 9 13这样的 79 80 LinkedList: 81 addFirst(); 82 addLast(); 83 jdk1.6 84 offerFirst(); 85 offerLast(); 86 87 getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementEception 88 getLast(); 89 jdk1.6 90 peekFirst();//获取但不移除,如果链表为空,返回null 91 peekLast(); 92 93 removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementEception 94 removeLast(); 95 jdk1.6 96 pollFirst();//获取并移除,如果链表为空,返回null 97 pollLast(); 98 99 100 101 ---------------------------------- 102 103 104 Set:元素不可以重复,是无序。 105 Set接口中的方法和Collection一致。 106 |--HashSet:内部数据结构是哈希表,是不同步的。 107 如何保证该集合的元素唯一性呢? 108 是通过对象的hashCode和equals方法来完成对象唯一性的。 109 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 110 如果对象的hashCode值相同,那么再次判断对象的equals方向是否为true。 111 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。 112 113 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法, 114 一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法 115 建立对象判断是否相同的依据。 116 117 |--TreeSet:可以对Set集合中的元素进行排序。是不同步的。 118 判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。 119 120 TreeSet对元素进行排序的方式一: 121 让元素自身具备比较功能,元素就需要实现Comparable接口覆盖compareTo方法 122 123 如果不按照对象中具备的自然顺序进行排序。如果对象不具备自然顺序(对象可能不是我们自己定义的) 124 可以使用TreeSet集合第二种排序方式二: 125 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法(不是compareTo哦) 126 将该类对象作为参数传递给TreeSet集合的构造函数。 127 128 哈希表确定元素是否相同 129 * 1,判断的是两个元素的哈希值是否相同。 130 * 如果相同,在判断两个对象的内容是否相同吧 131 * 2,判断哈希值相同,其实判断的是对象的hashCode方法。 132 * 判断内容相同,用的是equals方法。 133 * 134 * 注意:如果哈希值不同,是不需要判断equals 135 136 137 138 139 140 141 -------------------------------------- 142 泛型: 143 jdk1.5出现的安全机制。 144 145 好处: 146 1,将运行时期的问题ClassCastException转到了编译时期。 147 2,避免了强制转换的麻烦 148 149 <>:什么时候用?当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可 150 其实<>就是一个接收具体引用数据类型的参数范围。 151 152 在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。 153 154 泛型技术是给编译器使用的技术,用于编译时期。确保了类型安全 155 156 运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。 157 为什么擦除呢?因为为了兼容运行的类加载器。 158 159 泛型的擦除补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换了 160 161 泛型的通配符。?问号 (未知类型) 162 163 void show(int x,int y) 164 165 class Tool<e1,e2,e3,e4> 166 167 168 例如 Tool<String,Demo,Person,Integer> t = new Tool<String,Demo,Person,Integer>(); 169 170 171 =========================== 172 173 集合的一些技巧 174 175 需要唯一吗? 176 需要: Set 177 需要指定顺序: 178 需要:TreeSet 179 不需要:HashSet 180 但是想要有个和存储一致的顺序(有序):LinkedHashSet 181 182 不需要:List 183 需要频繁增删吗? 184 需要:LinkedList 185 不需要:ArrayList 186 187 如何记住每一个容器的结构和所属体系? 188 189 List 190 |--ArrayList 191 |--LinkedList 192 193 Set 194 |--HashSet 195 |--TreeSet 196 197 后缀名就是该集合所属的体系 198 前缀名就是该集合的数据结构、 199 200 看到array:就要想要数组,就想到查询快,有角标。 201 看到link:就想到链表,就要想要增删快,就要想到add get remove+first last的方法 202 看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode和equals方法。 203 看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable和Comparator 204 205 而且通常这些常用的集合容器都是不同步的。 206 207 208 209 210 211 212 213 214