Java 学习(2022-07-10)

123 阅读4分钟
  1. 集合(Collection)

    1.1 使用集合的好处

    (1)可以动态保存任意多个对象,使用比较方便!

    (2)提供了一系列方便的操作对象的方法:add、remove、set、get等

    (3)使用集合添加、删除新元素的示意代码

    1.2 单列集合(主要存放值)

    1.2.1 List 接口

    特点:可以重复、元素有序

    (1)LinkedList:

    底层源码分析:底层是双向链表,增删效率高,改查的效率低

    (2)ArrayList:线程不安全

    底层源码分析:

    ArrayList 中维护了一个 Object 类型的数组 elementData. transient Object [] elementData // transient 表示该属性不会被序列化

    当创建 ArrayList 对象时,如果使用无参构造器,则初始 elementData 容量为0,第一次添加,扩容element为10,如需在次扩容,扩容1.5

    如果使用指定大小构造器,则初始 elementData 容量为指定大小,如需在次扩容,扩容1.5

    (3)Vector

    底层源码分析:

    Vector 底层也是一个对象数组,protected Object [] elementData;

    Vector 是线程同步的,线程安全,因为 Vector 类的操作方法中有 synchronized 关键字

    在开发过程中,如果需要考虑线程同步,建议使用 Vector

    如果无参,默认10,满后按照 2 倍扩容。

    如果指定大小,则每次按照 2 倍扩容

    1.2.2 Set 接口

    (1)基本介绍

    1)无序

    2)不允许重复元素

    3)JDK 的实现类有 TreeSet、HashSet

    (1)HashSet

    (2)TreeSet

    (3)LinkedHashSet 是 HashSet 的子类

    底层:数组+双向链表

    1.2.3 集合常用方法

     List list = new ArrayList();
    //        add:添加元素
            list.add("Jack"); // [Jack]
    //        remove:移除元素
            list.remove("Jack"); // 删除值为 Jack 的元素
            list.remove(0);  // 删除索引为 0 的元素
    //        contains:查找元素
            list.contains(true); // contains()判断list中是否包含指定元素,返回布尔值
    //        size:获取元素个数
            list.size();
    //        isEmpty:判断是否为空
            list.isEmpty();
    //        clear:清空
            list.clear();
    ​
            ArrayList list2 = new ArrayList();
    //        addAll:添加多个元素
            list.addAll(list2);
    //        containsAll:查找多个元素是否存在
            list.containsAll(list2);
    //        removeAll:删除多个元素
            list.removeAll(list2);
    

    1.2.4 List 常用方法

            List list = new ArrayList();
            list.add("张三丰");
            list.add("贾宝玉");
    //        void add(int index , Object ele) 在索引为 index 处插入ele元素
            list.add(0, 5);
    //        void addAll(int index, Collection eles) 在索引为 index 后,插入 eles 集合中的所有元素
    //        void indexOf(Object obj)       返回Obj元素出现的第一次位置
    //        void lastIndexOf(Object obj)   返回Obj元素出现的最后一次位置
    //        void remove(int index)         移除索引为 index 的元素
    //        void set(int index, Object ele)将元素 ele 替换到索引为 index 中
    //        List subList(int fromIndex, int toIndex):返回 fromIndex 到 toIndex 中的子集合
    //        注意返回的子集合  fromIndex <= subList < toIndex
    

    1.2.5 Set 常用方法

            Set set = new HashSet();
            set.add(1);
            set.add(1);
            set.add(null);
            set.add("21312");
            System.out.println(set);  // [null, 1, 21312] 不能添加重复元素,无序
    

    1.2.7 遍历(集合、Set)

    // 集合可以通过: 迭代器、增强for循环、 for 循环 遍历
    Collection col = new ArrayList();
            col.add(new Book("三国演义", "罗贯中", 10.1));
            col.add(new Book("红楼梦", "曹雪芹", 12));
    ​
            Iterator iterator = col.iterator();
            while (iterator.hasNext()) {
                Object next =  iterator.next();
                System.out.println(next);
            }
    // Set 可以使用 迭代器、增强for循环遍历
            
    

image-20220710123003479.png

1.3 双列集合(主要存放键值对)

1.3.1 Map

(1)HashMap:线程不安全,没有实现同步

子类: LinkedHashMap

底层:`数组+链表+红黑树`

(1key不能重复,value可以重复

(2)无序

(3)一般 Map 的 key 使用 String 类

(4)常用方法

```
containsKey:查找键是否存在
keySet:获取所有的键
values:获取所有的值
entrySet:获取所有关系 k - v
    
    // 通过 HashMap 获取值的方法
     Map hashMap = new HashMap();
        hashMap.put("No1", new Staff("小李", 188888, 1));
        hashMap.put("No2", new Staff("小2",5000000, 2));
        hashMap.put("No3", new Staff("小3", 30, 3));
        
        Set keySet = hashMap.keySet();
        for (Object key : keySet) {
            Staff stf = (Staff) hashMap.get(key);
            if(stf.getSalary() > 18000)
                System.out.println(stf.getSalary());
        }
​
        Set entrySet = hashMap.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry next =  (Map.Entry)iterator.next();
            Staff emp = (Staff)next.getValue();
            System.out.println(emp.getSalary());
        }
```

(2)hashTable

(1)存放 k - v 键值对模式

(2)hashTable 的 key 和 value 都不能为 null,否则抛出异常 NullPointException

(3)hashTable 使用方法与 hashMap 基本一致

(4)hashTable 是线程安全的

(3)TreeMap

子类:Properties

image-20220710122948925.png

  1. 集合总结

    (1)先判断存储的类型:单列 or 双列

    (2)单列:Collection 接口

    允许重复:List

    增删多:LinkedList [ 底层维护了一个双向链表 ]

    改查多:ArrayList [ 底层维护 Object 类型的可变数组 ]

    不允许重复:Set

    无序:HashSet [ 底层是 HashMap,维护了一个哈希表,即(数组+链表+红黑树) ]

    排序:TreeSet

    插入和取出顺序一致:LinkedHashSet,维护 数组 + 双向链表

    (3)键值对:Map

    键无序:HashMap [ 底层是:哈希表 jdk7:数组 + 链表, jdk8:数组+链表+红黑树 ]

    键排序:TreeMap

    键插入和取出顺序一样:LinkedHashMap

    读取文件:Properties

  2. Collections 工具类

    reverse(list):反转 List 中的元素
    sort(list):升序排序
    swap(list, int i, int j):将 i 和 j 交换位置
    shuffle(list):随机排序
    sort(list, Comparator):根据指定的规则进行排序
    Object max(Collection) :返回集合中最大元素
    Object max(Collection , Comparator):根据 Comparator 指定顺序,返回最大元素
    Object min(Collection)
    Object max(Collection , Comparator)
    int frequency(Collection, Object):返回指定集合中指定元素的出现次数
    void copy(list dest, list src):将 src 中的内容复制到 dest 中
    boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替换掉 list 中的旧值
    List arrayList = new ArrayList();
    arrayList.add("12312");
    arrayList.add("41");
    arrayList.add("414");
    ​
    Collections.sort(arrayList, new Comparator() {   // [41, 414, 12312] ,按照字符长度排序
    @Override
    public int compare(Object o1, Object o2) {
    return ((String)o1).length() - ((String)o2).length();
    }
    });