简述Java集合框架

Java集合框架

一,集合框架
集合框架是一个用来代表和操纵集合的统一架构。
1,为什么要使用集合框架?
当使用数组保存所有学员的姓名、年龄、地址信息时,
数组无法修改长度,一旦定义了数组,那么它是定长的, 如果新增了一位学员,无疑需要重新定义数组
数组虽然检索元素飞快,但是如果进行元素增加、删除时 效率低下,增加或删除一个元素可能会引起其他元素的变动。
数组对保存具有映射关系的数据无能为力,例如我们需要 记录“姓名:张三”、“年龄:18”等等具有映射关系的数据。
2,Java集合框架图
在这里插入图片描述
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Map,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
3,Set,List,Set的存储示意图如下:
在这里插入图片描述
4,集合类的主要方法:
◦ 添加、删除操作,例如add、addAll、remove、 removeAll等
◦ 查询操作,例如size、isEmpty、contains、iterator等
◦ 集合操作,例如containsAll、addAll、clear、 removeAll、 retainAll等等
◦ 转型操作,例如toArray
二,Set
Set是无序的,所以我们平常用Set的时候比较少,基本用List代替,但特殊情况下也能用到Set。
HashSet实现了Set接口
代码展示:

package frame;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test01 {
    public static void main(String[] args) {
       Set set = new HashSet();  //实例化set集合,使用它的现实类
      //往集合里面添加数据
       set.add("一");
       set.add("二");
       set.add("三");
       set.add("四");
       set.add("五");
       set.add("六");
       set.add("七");
        System.out.println("长度是:"+set.size());   //求set的长度
        set.remove("四");    //移除集合里的元素“四”
        //把集合里面的数据循环迭代出来
        Iterator it = set.iterator();
        while (it.hasNext()){           //迭代器里如果有数据,true
            System.out.println(it.next());
        }
    }
}

运行结果:
在这里插入图片描述
三,ArrayList类
1,ArrayList类是List接口的大小可变数组的实现(继承 AbstractList同时实现List接口),实现了所有可选列 表操作,并允许包括null在内的所有元素。除了实现 List接口外,此类还提供一些方法操作内部用来存储 列表的数组的大小。特点如下:
◦ 大小是可变的,是自动增长的。可以动态的增加或减少元 素。
◦ 实现了IColletion和IList接口。
◦ 它是非同步的集合类。
◦ 元素可以重复
2,Iterator叫做“迭代器”,它提供一种方法访问一个 容器(container)对象中各个元素,而又不需暴露 该对象的内部细节 由于Collection接口继承了Iterator,所以所有集合 对象都可以被迭代, Collection接口内定义了 iterator()方法,能获得一个Iterator迭代器,从而实 现对集合的迭代
对于List集合来说,通过listIterator()方法可以获得 一个功能更为强大的列表迭代器ListIterator, ListIterator扩展了Iterator,它不仅能正向遍历,还能反向遍历
在某些情况下(例如用户自己实现的数据结构),可 能还需要用户自己动手,丰衣足食,来创建一个 Iterator,当然,这也很简单,只需要实现Iterator接 口,将里面的hasNext()、next()、remove()方法实 现即可(remove()可选)。
代码展示:

package frame;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test02 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("一");
        list.add("二");
        list.add("三");
        list.add("四");
        list.add("五");
        list.add("六");
        list.add("七");
        list.add(list);       //把list以集合的形式添加到list中,相当于一个元素
        list.addAll(list);    //把list集合里的元素添加到list中
        System.out.println(list.get(4));            //输出下标对应的元素的值
        System.out.println("长度是:"+list.size());  //求list的长度
        System.out.println(list.contains("四"));    //list中是否有“四”这个元素,有返回true,无返回false
        System.out.println(list.isEmpty());         //list是否为空
        System.out.println(list.lastIndexOf("五")); //从后往前,输出第一个“五”对应的下标

//        list.clear();   //清除list中的元素

        Iterator it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

运行结果:
在这里插入图片描述
四,LinkedList类
1,LinkedList类用于创建链表数据结构对象。它继承 AbstractSequentialList类并实现了List、Queue接 口。,2,跟ArrayList一样,LinkedList也是实现了List接口, 这说明可以根据索引来查询集合内的元素。不过, LinkedList和ArrayList的区别也很明显,由于 LinkedList是实现了双向循环链表,所以元素可以很 快捷的被插入或删除,但是,由于链表的特性,如果 对LinkedList做查询,那么效率也非常低。
3,相对与ArrayList来说,基于链表对增加、删除元素 的便捷性,LinkedList提供了addFirst、addLast、 removeFirst、removeLast等方法。
4,ArrayList和LinkedList的对比
通过对比ArrayList和LinkedList,不难发现,其实不管 是ArrayList也好,LinkedList也罢,它们的本质区别不 在于几个方法的存在与否,对于ArrayList来说,由于遍 历的便捷,提供了indexOf()方法,对于LinkedList来说, 由于增删的便捷,提供了诸如addFirst()、addLast()、 removeFirst()、removeLast()等方法。
但总体来看,它们的功能是一致的,无非是对数据元素的 增删改查、获得子集合、访问属性等等。所以看问题要看 本质,它们的区别在于实现的数据结构不同,ArrayList 实现了可变数组,而LinkedList实现了链表,这将导致它 们适合于不同的场合,如果某系统查询很多而数据变动很 少,最好使用ArrayList而不是LinkedList,如果系统数 据经常做增加删除的操作,则应当选择LinkedList。
五,HashMap和LinkedHashMap
1,HashMap是基于哈希表的 Map 接口的实现(继承 AbstractMap、实现Map接口),是实现描述键值对 (key-value)关联性的类,可以通过key查找对应 的value,一个key-value可称为一个映射。
2,在集合中,key是唯一的,而且可以为空对象
3,Map接口与Collection 接口没有任何关系, HashMap中没有add( )方法。对键值插入用的是 put(key,value)方法,读取时用get(int key)。使用 KeySet() 可以获得类型是Set 的键视图,使用 values( )可以获得类型为Collection的值视图,通过 entrySet()可以获得所有映射关系的Collection视图, 对于视图读取可以用 Iterator 迭代器进行迭代。
代码展示:

package frame;

import java.util.*;

public class Test03 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("1","赵");
        map.put("2","钱");
        map.put("3","孙");
        map.put("4","李");
        map.put("5","周");
        map.put("6","吴");
        map.put("7","郑");
        map.put("8","王");


        System.out.println(map.keySet());   //输出键值key
        System.out.println(map.values());   //输出值values
        System.out.println(map.entrySet()); //输出键值(key=values)

        Set s = map.keySet();
        Iterator it = s.iterator();
        while (it.hasNext()){               //对键值进行迭代输出,同理也可以对值和键值进行循环迭代
            System.out.println(it.next());
        }
    }
}

运行结果:
在这里插入图片描述
六,Arrays类
Arrays类能实现对数组的排序、搜索等操作,注意它 和Collections的区别,Arrays针对数组,可以是基 本数据类型的数组,也可以是对象数组,而 Collections针对集合。Arrays类提供的方法也均为静态方法
Arrays.asList()同Collection.toArray() 一起,充当 了基于数组的 API 与基于 collection 的 API 之间的桥梁
代码展示:

package frame;

import java.util.Arrays;
import java.util.List;

public class Test04 {
    public static void main(String[] args) {
        String[] str = new String[6];
        for (int i = 0; i < str.length; i++) {
            str[i]="你好"+(i+1);
        }
        Arrays.sort(str);   //对数组的指定范围按数字升序进行排序
        List list = Arrays.asList(str);   //将数组转换成集合
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

运行结果:
在这里插入图片描述
总结:
集合框架(JCF)的根接口为Collection,有Set、List 等子接口,所有集合类均具有一些共同的方法,它们 的主要区别在于实现的数据结构不同
Map接口用于存储映射关系,其实现类有HashMap 和TreeMap等 Iterator迭代器能不暴露内部细节的情况下访问集合元素
Collections类对集合框架提供了支持
Arrays类提供了对数组的操作支持,同时提供了数组 到集合的转化方法asList( )

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值