当前位置 博文首页 > wsc的博客:懂得java集合的特点和使用

    wsc的博客:懂得java集合的特点和使用

    作者:[db:作者] 时间:2021-07-10 13:06

    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()

    cs