zoukankan      html  css  js  c++  java
  • java oop 单列 双列 集合, 迭代器 的使用和说明

    一、集合(Collection)
        (1)集合的由来?
            我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组
            而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用。
        (2)集合和数组的区别?
            A:长度区别
                数组固定
                集合可变
            B:内容区别
                数组可以是基本类型,也可以是引用类型
                集合只能是引用类型
            C:元素内容
                数组只能存储同一种类型
                集合可以存储不同类型(其实集合一般存储的也是同一种类型)
        (3)集合的继承体系结构?
            由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要
            提供存储和遍历功能的,
            我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
    
            Collection
                |--List
                    |--ArrayList
                    |--Vector
                    |--LinkedList
                |--Set
                    |--HashSet
                    |--TreeSet
            Collection:是集合的顶层接口,它的子体系有重复的,有唯一的(HashSet),有有序的(List)
            ,有无序的(Set)。
    
      (4)Collection的功能概述:
          1:添加功能
                boolean add(Object obj):添加一个元素
                boolean addAll(Collection c):添加一个集合的元素
           2:删除功能
                void clear():移除所有元素
                boolean remove(Object o):移除一个元素
                boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
          3:判断功能
                boolean contains(Object o):判断集合中是否包含指定的元素
                boolean containsAll(Collection c):判断集合中是否包含指定的集合元素
                (是一个还是所有)
                boolean isEmpty():判断集合是否为空
         4:获取功能
    • erator()(迭代器)hasNext next
    //通过迭代器方式遍历 
                Iterator it = c.iterator(); //实际返回的肯定是子类对象,这里是多态,本身Iterator就是一个接口,定义为接口是为了满足不同的数据结构取出元素
                while(it.hasNext())//判断是否有下一个元素,有就获取它,没有就不搭理
                {
                    Student s = (Student)it.next(); //不要多次使用it.next()方法,
                    //因为每次使用都是访问一个对象。定义一次就够啦
                    System.out.println(s);      
                }
           5:长度功能
                int size():元素的个数
                面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有
                length()方法呢?//集合获取元素个数是size
          6:交集功能
                boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,
                返回的boolean又是什么意思呢?
          7:把集合转换为数组
        Object[] toArray()
    
        二、List
            1、List集合特点
                    List是Collection的子接口
            特点:有序(存储顺序和取出顺序一致),可重复。
            2、List的特有功能
                A:添加功能
                    void add(int index,Object element):在指定位置添加元素
                B:获取功能
                    Object get(int index):获取指定位置的元素
                C:列表迭代器
                    ListIterator listIterator():List集合特有的迭代器
                D:删除功能
                    Object remove(int index):根据索引删除元素,返回被删除的元素
                E:修改功能
                    Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
            3、List集合的特有遍历功能
                    A:由size()和get()结合。
                    B:代码演示
                                        //创建集合对象
                    List list = new ArrayList();
    
                    //创建并添加元素
                    list.add("hello");
                    list.add("world");
                    list.add("java");
    
                    //遍历集合
                    Iterator it = list.iterator();
                    while(it.hasNext()) {
                        String s =(String) it.next();
                        System.out.println(s);
                    }
                    System.out.println("----------");
                    for(int x=0; x<list.size(); x++) {
                        String s =(String) list.get(x);
                        System.out.println(s);
                    }
            4、常见数据结构
                        A:栈 先进后出
                        B:队列 先进先出
                        C:数组 查询快,增删慢
                        D:链表 查询慢,增删快
    
            5、List的子类特点(面试题)
                ArrayList
                    底层数据结构是数组,查询快,增删慢。
                    线程不安全,效率高。
                Vector
                            底层数据结构是数组,查询快,增删慢。
                            线程安全,效率低。
                LinkedList
                            底层数据结构是链表,查询慢,增删快。
                            线程不安全,效率高。
            到底使用谁呢?看需求?
                    分析:
                        要安全吗?
                            要:Vector(即使要,也不使用这个)
                            不要:ArrayList或者LinkedList
                                查询多;ArrayList
                                增删多:LinkedList
    
                    什么都不知道,就用ArrayList
    
        三、Set
            1、Set集合的特点
                    无序(存储顺序和取出顺序不一致),
                    唯一(通过hashCode()和equals()方法比较是否唯一)
            2、HashSet集合
                            A:底层数据结构是哈希表(是一个元素为链表的数组)
                            B:哈希表底层依赖两个方法:hashCode()和equals()
                              执行顺序:
                                首先比较哈希值是否相同
                                    相同:继续执行equals()方法
                                        返回true:元素重复了,不添加
                                        返回false:直接把元素添加到集合
                                    不同:就直接把元素添加到集合
                            C:如何保证元素唯一性的呢?
                                由hashCode()和equals()保证的
                            D:开发的时候,代码非常的简单,自动生成即可。
                    Alt+Shift +c  构造方法,   Alt+Shift + o 参数传递,  
                    Alt+Shift SetXxx+GetXxx,Alt+Shift +h 保证元素唯一性
                            E:HashSet存储字符串并遍历
                            F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
            3、TreeSet集合
                    A:底层数据结构是红黑树(是一个自平衡的二叉树)
                    B:保证元素的排序方式
                        a:自然排序(元素具备比较性)
                            让元素所属的类实现Comparable接口 compareTo()方法
                        b:比较器排序(集合具备比较性)
                    让集合构造方法接收Comparator的实现类对象 compare()方法 匿名内部类实现
        四、Collection集合的使用
                    唯一吗?
                是:Set
                    排序吗?
                        是:TreeSet
                        否:HashSet
                如果你知道是Set,但是不知道是哪个Set,就用HashSet。
    
                否:List
                    要安全吗?
                        是:Vector
                        否:ArrayList或者LinkedList
                            查询多:ArrayList
                            增删多:LinkedList
                如果你知道是List,但是不知道是哪个List,就用ArrayList。
    
            如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
            如果你知道用集合,就用ArrayList。
    
        五、Collections操作集合工具类
            Collection和Collections的区别(面试题)
                A:Collection 是单列集合的顶层接口,有两个子接口List和Set ,
                  map是双列集合很多用于集合嵌套
                B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
            Collections工具类方法
                        常见的几个小方法:
                A:public static <T> void sort(List<T> list)
                B:public static <T> int binarySearch(List<?> list,T key)
                C:public static <T> T max(Collection<?> coll)
                D:public static void reverse(List<?> list)
                E:public static void shuffle(List<?> list)
        六、Map键值对集合
            1、Map集合的特点
                将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 
    
            2、Map和Collection区别
                Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:
                夫妻对,属于双列集合
                Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是
                可重复的。可以把这个理解为:光棍(11.11) 属于单列集合
    
            3、Hashtable和HashMap的区别
                    Hashtable是基于陈旧的Dictionary类
                    HashMap是Java 1.2引进的Map接口的一个实现
    
                    Hashtable:线程安全,效率低。不允许null键和null值
                      HashMap:线程不安全,效率高。允许null键和null值
            4、Map接口功能概述
                Map集合的功能概述:
                     1:添加功能
                        V put(K key,V value):添加元素。
                            如果键是第一次存储,就直接存储元素,返回null
                            如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
                     2:删除功能
                        void clear():移除所有的键值对元素
                        V remove(Object key):根据键删除键值对元素,并把值返回
                     3:判断功能
                            boolean containsKey(Object key):判断集合是否包含指定的键
                            boolean containsValue(Object value):判断集合是否包含指定的值
                            boolean isEmpty():判断集合是否为空
                     4:获取功能
                            Set<Map.Entry<K,V>> entrySet():???
                            V get(Object key):根据键获取值
                            Set<K> keySet():获取集合中所有键的集合
                            Collection<V> values():获取集合中所有值的集合
                     5:长度功能
                            int size():返回集合中的键值对的对数
            5、Map集合的遍历
            方式A:键找值
                    a:获取所有键的集合
                    b:遍历键的集合,得到每一个键
                    c:根据键到集合中去找值
    
                代码体现:
                Map<String,String> hm = new HashMap<String,String>();
    
                            hm.put("it002","hello");
                            hm.put("it003","world");
                            hm.put("it001","java");
    
                            //方式1 键找值
                            Set<String> set = hm.keySet();
                            for(String key : set) {
                                String value = hm.get(key);
                                System.out.println(key+"---"+value);

            方式B:键值对对象找键和值
                        a:获取所有的键值对对象的集合
                        b:遍历键值对对象的集合,获取每一个键值对对象
                        c:根据键值对对象去获取键和值
    
                //方式2 键值对对象找键和值
                Set<Map.Entry<String,String>> set2 = hm.entrySet();
                            for(Map.Entry<String,String> me : set2) {
                                String key = me.getKey();
                                String value = me.getValue();
    java集合中如何去除重复的元素呢?
    
            当我们定义了ArrayList集合存入一些元素后,发现元素有重复的,
            我们可以使用三种基本方法来去除重复的元素;
    
            第一种方法:
                创建一个新集合,遍历旧集合中的元素,使用Contains方法 看看新集合中
                是否包含此旧集合中的元素,不包含就添加至新集合中
                ps.详情看下面的ArrayListDemo2
            第二种方法:
                我们可以使用HashSet集合剔除ArrayList集合中的重复值,但是有个缺点,
                虽然能保证元素的唯一性,但是
                存储顺序和取出顺序不一致,这时我们可以LinkedHashSet
    
            第三种方法:
                我们知道LinkedHashSet集合,底层数据结构由哈希表和链表组成,哈希表保证元素的唯一性
                链表保证元素有序(存储和取出一致)
  • 相关阅读:
    深入浅出JMS(二)--ActiveMQ简单介绍以及安装
    redis学习
    浏览器的渲染过程
    http请求
    常用正则表达式
    js继承的几种实现方式
    js中的浅拷贝和深拷贝
    webpack常用的plugin
    linux基本命令
    webpack压缩代码组件uglifyjs-webpack-plugin
  • 原文地址:https://www.cnblogs.com/SFHa/p/9035210.html
Copyright © 2011-2022 走看看