zoukankan      html  css  js  c++  java
  • Java基础知识二次学习--第七章 容器

    第七章 容器
     
    时间:2017年4月27日15:08:30
    章节:07章01节~07章04节
    视频长度:20:21 +12:38 +3:55 +2:57
    内容:容器API
    心得:
    Java API 所提供的一系列类的实例,用于在程序中存放对象
    JDK所提供的容器API 位于java.util包内 结构如下图
     

     

     
    一个关于new 集合的问题
    Collection c =new ArrayList();
    这是父类指向子类对象 不能访问arraylist里面所独有的
    好处是 如果以后如果要变更数据结构 可以直接做变更 因为这种情况下涉及到的方法都是公共的
     
    这对于以后讲解控制反转以及一些设计模式 非常有用
    //可以放入不同的类型 的对象

     

    不能放基本数据类型 因为基本数据类型是存储在栈上面的 而栈中的内容随时可能被清空
     
        /**
         * Returns a string representation of this collection.  The string
         * representation consists of a list of the collection's elements in the
         * order they are returned by its iterator, enclosed in square brackets
         * (<tt>"[]"</tt>).  Adjacent elements are separated by the characters
         * <tt>", "</tt> (comma and space).  Elements are converted to strings as
         * by {@link String#valueOf(Object)}.
         *
         * @return a string representation of this collection
         */
       
    public String toString() {
            Iterator<E> it = iterator();
            if (! it.hasNext())
                return "[]";
     
            StringBuilder sb = new StringBuilder();
            sb.append('[');
            for (;;) {
                E e = it.next();
                sb.append(e == this ? "(this Collection)" : e);
                if (! it.hasNext())
                    return sb.append(']').toString();
                sb.append(',').append(' ');
            }
        }
     
    容器类对象在调用remove , contains 等方法时需要比较对象是否相等,这会涉及到对象类型的 equals 方法和hasCode方法;对于自定义的类型,需药要重写equals 和hasCode 方法以实现自定义的对象相等规则
     
    当某个对象被当做键-值 索引的值的时候 使用hascode方法
     
    时间:2017年4月27日15:08:30~2017年4月27日15:33:30
    章节:07章05节
    视频长度:28:30
    内容:Iterator
     

     

    由于jdk1.5之后引入了forEach 以及1.8之后引入了Lambda
    迭代器在实际情况中 运用的已经很少了
    所以这里只给一张基本方法图 和定义
     
     
    时间:2017年4月27日15:33:55~2017年4月27日15:43:14
    章节:07章06节
    视频长度:09:14
    内容:EnhancedFor and Set
    心得:
     
    int[] arr ={1,2,3,4}
    for(int i : arr){
    }
    Collection c = new ArrayList();
    for(Object o : c){
    System.out.println(o)
    }
    但是也有缺点

     

     
    Set接口

     

    实现set的容器类的元素是没有顺序的,并且不可以重复
    set就是数学意义上的集合
    JDK中所提供的SET容器类有 HashSet , TreeSet
    a.retainAll(b) 求交集
    a.addAll(b) 将b集合添加到a集合里 重复的不会添加
     
    时间:2017年4月27日15:50:11~2017年4月27日15:57:52
    章节:07章07节
    视频长度:12:28
    内容:List and Collections
    心得:

     

    set返回值是该位置上原来的元素
     
    ArrayList 底层是数组实现的
    LinkedList 底层是链表结构实现的

    ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下: 
    1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。


    2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。


    3.LinkedList不支持高效的随机元素访问。


    4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间


    可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
     
    引用一个回答:
    主要是数据的组织方式不一样。
    arraylist中的数据在内存中是连续的,成块的,查找的时候直接顺序遍历内存就可以了。插入删除的时候,就要把修改的那个节点之后的所有数据都向后移动,或者向前移动。所以就慢了。
    而linkedlist在内存中是以链表形式组织的,链表这个玩意说来话太长了。链表中的数据在内存中是松散的,每一个节点都有一个指针指向下一个节点,这样查找起来就比较慢了。而插入删除的时候就是断开一个节点,然后插入删除之后再接起来。具体也不难。自己看书吧。
     
    List 常用算法
    java.util.Collections 提供了一些静态方法实现了基于list容器的一些常用算法
    注意:Collection是一个接口 Collections是类
    注意查看api
    void sort 对List容器内的元素排序
    void shuffle 对List容器内的对象进行随机排列
    ovid reverse 对List容器内的对象进行逆序排列
    copy(List dest,List src)
    将src List容器内容拷贝到dest List容器
    int binarySearch
     
    时间:2017年4月27日16:03:12~2017年4月27日16:18:07
    章节:07章08节
    视频长度:18:00
    内容:如何选择数据结构与Map
    心得:
    array读快改慢 linked改快读慢 hash两者之间
    hashTable与vector也是数据结构 不过内部是锁定的 
    所以不论读或者改 都很慢 ,已经逐渐被淘汰
     
    MAP接口
    实现Map接口的类来存储 键-值 对
    Map 接口的实现类有HahMap和TreeMap实现的
    hashMap用哈希表实现的 treeMap使用二叉树中的红黑树实现的
    Map类存储的键-值对通过键来表示,所以键值不能重复(equals,所以重写了equals的类必须要重写Hashcode
    因为直接equals比较的太慢了 所以要比较hashCode)(这里查看我转发的为什么重写equals一定要重写hashcode方法)
     

     

    put的返回值依旧是原来的key-对应的value值(如果有的话)
     
    一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
    TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
    LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
     
    时间:2017年4月27日16:20:05~2017年4月27日16:22:19
    章节:07章10节
    视频长度:7:00
    内容:自动打包,解包(自动装箱拆箱)
    心得:
    在合适的实际自动打包,解包
    jdk 1.5之后就支持了自动拆装箱
    1.打包:自动将基础数据类型转换为对象
    2.解包:自动将对象转换为基础数据类型
     
    时间:2017年4月27日16:22:23~2017年4月27日16:26:01
    章节:07章11节 07章12节 
    视频长度:7:29 +3:12
    内容:简单的例子
    心得:
    略过
     
    时间:2017年4月27日16:26:03
    章节:07章13节
    视频长度:8:29
    内容:泛型
    心得:
    没有泛型的时候 装入集合 都被当成object 然后拿出来的时候转型 
    效率低 还容易出问题 
    并且这种问题是运行时的问题 很难处理 
    根本原因是:失去了类的根本类型
  • 相关阅读:
    netty的基本使用
    netty 实现简单的rpc调用
    NIO 的基本使用
    BIO实现 Socket 通信
    springboot使用ElasticSearch
    docker-compose安装rabbitmq集群(主从集群---》镜像集群)
    杂谈:面向微服务的体系结构评审中需要问的三个问题
    使用Spring Boot和RxJava的构建响应式REST API
    JVM体系结构详解
    如何成为更好的程序员?
  • 原文地址:https://www.cnblogs.com/invoker-/p/6795217.html
Copyright © 2011-2022 走看看