0
点赞
收藏
分享

微信扫一扫

13、集合

小沙坨 2022-04-08 阅读 74
java

一、集合

二、集合的框架体系(必背

主要分两大类(必

单双列集合的区别

三、Collection 方法

1、Collection 接口实现类的特点

注:list.add(10); 等价于list.add(new Integer(10)); 其余的同理

2、Collection 接口遍历元素方式1---使用Iterator(迭代器)

案例:

3、Collection 接口遍历元素方式2--- for 循环增强

注:增强 for 也可以用在数组上

底层依然是迭代器(可以理解为简单的迭代器)

四、List 接口和常用方法

注:list.subList();左闭右开

1、List 的三种遍历方式

2、ArrayList 的注意事项

3、ArrayList 的底层操作机制源码分析(重点、难点)(扩容机制)

注:transient 表示瞬间,短暂的,表示改属性不会被序列化

4、Vector 底层结构和源码分析

5、Vector 和 ArrayList 的比较

6、双链表模拟

  1. LinkedList 底层结构

CRUD(增删改查)

7、ArrayList 和 LinkedList 比较

五、Set 接口和常用方法

1、Set 接口基本介绍

2、Set 接口的常用方法

注:Set接口的遍历方式

3、HashSet 全面说明

4、数组链表模拟(HashSet底层说明)

5、HashSet 扩容机制

练习:

public class HashSetExercise {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(new Employee("milan",18));
        hashSet.add(new Employee("smith",28));
        hashSet.add(new Employee("milan",18));
        System.out.println(hashSet);
    }
}
/*
定义一个Employee类,该类包含:private 成员属性name,age 要求:
1、创建3个Employee对象放入HashSet中
2、当name和age的值相同时,认为是相同员工,不能添加到HashSet集合中
 */
class Employee{
    private String name;
    private int age;


    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public int getAge() {
        return age;
    }


    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //如果name 和 age 值相同,则返回hash值
    //重写 equal 和 hashcode方法


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return age == employee.age && Objects.equals(name, employee.name);
    }


    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

6、LinkedHashSet

7、TreeSet 的使用

public class TreeSet_ {
    public static void main(String[] args) {


        //1、当我们使用午餐构造器创建 TreeSet 时,仍然是无序的
        //2、希望添加的元素,按照字符串大小排序
        //3、使用 TreeSet 提供的构造器,可以传入一个比较器(匿名内部类),并指定排序规则


        //TreeSet treeSet = new TreeSet();
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //调用compareTo() 方法。让两个字符串相比较(默认是按照字符的大小比较的)
                return ((String) o1).compareTo((String) o2);
            }
        });
        //添加数据
        treeSet.add("jack");
        treeSet.add("tom");
        treeSet.add("sp");
        treeSet.add("a");
        System.out.println(treeSet);
    }
}

六、Map 接口和常用方法

1、Map 接口实现类的特点

2、Map 接口和常用方法

3、Map 六大遍历方式

//Map 六大遍历
@SuppressWarnings({"all"})
public class Map_ {
    public static void main(String[] args) {
        //Map的特点
        Map map = new HashMap();
        map.put("邓超", "孙俪");//第一个是key,第二个是 values
        map.put("王宝强", "马蓉");
        map.put("宋喆", "马蓉");
        map.put("刘令博", null);
        map.put(null, "刘亦菲");
        map.put("鹿晗", "关晓彤");


        //第一组:先取出 所有的key,通过key 取出对应的Value
        Set keyset = map.keySet();
        //(1)增强for
        System.out.println("=====第一种方式:增强for循环=====");
        for (Object key : keyset) {
            System.out.println(key + "-" + map.get(key));
        }
        //(2)迭代器
        System.out.println("=====第二种方式:迭代器=====");
        Iterator iterator = keyset.iterator();
        while (iterator.hasNext()) {
            Object key = iterator.next();
            System.out.println(key + "-" + map.get(key));
        }


        //第二组:把所有的values取出
        Collection values = map.values();
        //这里可以使用所有的Collection使用的遍历方法
        //(1)增强for循环
        System.out.println("=====取出所有的value,增强for=====");
        for (Object o : values) {
            System.out.println(o);
        }
        //(2)迭代器
        System.out.println("=====取出所有的value,迭代器=====");
        Iterator iterator2 = values.iterator();
        while (iterator2.hasNext()) {
            Object value = iterator2.next();
            System.out.println(value);
        }


        //第三组:通过 EntrySet 来获取 k-v
        Set entryset = map.entrySet();//EntrySet<Map.Entry<K,V>>
        //(1)增强for
        System.out.println("=====使用EntrySet 的 for增强(第三种)=====");
        for (Object entry : entryset) {
            //将 entry 对象转成 Map.Entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey()+"-"+m.getValue());
        }
        //(2)迭代器
        System.out.println("=====使用EntrySet 的 迭代器(第四种)=====");
        Iterator iterator3 = entryset.iterator();
        while (iterator3.hasNext()) {
            Object entry = iterator3.next();
            //HashMap$Node -实现-> Map.Entry (getKey,getValue)
            //System.out.println(entry.getClass());
            //向下转型 Map.Entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey()+"-"+m.getValue());
        }
    }
}

4、HashMap 小结

5、HashTable

HashMap 和 HashTable 对比

6、Properties

注:1、可以通过 k-v 存放数据,当然 key 和 value 不能为 null

2、Properties 继承 Hashtable

3、如果有相同的 key ,value 会被替换

7、TreeMap

public class TreeMap_ {
    public static void main(String[] args) {
        //使用默认的构造器
        //TreeMap treeMap = new TreeMap();
        //要求传入的 key(String) 的大小进行排序
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //要求传入的 key(String) 的大小进行排序
                return ((String) o1).length() - ((String) o2).length();
                //return ((String) o1).compareTo((String) o2);
            }
        });
        treeMap.put("jack", "杰克");
        treeMap.put("tom", "汤姆");
        treeMap.put("kielil", "凯勒");
        treeMap.put("smith", "斯密思");
        System.out.println(treeMap);
    }
}

七、总结-开发中如何选择集合实现类(记住)

八、Collections 工具类

public class Collections_ {
    public static void main(String[] args) {
        //创建ArrayList集合,用于测试
        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("milan");
        System.out.println(list);


        //reverse():反转元素顺序
        Collections.reverse(list);
        System.out.println("=====反转=====");
        System.out.println(list);


        //shuffle():随机排序
        Collections.shuffle(list);
        System.out.println("=====随机排序=====");
        System.out.println(list);


        //sort():根据元素的自然顺序对指定List集合元素按升序排序
        Collections.sort(list);
        System.out.println("=====自然排序=====");
        System.out.println(list);


        //sort(list,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
        // 按照字符串的长度大小排序
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        System.out.println("=====按照字符串的长度大小排序=====");
        System.out.println(list);


        //swap(list,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交谈
        Collections.swap(list, 0, 1);
        System.out.println("=====按照指定位置交换=====");
        System.out.println(list);


        //Object max(Collection):根据元素的自然顺序,返回给定集合中最大元素
        System.out.println("自然顺序最大元素=" + Collections.max(list));


        //Object max(Collection, Comparator):根据 Comparator 指定的顺序,返回给定集合中最大元素(min 同理)
        //比如:我们要返回长度最大的元素
        Object max = Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        System.out.println("长度最大的元素=" + max);


        //int frequency(Collection, Object): 返回指定集合中指定元素的出现次数
        System.out.println("tom出现的次数=" + Collections.frequency(list, "tom"));


        //void copy(List dest, List src):将src中的内容复制到dest中
        ArrayList dest = new ArrayList();
        //为了完成一个完整的拷贝,我们需要先给dest 赋值,大小和 list.size() 一样大
        for(int i=0; i<list.size(); i++){
            dest.add("");
        }
        //拷贝
        // Collections.copy(dest , list); 抛出索引越界的异常
        Collections.copy(dest , list);
        System.out.println("=====拷贝=====");
        System.out.println("dest="+dest);


        //boolean replaceAll(list list, Object oldVal, Object newVal):使用新值替换 List 对象的所有值
        //如果list中,有tom就替换成汤姆
        Collections.replaceAll(list,"tom","汤姆");
        System.out.println("list替换后="+list);
    }
}

举报

相关推荐

Scala学习笔记13: 集合

13

0 条评论