List<E>与Set<E>都继承接口Collection<E>
List<E>:
1、可以添加重复的对象
2、可以插入多个null元素
3、是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序。
4、常用实现类ArrayList、LinkedList、Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适,Vector 表示底层数组,线程安全。

Set<E>:
1、Set<E>方法不允许重复对象
2、Set<E>只允许插入一个null元素
3、Set方法是无序容器,无法保证每个元素的存储顺序,实现类是HashSet、LinkedHashSet、TreeSet。
最流行的是基于 HashMap 实现的 HashSet;
TreeSet 实现了 SortedSet 接口,底层使用红黑树,因此 TreeSet 是一个根据其 compare() 和compareTo() 的定义进行排序的有序容器,而且可以重复,TreeSet只能放同一类型的对象。
TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
TreeSet排序:实现Comparable接口,重写接口中的compareTo方法,返回正数是升序,返回负数是降序,返回0是相等。
HashMap排序输出:1、按照Key排序,把Key取出,Arrays.Sort排序Key,然后按照Key的顺序循环;2、按照Value排序,把entrySet取出,使用list.Sort或者Collections.Sort方法重写compareTo排序。https://www.jb51.net/article/178238.htm
5、Set判断两个对象是否相同,使用的是equals(),而不是使用==,Set是非线程安全的。
6、ArrayList和LinkedList不具有线程安全性。若想在多线程下使用,应该使用Colletions类中的静态方法synchronizedList()对ArrayList和LinkedList进行调用即可。
7、LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。
8、ArrayList不能使用多态
9、Arrays.asList(),参数需要是包装类。
10、循环List的三种方式:for(int i=0;i<list.length;i++)、增强for(object obj:list)、迭代器Iterator:list.iterator();
11、Set无序性不是随机性,元素存储顺序并不是按照添加顺序来存的,是通过hashCode来计算存放位置的。不可重复性:Set中的元素不可重复。
12、HashSet是数组加链表的方式存储数据的。
13、Set一致性:Set中的对象如果equals返回true,那hashCode()方法返回的哈希值也必须要相同;一个对象多次调用hashCode()返回的值应该一样;重写equals用到的字段,重写hashCode也必须参与计算。
14、Map》
Hashtable:不能存null
  》Properties
HashMap:可以存null
  》LinkedHashMap
TreeMap

1、Map不是collection的子接口或者实现类。Map是一个接口。
2、Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4、Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

HashMap循环的方式

{
            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("a", "1");
            hashMap.put("b", "2");
            hashMap.put("c", "3");

            {
                System.out.println("1. 使用 Iterator 遍历 HashMap EntrySet");
                Iterator<Map.Entry<String, String>> iterator = hashMap.entrySet().iterator();
                while (iterator.hasNext()) {
                    Map.Entry<String, String> entry = iterator.next();
                    System.out.println(entry.getKey() + "/" + entry.getValue());
                }
            }

            {
                System.out.println("2. 使用 Iterator 遍历 HashMap KeySet");
                Iterator<String> iterator = hashMap.keySet().iterator();
                while (iterator.hasNext()) {
                    String key = iterator.next();
                    System.out.println(key + "/" + hashMap.get(key));
                }
            }

            {
                System.out.println("3. 使用 For-each 循环遍历 HashMap");
                for (Map.Entry<String, String> entry : hashMap.entrySet()) {
                    System.out.println(entry.getKey() + "/" + entry.getValue());
                }
            }

            {
                System.out.println("4. 使用 Lambda 表达式遍历 HashMap");
                hashMap.forEach((key, value) -> {
                    System.out.println(key + "/" + value);
                });
            }

            {
                System.out.println("5. 使用 Stream API 遍历 HashMap");
                hashMap.entrySet().stream().forEach((entry) -> {
                    System.out.println(entry.getKey() + "/" + entry.getValue());
                });
            }
        }

 

posted on 2021-06-10 15:35  邢帅杰  阅读(113)  评论(0编辑  收藏  举报