美文网首页
2019-02-23

2019-02-23

作者: 爱上树大笨象 | 来源:发表于2019-02-23 13:13 被阅读0次

    集合(Collection / Map) - 一:

    Collection

    Java 集合继承图
    ![Java集合继承图.jpg](https://img.haomeiwen.com/i14215857/12709e2df837f10b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    Collection 继承 → Iterable 有 iterator() 方法
    顾 凡是继承Collection的 都会有 iterator() 方法
    
    iterator():
        1. hasNext()
        2. next()
        3. remove()
    
    Collection(接口)
        1. List(接口)   继承 Collection
            a. ArrayList(实现类) 
            b. LinkedList(实现类)
            c. Vector(实现类)
            
        2. Set(接口)    继承 Collection
            a. HashSet(类)
            b. SortedSet(接口)
                1. TreeSet(实现类)
                
                
    Collection 特点:
        1. 只能存储引用类型, 并且只能单个存储数据(一个一个存)
           存 1, 2, 3 不报错是因为 自动装箱 转成了 包装类
    

    类比数组:

    定义: 
        存放同一类型, 在存储空间中连续的一系列数据
    
    数组寻址公式:
        改数据地址 = 数组首数据地址 + 索引 * 该类型的字节数
        
    为什么数组的索引是从 0 开始的?
        因为如果从 1 开始 或者其他开始, 就会多运算后面的 乘法, 如果是 0 的话
        
    效率高:
        查询
        
    效率低:
        添加删除
        
    
    

    List

    特点:
        1. 有序
        2. 可重复
        3. 单个存储
        4. 存引用类型
            原因: 由于继承了Collection 所以特点也包括 Collection特点
    
    ArrayList
    底层数据结构:
        数组, 顾适合 查询
    特点:
        1. 适合 查询
        2. 不适合 增删
        
        原因: 底层采用数组存储元素的 而数组底层是有规律的顺序的存储的.
            
    
    LinkedList
    底层数据结构:
        双向链表, 顾适合频繁增删, 不适合查询
        
    特点:
        1. 合适 增删
        2. 不适合 查询
    
    Vector
    底层数据结构:
        数组, 也只适合查询
        
    特点:
        1. 适合多线程, 因为是线程安全的
        2. 效率不高
        
    一般情况不会使用集合自带的安全机制, Vector 效率不高, 现在用的比较少
    

    Set

    特点:
        1. 无序
        2. 不可重复
        
    
    HashSet
    底层数据结构:
        哈希散列表
    
    
    SortedSet(接口)
    底层数据结构
        
    特点:
        1. 无序
        2. 不可重复
        3. 排序 → 根据大小
            原因: 
            
    实现类:
        TreeMap
        
        TreeMap特点:
            1. key 就是 一个 TreeSet
    

    Map

    Map(接口):
        1. SortedMap(接口)
        2. HashMap(实现类)
            a. LinkedMap
        3. Hashtable(实现类)          → 线程安全, 效率不高, 用的少
        4. ConcurrentHashMap(实现类)  → 并发编程
    
    特点:
        键值对
    

    HashMap ❈

    特点:
        1. 无序
        2. key 不可重复, 类似于 Set 的不可重复 
    

    Hashtable

    Hashtable 本身用的不多, 但是他的子类 Properties 用的多, 用于配置文件.
    
    Properties 特点:
        1. key 和 value存储
        2. 存储类型只能是 字符串
    

    Hashtable

    特点:
        1. 无序
        2. 不可重复
        3. 排序 → 按照 key 大小排序, 类似于 SortedSet
    

    UML

    继承 → 空心箭头
    实现 → 虚线空心
    

    扩展

    单向链表:
    单向链表:
        每个元素都称作结点 Entry(JDK 1.5) / Node(JDK 1.8)
    
    特点:
        1. 单项链表每个结点字内存中的存储空间没有规律
    
    问题:
        1. 为什么单项链表查询效率低?
        答: 因为单项链表在内存中存储的空间上面是没有规律的, 也没有顺序, 如果我们想要获得到摸个元素, 要从头开始往后遍历, 找到为止
        
        2. 为什么单向链表增删效率高?
        答: 因为单项链表在内存中存储的空间上面没有规律, 删除或者随机增加元素, 只要让指针重新指向即可, 不要将后面元素位移.
    
    双向链表:
        头部内存地址 是上一个元素的内存地址, 尾部的内存地址是下一个元素的内存地址
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    /**
     * description:     集合的基本操作
     *
     * @author Lomonkey
     * @date 2019/2/22
     */
    
    /**
    *   add()               添加元素
    *   clear()             清空集合
    *   contains()          判断元素是否存在
    *   isEmpty()           判断是否为空, 为空 返回 true
    *   iterator()          创建迭代器
    *   remove()            删除元素
    *   retainAll()         交集
    *   size()              集合长度
    *   toArray()           转换成数组
    *
    * */
    public class ConnectionTest1 {
    
        public static void main(String[] args) {
            // 创建一个 集合
            // 父类型引用 指向子类对象 → 多态
            Collection collection = new ArrayList();
    
            // 添加元素 → 只能添加引用类型
            collection.add(123321);
            collection.add("的说法");
            collection.add(true);
    
    
            // 泛型集合
            Collection<String> collection1 = new ArrayList<String>();
            // 只能添加 String 类型
            collection1.add("大家好!");
            collection1.add("你们好!");
            /*
            * 在编译阶段, 对代码进行检查
            * */
    
            // 能直接打印出 → 大家好!
            System.out.println(collection1);
            // collection1 指向的是 ArrayList集合的对象
            // 调用 println() 方法的时候, 把 collection1 的变量值, 即ArrayList的对象的引用
    
            // 判断非空
            System.out.println(collection1.isEmpty());
    
            // 长度
            System.out.println(collection1.size());
    
            // 判断元素是否存在
            System.out.println(collection1.contains("da"));
    
            // 删除元素
            collection1.remove("大家好");
            System.out.println(collection1);
    
            // 转化成数组
            Object[] arr = collection1.toArray();
            for(Object o : arr){
                System.out.print(o);
            }
        }
    }
    
    

    作业:

    java 来模拟单链表
    
    public class Linked{
        // 结点
        Entry entry;
        
        //  构造
        Linked(){
            entry = new Entry(null, null);
        }
        
        // 元素的添加 → add
        
        // 元素的删除 → remove
        
        // 元素的查找 → find
        
        // 元素
        
        
        // 内部类 几点
        static class Entry{
            Object data;
            Entry next;
            
            Entry(Object data, Entry next){
                this.data = data;
                this.next = next;
            }
        }
        
    }
    

    相关文章

      网友评论

          本文标题:2019-02-23

          本文链接:https://www.haomeiwen.com/subject/ewxpyqtx.html