Java(集合框架)

(一)Java集合框架(任何集合框架包括三部分内容:对外的接口、接口的实现和对集合运算的算法

      1、Java集合类:集合是一种工具类,就像是容器(容器类),用于存储任意数量的具有共同属性的对象。如果是类型相同

但是作用和意义不同的属性不能放到同一个集合中(姓名,性别都是字符串类型但是意义不同)。Java中提供了有关集合的类库

称为CollectionAPI(Collection API中的接口和类主要唯一 java.util 包中

      2、集合作用:类内部对数据进行组织,简单有效搜索大数量的条目;有的集合接口,提供一系列排列有序的元素,并且可

以在序列中快速插入或删除有关元素;提供映射关系,可以通过关键字key(任意类型)快速查找到到对应的唯一对象

     3、集合&数组

             数组长度类型固定只能通过下标访问元素,集合长度可变并可通过任意类型查找所映射的具体对象

    4、JAVA集合框架体系结构Collection与Map是两个根接口

             从集合框架图中可以看出,分为两类:以Collection为接口的元素集合类型,以Map为接口的映射集合类型

                                              


(二)Collection接口及其子接口

          Collection接口(CollectionAPI 最基本的接口)是将一组对象以集合元素的形式组织到一起,在其子接口中分别实现不同

的组织方式(List 和Set 接口是 Collection 接口派生的两个子接口)

          Collection接口(类集接口)List、Set和Queue接口的父接口,并且同时可以操作这三个接口,三个接口分别为:

                   (1)List(列表接口)保持元素的特定的顺序,且允许有重复元素

                   (2)Set(数据集接口):不记录元素的保存顺序,且不允许有重复元素(不常用)

                   (3)Queue(队列):提供的队列实现,类似于List

           Set 接口的重用实现类有HashSet(哈希集),List接口的重要实现类有ArrayList、LinkedList 和 Vector向量类,以实

现类似动态数组的功能(被ArrayList代替)),它们的关系如下图所示。

 

                            

            (1)单元素添加、删除操作: 

                     boolean add(Object o):将对象添加给集合 

                     boolean remove(Object o):如果集合中有与o相匹配的对象,则删除对象o 

            (2)查询操作: 

                    int size() :返回当前集合中元素的数量 

                    boolean isEmpty() :判断集合中是否有任何元素 

                    boolean contains(Object o) :查找集合中是否含有对象o 

                    Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素 

            (3)组操作 :作用于元素组或整个集合 

                    boolean containsAll(Collection c):查找集合中是否含有集合c 中所有元素 

                    boolean addAll(Collection c) : 将集合 c 中所有元素添加给该集合 

                    void clear():删除集合中所有元素 

                    void removeAll(Collection c) :从集合中删除集合 c 中的所有元素 

                    void retainAll(Collection c) : 从集合中删除集合 c 中不包含的元素 

            (4)Collection转换为Object数组 : 

                    Object[] toArray() :返回一个内含集合所有元素的array 

                    Object[] toArray(Object[] a) :返回一个内含集合所有元素的array。运行期返回的array和参数a的型别相同,需要转

换为正确型别。

                  for (Iterator it = friendlist.iterator(); it.hasNext(); ) {
                                  String str = (String) it.next();
                                  if (str.equals(datas.get(p).getUserId())) {
                                       it.remove();
                                  }
                   }

【List接口】(有序且可重复) 

           在集合框架中有两种常规的 List 接口实现类:ArrayList (数组)和 LinkedList(链表),使用两种 List 中的哪一种取决

于特定的需要( LinkedList内部封装的是双向链表的数据结构, 不同的数据有不同的数据结构,不同的数据结果操作起来性能不

一样,链表数据结构,做插入、删除的效率高(可基于 LinkedList实现栈和队列),但查询效率低,而数组结构(ArrayList),

做查询时效率高,但插入和删除效率低(做移位操作)

 

【Set接口】(无序不可重复) 

           Set集合不允许重复元素,是因为 Set 判断两个对象相同不是使用 == 运算符,而是根据equals方法,即两个对象用equals

方法比较返回true(则不能添加到Set集合中

           1、HashSet 实现类底层是哈希表,不能确保元素顺序

                 HashSet 的特点:

                  (1)HashSet不是同步的,多个线程访问是需要通过代码保证同步

                  (2)集合元素值可以使 null(最多只能有一个)

             2、TreeSet 实现类

        public class TreeSetDemo1 {

              public static void main(String[] args) {

                       TreeSet<Person> pset = new TreeSet<Person>();

                       pset.add(new Person("zhangsan", 28));

                       pset.add(new Person("lisi", 18));

                       pset.add(new Person("wangwu", 25));

                       pset.add(new Person("zhaoliu", 14));

                      //System.out.println(pset);

                        // 打印出来

                      Iterator<Person> it = pset.iterator();//通过迭代器进行迭代

                      while (it.hasNext()) {//判断是否有数据

                                Person p = it.next();//取出的是Person类型

                                System.out.println(p.getName()+"--"+p.getAge());

                     }

               }

         }

 

(三)Map接口及其子接口

         Map用于保存具有映射关系的数据(key-vlaue),是一个存储键/值对的对象(键必须是唯一的,值是可以重复的)(存放

具有键值对格式数据的容器)

        支持映射的接口有:Map(映射唯一关键字给值)、Map.Entry(内部类(接口),描述映射中的元素)和SortedMap(扩

展Map以便关键字按升序保持)

        Map中包括一个Entry内部类(封装了一个键值对(key-value对))

    1、HashMap和Hashtable实现类

              HashMap和Hashtable都是Map接口的实现类,Hashtable是一个古老的Map实现(JDK1.0),Hashtable是一个线程安

全的Map实现,但HashMap(JDK1.2)是线程不安全的实现,但HashMap比Hashtable的性能高些

               HashMap重写了toString()方法方法总是返回如下格式的字符串:{key1 = value1,key2 = value2..}

               HashMap底层其实是个16长度的数组(HashMap内部的结构是数组链表结构(单向链表,在Java 8中,如果hash相同

的key的数量大于8,会使用平衡树(红黑树)代替链表

 

                                  

 

     2、实现流程

                   

              (1)HashMap 会调用默认构造方法会产生一个长度为16的Entry数组

              (2) 首先调用key的hashCode方法得来的一个整数(哈希码),然后把哈希码作为参数传递到hash(哈希函数)中来

进行运算(散列运算),得到一个整数(散列值) ,int hash=hash(key.hashCode());      

              (3)把散列值和数组的长度来进行计算,最终得到存放到数组的位置(下标),  int i=indexFor(hash,table.length);

         PS:

               key一样(同一个对象,覆盖)

               散列值一样(key不一样),移到后面(已创建一个Entry对象)   //哈希函数能减小冲突

实现过程如下:

               HashMap实现原理及源码分析https://www.cnblogs.com/chengxiao/p/6059914.html

 

(四)Java 集合总结

   1、将接口的引用指向实现类的对象        

              类 ArrayList 实现接口 List 则生成ArrayList对象时可用:List list=new ArrayList(); 也就是说所有实现了接口List的类,都

可以用List接口来声明对象类型,然后用实体类进行实例化(表明了接口可以用来作为类型的表述,当然生成的对象list只能调用

接口List中提供的方法)这样的用法可以大大提高编程的灵活性(两个字:多态。好处:便于程序的二次开发与维护)

              ArrayList<String> nList = new ArrayList<String>();    // 采用接口List引用对象,将接口的引用指向实现类的对象

                      nList.add("chenghao");       // 通过泛型限定了容器中对象的类型

              List<String> nList = new ArrayList<String>();    

   2、四种遍历集合的方法Iterator接口和foreach循环         

      (1) 普通方式(for 循环)

      (2) Iterator接口(使用迭代器来进行统一的遍历

               Iterator 接口是Java集合框架的成员,主要用于遍历(即迭代访问)Collection集合中的每个元素,并安全的从、

Collection 中除去适当的元素,也称为迭代器(Collection 接口的iterator()方法返回一个 Iterator) 

                  boolean hasNext():判断集合里是否存在另一个可访问的元素 

                  Object next():返回集合里下一个元素(如果到达集合结尾则抛出NoSuchElementException异常) 

                  void remove():删除集合里上次访问返回的元素(本方法必须紧跟在一个元素的访问后执行,如果上次访问后

合已被修改,方法将抛出IllegalStateException)

        (3)使用foreach循环遍历集合元素

               (1)格式:

                        for(元素类型 t 元素变量 x : 遍历对象A) {

                                   // 程序块

                        }

              (2)说明:

                             a.  foreach简化了对数组和集合的遍历,如果不希望遍历整个集合,或者在循环内部需要操作下标值就需要使

用传统的for循环

                             b.  简化了编程,提高了代码的可读性和安全性(不用怕数组越界)

                             c.   foreach一般结合泛型使用

                  System.out.println("使用迭代器来进行统一的遍历:");

                  Iterator<String> it = nList.iterator();// 返回迭代器接口的一个实现类对象

                  while (it.hasNext()) {

                    String name = it.next();// 取出,返回对象

                    System.out.println(name);

                  }

                 System.out.println("使用增强的for循环遍历");

                 for (String name : nList) {

                    System.out.println(name);

                 }

     

        (4)使用Lambda表达式遍历集合(forEach方法)

                Set<String> books = new HashSet<String>();
                books.add("轻量级Java EE企业应用实战");
                books.add("疯狂Java 讲义");
                books.add("疯狂Android 讲义");

                books.forEach(obj -> System.out.println("迭代集合元素:" + obj));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值