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;
        }
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

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