2019-02-23

集合(Collection / Map) - 一:

Collection

Java 集合继承图
![Java集合继承图.jpg](https://upload-images.jianshu.io/upload_images/14215857-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;
        }
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,976评论 0 13
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,447评论 1 14
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 764评论 0 1
  • ArrayList实现原理要点概括 参考文献:http://zhangshixi.iteye.com/blog/6...
    晨光光阅读 1,097评论 0 1
  • 在编程中,常常需要集中存放多个数据。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于...
    一一一二二三阅读 426评论 0 1