第四天:java基础复习(集合)

Map

Map

        格式:<K,V>,K键,V值;将键映射到值,不能包含重复的键,每个键只能映射一个值,当输入重复键时,会进行替换;

        创建:以多态的方式;

        具体实现:HashMap   Map<String,Object> map = new HashMap<String,Object>();

TreeMap

        可以比较元素大小的Map集合,会对传入的Key进行大小的排序;可以使用元素的自然排序,也可以使用集合中自定义的比较容器来进行排序;

特点:

        不允许重复键;

        可以插入null,键和值都可以;

        可对元素进行排序;

        无序集合,插入和遍历顺序不一致;

基本操作:

1、遍历元素
Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet();
2、获取所有key
Set<String> keySet = treeMap.keySet();
3、获取所有value
Collection<Integer> valueList = treeMap.values();
4、获取集合内第一个元素
String firstKey = treeMap.firstKey();
5、获取集合内最后一个元素
 String lastKey =treeMap.lastKey();

排序:

        自然元素排序:需要让被比较的元素实现Comparable接口,这是因为在调用put()方法时,会将传入的元素转化为Comparable类型对象;

TreeMap<Integer,String> treeMapFirst = new TreeMap<Integer, String>();
treeMapFirst.put(1,"huangqiuping");
treeMapFirst.put(6,"huangqiuping");
treeMapFirst.put(3,"huangqiuping");
System.out.println(treeMapFirst.toString());
结果:{1=huangqiuping, 3=huangqiuping, 6=huangqiuping}

        使用自定义比较器比较:需要在创建treeMap对象时,将自定义比较器对象传到treeMap构造方法中;需要实现Comparator接口,并实现比较方法compare(to1,to2);

public class SortedTestComparator implements Comparator<SortedTest> {
    //自定义比较器:实现compare(To1,To2)方法:
    public int compare(SortedTest sortedTest1, SortedTest sortedTest2) {
        int num = sortedTest1.getAge() - sortedTest2.getAge();
        if(num==0){//为0时候,两者相同:
            return 0;
        }else if(num>0){//大于0时,后面的参数小:
            return 1;
        }else{//小于0时,前面的参数小:
            return -1;
        }
    }
}

HashMap

        用于存储K-V键值对的集合,每一个元素的初始值都是Null,无序的;

        常用方法:put() 、get()

        HashMap默认的长度为16,拓展或初始化长度必须是2的幂(确定位置时,碰撞概率会比较低)

        put过程:

                1、对Key求Hash值,然后再计算下标
                2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)
                3、如果碰撞了,以链表的方式链接到后面
                4、如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
                5、如果节点已经存在就替换旧值
                6、如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)
                查找时调用hash方法,找到具体的key所对应的hash,然后再到entry中去找value

比较:

HaspMap treeMap
无序 有序
查询速度更快 查询速度慢
适合插入、删除、查找 适合排序
非线程安全 非线程安全
输出结果无序 输出结果已排序
数组+链表+红黑树 红黑树

List

        List是一个接口,继承于Collection;元素可以重复,有序存储(按照插入顺序进行有效存储),可以添加null。

ArrayList

        底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素;ArrayList更适合检索和在末尾插入或删除。初始容量为10.

常用方法:

方法 作用
add(E) 添加元素
set(int index,E element) 覆盖指定位置的元素
remove(int index) 删除指定位置的元素
get(int index) 获取指定位置的元素
indexOf(Object o) 获取指定位置的索引
iterator() 获取迭代器
size() 获取集合大小
isEmpty() 判断集合是否为空
clear() 清空集合
stream() 为集合创建流

LinkedList

        底层数据结构是双向链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素;inkedList更适合从中间插入或者删除

常用方法:

方法 作用
getFirst 返回此列表中的第一个元素。
getLast 返回此列表中的最后一个元素。
removeFirst 从此列表中删除并返回第一个元素。
removeLast 从此列表中删除并返回最后一个元素。
add 将指定的元素追加到此列表的末尾。
addFirst 在该列表开头插入指定的元素。
size 返回此列表中的元素数。
clear 从列表中删除所有元素。 此呼叫返回后,列表将为空。
contains 如果此列表包含指定的元素,则返回true`
listIterator 从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。
straem 为集合创建流

Vector

        底层数据结构是数组,查询快、增删慢,线程安全(大部分的方法都包含关键字synchronized),效率低,可以存储重复元素;如果涉及到多线程,选择Vector

1、添加        addFirst()    addLast()
2、删除        removerFirst()    removerLast()
3、获取        getFirst()    getLast()

比较

ArrayList LinkedList Vector
线程不安全,效率高 线程不安全,效率高 线程安全,效率低
数组 链表 数组
查询快,增删慢 查询慢,增删快 查询快,增删慢

Set

        treeMap主要功能用于排序;LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出);HashSet只是通用的存储数据的集合;

HashSet

        底层采用二叉树,元素无序且唯一,线程不安全,效率高,可以存储null元素;

常用方法:

方法 作用
add 添加元素
containsKey(Object) 查询集合中是否包含指定键
remove(Object) 删除指定键
iteartor 迭代器
size() 获取集合大小
isEmpty() 判断集合是否为空
clear() 清空集合

LinkedHashSet

        底层采用链表和Hash表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高;

常用方法:

方法 作用
add 添加元素
containsKey(Object) 查询集合中是否包含指定键
remove(Object) 删除指定键
iteartor 迭代器
size() 获取集合大小
isEmpty() 判断集合是否为空
clear() 清空集合

TreeSet

        底层采用二叉树实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性;

常用方法:

方法 作用
add 添加元素
containsKey(Object) 查询集合中是否包含指定键
remove(Object) 删除指定键
iteartor 迭代器
size() 获取集合大小
isEmpty() 判断集合是否为空
clear() 清空集合
descendingIterator 倒叙遍历

比较

HashSet LinkedHashSet TreeSet
实现Set接口 实现Set接口 实现Set接口
线程不安全 线程不安全 线程不安全
添加、查询快 添加、修改、删除快;有序 只有需要对元素进行排序时使用
数组+链表+红黑树 哈希表+双向链表 红黑树
可以有null值 可以有null值 可以有null值

List与Set的区别

        1、List中元素可以重复,并且是有序的(按照插入的顺序进行存储);Set中的元素是不可重复的(重复元素会被覆盖掉),并且无序。

        2、List和Set都继承Collection接口;

        3、Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变

猜你喜欢

转载自blog.csdn.net/qq_35056891/article/details/126468364