当前位置 博文首页 > wsc的博客:懂得java集合的特点和使用
ArrayList集合
1、ArrayList的特点
主要特点:按照插入顺序来保存元素,可以利用下标来查找值
2、ArrayList的优点:
?? ?按照下标访问元素最快,List是有序且重复的
3、ArrayList的缺点:
?? ?在中间插入元素很慢
?? ?删除元素很慢
4、ArrayList的主要功能:
? 1、增加
?? ??? ?多个添加:通过构造函数ArrayList(Collection<? extends E> c),可以添加元素
?? ??? ?多个添加?? ?:addAll(Collection<? extends E> c)和addAll(int index, Collection<? extends E> c)(有无下标的添加?? ?)
?? ??? ?单个添加:add(E e)和add(int index, E element)(有无下标的添加)
? ?2、删除
?? ? ?? ?单个删除:remove(Object o)根据equal来判断对象是否相等来进行删除和remove(int index)根据下标来进行删除
?? ??? ?多个删除:removeAll(Collection<?> c)删除本对象里面含有的所有c里面的对象,通过equal来判断是否相等
?? ??? ?全部删除:clear()删除所有的元素
? 3、改变
?? ??? ?改变单个:set(int index, E element)(改变也只能一个一个的改变)
?? ?4、查找?
?? ??? ?通过下标查找:get(int index)(查找单个对象)
?? ??? ?通过对象来查找:contains(Object o),通过equal来判断是否存在这个对象(查找单个对象)
?? ??? ?多个对象的查找:containsAll(Collection<?> c)是否整个c在这个集合里,通过equal来判断是否相等。
? 5、遍历
?? ??? ?通过下标的遍历:get(int index)
for(int i=0;i<list.size();i++) {
?? ??? ??? ??? ?System.out.println(list.get(i));
?? ?}
?? ??? ?通过foreach遍历:foreach语句
? ?? ??? ??? ?for(String x:list) {
?? ??? ??? ??? ?System.out.println(x);
?? ??? ??? ??? ?}
?? ??? ?迭代器遍历:iterator()
?Iterator iter = list.iterator();
while(iter.hasNext()){
?? ??? ??? ?System.out.println(iter.next();
?? ??? ?}
? 6、下标与对象之间的转换
?? ?通过下标获取对象:get(int index)
?? ??? ?通过对象获取下标:indexOf(Object o)最前面的对象、lastIndexOf(Object o)最后面一个对象,通过equal来判断。
? 7、状态
?? ??? ?大小:size()
?? ??? ?是否为空:isEmpty()
8、获取子集
?? ??? ?子集获取:subList(int fromIndex, int toIndex)
??? ?9、链表转化为数组
?? ??? ?转化为数组:toArray(T[] a)
重写List的排序方法
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
? ? ? ? ? ? //升序排序
? ? ? ? ? ? public int compare(Entry<String, String> o1, Entry<String, String> o2) {
? ? ? ? ? ? ? ? return o1.getValue().compareTo(o2.getValue());
? ? ? ? ? ? }
? ? ? ? });
HashMap集合(无序)
HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,不是线程安全的?
hashMap用hash表来存储map的键?
key是无序唯一,可以有一个为null?
value无序不唯一,可以有多个个null?
我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.
HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。 HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。
如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
?
HashMap可以通过下面的语句进行同步:?
Map m = Collections.synchronizeMap(hashMap);
1、增加
?? ??? ?多个添加:putAll(?extends Object,? extrnds Objec)?? ?
单个添加:put(Object,Object)
2、删除
?? ? ?? ?单个删除:remove(Object o)根据equal来判断对象是否相等来进行删除和remove(int index)根据下标来进行删除
?? ??? ?指定删除:remove(Object key,Object value) 键值对都符合就删除
?? ??? ?全部删除:clear()删除所有的元素
3、改变
?? ??? ?replace(key,value); ?取代
? ? ? ? replace(key,oldValue,newValue); ?取代
4、查找?
?? ??? ?通过下标查找:get(Object key)(查找单个对象)
?? ??? ?通过键来查找:containsKey(Object key) ? --> ?boolean,通过equal来判断是否存在这个对象(查找单个对象)
?? ??? ?通过值来的查找:containsValue(Object value) ? --> boolean 是否整个c在这个集合里,通过equal来判断是否相等。
5.遍历
HashMap的四种遍历方式
//第一种:普通使用,二次取值
System.out.println("\n通过Map.keySet遍历key和value:"); ?
?for(String key:map.keySet())
?{
? System.out.println("Key: "+key+" Value: "+map.get(key));
?}
?
?//第二种
?System.out.println("\n通过Map.entrySet使用iterator遍历key和value: "); ?
?Iterator map1it=map.entrySet().iterator();
?while(map1it.hasNext())
?{
? Map.Entry<String, String> entry=map1it.next();
? System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
?}
?
?//第三种:推荐,尤其是容量大时 ?
?System.out.println("\n通过Map.entrySet遍历key和value"); ?
?for(Map.Entry<String, String> entry: map.entrySet())
?{
? System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
?}
?
?//第四种 ?
?System.out.println("\n通过Map.values()遍历所有的value,但不能遍历key"); ?
?for(String v:map.values())
?{
? System.out.println("The value is "+v);
?}
?? ??? ?
6、下标与对象之间的转换
?? ?通过键获取值:get(int index)
7、状态
?? ??? ?大小:size()
?? ??? ?是否为空:isEmpty()
?
TreeMap的集合的特点
1.无序,不允许重复(无序指元素顺序与添加顺序不一致)?
2.TreeMap集合默认会对键进行排序,所以键必须实现自然排序和定制排序中的一种?
3..底层使用的数据结构是二叉树
可查看HashMap的特点
当未实现 Comparator 接口时,key 不可以为null,否则抛 NullPointerException 异常;
当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问。
排序:
默认排序规则:按照key的字典顺序来排序(升序)
也可以自定义排序规则:要实现Comparator接口。
TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public int compare(String o1, String o2) {
? ? ? ? ? ? ? ? ? ? return o2.compareTo(o1);
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? });
例如:对value进行排序
ublic static void sortByValue() {
?? ??? ?Map<String,String> map = new TreeMap<String,String>();
?? ??? ?map.put("a", "dddd");
?? ??? ?map.put("d", "aaaa");
?? ??? ?map.put("b", "cccc");
?? ??? ?map.put("c", "bbbb");
?? ??? ?
?? ??? ?List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(map.entrySet());
?? ??? ?
?? ??? ?Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
? ? ? ? ? ? //升序排序
? ? ? ? ? ? public int compare(Entry<String, String> o1, Entry<String, String> o2) {
? ? ? ? ? ? ? ? return o1.getValue().compareTo(o2.getValue());
? ? ? ? ? ? }
? ? ? ? });
?? ??? ?
?? ??? ?for (Entry<String, String> e: list) {
?? ??? ??? ?System.out.println(e.getKey()+":"+e.getValue());
?? ??? ?}
?? ?}
?
?
1、增加
?? ??? ?多个添加:putAll(?extends Object,? extrnds Objec)?? ?
单个添加:put(Object,Object)
2、删除
?? ? ?? ?单个删除:remove(Object o)根据equal来判断对象是否相等来进行删除和remove(int index)根据下标来进行删除
?? ??? ?指定删除:remove(Object key,Object value) 键值对都符合就删除
?? ??? ?全部删除:clear()删除所有的元素
3、改变
?? ??? ?replace(key,value); ?取代
? ? ? ? replace(key,oldValue,newValue); ?取代
4、查找?
?? ??? ?通过下标查找:get(Object key)(查找单个对象)
?? ??? ?通过键来查找:containsKey(Object key) ? --> ?boolean,通过equal来判断是否存在这个对象(查找单个对象)
?? ??? ?通过值来的查找:containsValue(Object value) ? --> boolean 是否整个c在这个集合里,通过equal来判断是否相等。
5.遍历
HashMap的四种遍历方式
//第一种:普通使用,二次取值
System.out.println("\n通过Map.keySet遍历key和value:"); ?
?for(String key:map.keySet())
?{
? System.out.println("Key: "+key+" Value: "+map.get(key));
?}
?
?//第二种
?System.out.println("\n通过Map.entrySet使用iterator遍历key和value: "); ?
?Iterator map1it=map.entrySet().iterator();
?while(map1it.hasNext())
?{
? Map.Entry<String, String> entry=map1it.next();
? System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
?}
?
?//第三种:推荐,尤其是容量大时 ?
?System.out.println("\n通过Map.entrySet遍历key和value"); ?
?for(Map.Entry<String, String> entry: map.entrySet())
?{
? System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
?}
?
?//第四种 ?
?System.out.println("\n通过Map.values()遍历所有的value,但不能遍历key"); ?
?for(String v:map.values())
?{
? System.out.println("The value is "+v);
?}
?? ??? ?
6、下标与对象之间的转换
?? ?通过键获取值:get(int index)
7、状态
?? ??? ?大小:size()
?? ??? ?是否为空:isEmpty()
?
?
?
?
?
?
?
?
HashSet特点
HashSet底层是通过HashMap实现的,所以可以有一个null;当然你多了也是取代第一个,
HashSet属于Set,所以不允许重覆盖,重复会覆盖.
1、增加
?? ??? ?多个添加:addAll(Collection<?extends Object> c )?? ?
单个添加:add(Object o)
2、删除?? ?
多个删除:removeAll(Collection<>> c )
?? ? ?? ?单个删除:remove(Object o)根据equal来判断对象是否相等来进行删除?? ??? ?
指定删除:removeIf(filter) 筛选如果有的就删除?? ??? ?
全部删除:clear()删除所有的元素
3并集和交集
?? ??? ?set1,retainAll(set2);交集
? ? ? ? set1.addAll(set2); ?并集
4、查找?
?? ??? ?只能通过contains(Object o)来判断是否有.
containsAll()
5.遍历
1.for循环遍历:
for (String str : set) {
? ? ? System.out.println(str);
}
2.迭代器遍历
Iterator<String> it = set.iterator();
while (it.hasNext()) {
??? ??? ? String str = it.next();
??? ? System.out.println(str);
}
?? ??? ?
7、状态
?? ??? ?大小:size()
?? ??? ?是否为空:isEmpty()
?
TreeSet集合特点
与HashSet相似,类似,不能存储null
?
Vector集合特点
和ArrayList不同,Vector中的操作是线程安全的
1、增加
?? ??? ?add(Object o) -->boolean
add(index,Object o) -->boolean
addElement(Object o) -->void
addAll(Collection <?> c)-->boolean
addAll(int index,Collection<?> c)-->boolean
2.删除?? ?
removeAll(Collection<>> c )?
?? ? ?? ?removeElement(Object o) ?--> boolean?
removeIf(filter)?
removeElementAt(index) ?指定下标进行删除
replace()?? ?
clear()删除所有的元素
clone()克隆
3.改变
? ? ?insertElementAt(value,index)?
setElementAt(value,index)
set(index,value)
3并集和交集
?? ??? ?set1,retainAll(set2);交集
? ? ? ? set1.addAll(set2); ?并集
4、查找?
?? ??? ?只能通过contains(Object o)来判断是否有.
get()
containsAll()
ElementAt() ?-->Integer
indexof(value)
indexof(value,index) ? ?from start to index
6.遍历
1.for循环遍历:
for(Student str:students){
? ? ? ? ? ? System.out.println(str.getName()+"-->"+ str.getAge());
}
2使用迭代器遍历?
Iterator iterator=students.iterator();
while(iterator.hasNext()){
? ? ? ? System.out.println(iterator.next());
? }?? ??? ?
3.使用size()和get()方法遍历
? ? ? ? for(int i=0;i<students.size();i++){
? ? ? ? ? ? System.out.println(students.get(i));
? ? ? ? }
4.使用Vector特有的迭代器遍历
? ?Enumeration<Student> elements=students.elements();
? ? ? ? while(elements.hasMoreElements()){
? ? ? ? ? ? System.out.println(elements.nextElement());
? ? ? ? }
7、状态
?? ??? ?大小:size()
?? ??? ?是否为空:isEmpty()