Java集合

集合框架的体系结构

  1.Collection接口 (存储类的对象)  的三个子接口:

    1)List 列表(有序的、可重复的)

      - 可以精确控制元素的插入位置、或者删除某个位置的元素

      - 实现类:ArrayList(可以看成长度动态增长的数组)、LinkedList (链表)

    2)Queue 队列(有序的、可重复的)

      - 实现类:LinkedList

    3)Set 集(无序的、不可重复的)

      - 实现类:HashSet

  2.Map接口 (以键值对的方式存储信息)

    - 实现类:HashMap(哈希表)

Collection接口

    boolean add();将定义好的对象添加到集合

  void clear();移除集合当中的所有元素

  boolean contains(Object o);判断集合中是否包含参数对象

  boolean equals();

  int hashCode();

  boolean isEmpty();判断集合是否为空

  Iterator<E> iterator();迭代器方法进行集合遍历

  boolean remove();移除集合中某个元素

  int size();返回集合长度

  Object[ ] toArray();将集合转换为数组

 

List 列表(有序的、可重复的)

  - 可以精确控制元素的插入位置、或者删除某个位置的元素

  - 实现类:ArrayList(可以看成长度动态增长的数组)、LinkedList (链表)

  

  E get(int index);返回列表中指定位置的元素

  int indexOf(Object o); 返回某个对象在列表中的位置

  default void sort(Comparator<? super E> c);排序

案例1:在List中存储并操作字符串信息

复制代码
public static void main(String[] args) {
        List list=new ArrayList();
        list.add("Java");
        list.add("C");
        list.add("C++");
        list.add("Go");
        list.add("swift");

        System.out.println("列表中元素的个数为:"+list.size());
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i)+",");
        }
        System.out.println();

        //移除列表中的C++
        list.remove("C++");

        System.out.println("列表中元素的个数为:"+list.size());
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i)+",");
        }
        System.out.println();
        //判断列表中是否存在C
        System.out.println("判断列表中是否存在C的结果是:");
        System.out.println(list.contains("C"));
    }
复制代码

 

ArrayList实现类

  

  - ArrayList底层是由数组实现的

  - 动态增长,以满足应用程序的需求

  - 在列表尾部插入或删除数据非常有效

  - 更适合查找和更新元素

  - ArrayList中的元素可以为null

 

  构造方法:

    ArrayList();初始化容量为10

    ArrayList(Collection<? extends E> c);用已存在的集合数据创建一个数组序列

    ArrayList(int initialCapacity);设置初始容量

案例2:用ArrayList实现公告管理

复制代码
public static void main(String[] args) {
        //创建Notice类的对象,生成三条公告
        Notice n1=new Notice(1,"欢迎来到慕课网","admin",new Date());
        Notice n2=new Notice(2,"请同学们按时添加作业","teacher",new Date());
        Notice n3=new Notice(3,"考勤通知!","teacher",new Date());

        //添加公告
        ArrayList noticeList=new ArrayList();
        noticeList.add(n1);
        noticeList.add(n2);
        noticeList.add(n3);

        //显示公告
        System.out.println("公告信息为:");
        for(int i=0;i<noticeList.size();i++){
            System.out.println(i+1+((Notice)noticeList.get(i)).getTitle());
        }

        //在第一条公告后面添加一天新公告
        Notice n4=new Notice(4,"在线编辑器可以使用了","admin",new Date());
        noticeList.add(1,n4);

        System.out.println("----------------------------------");
        System.out.println("插入后的公告信息为:");
        for(int i=0;i<noticeList.size();i++){
            System.out.println( i+1 + ( (Notice) noticeList.get(i) ).getTitle());
        }

        //删除第三天公告
        noticeList.remove(2);
        System.out.println("----------------------------------");
        System.out.println("删除后的公告信息为:");
        for(int i=0;i<noticeList.size();i++){
            System.out.println(i+1+((Notice)noticeList.get(i)).getTitle());
        }

        //修改第二条公告
        n4.setTitle("Java在线编译器可以使用了");
        //如果创建新的对象,需要调用set方法重新设置
//        noticeList.set(1,n4);
        System.out.println("----------------------------------");
        System.out.println("修改后的公告信息为:");
        for(int i=0;i<noticeList.size();i++){
            System.out.println(i+1+((Notice)noticeList.get(i)).getTitle());
        }
    }
复制代码

 

HashSet实现类

  - HashSet是Set的一个重要实现类,称为哈希集

  - HashSet的元素无序且不可重复

  - HashSet只允许一个null元素

  - 具有良好的存取和查找功能

  - 底层是HashMap

 

  构造方法:

    HashSet();默认容量16,加载因子0.75

    HashSet(Collection<? extends E> c);用已存在的集合创建一个哈希集

    HashSet(int initialCapacity);设置初始容量

    HashSet(int initialCapacity,int loadFator);设置初始容量,加载因子

 

Iterator接口(迭代器)

  - 可以以统一的方式对各种集合元素进行遍历

  - hasNext()方法检测集合中是否还有下一个元素

  - next()方法返回集合中的下一个元素

案例3:在集合中插入字符串

复制代码
public static void main(String[] args) {
        //将英文单词添加到HashSet中
        Set set=new HashSet();

        //向集合中添加元素
        set.add("blue");
        set.add("red");
        set.add("black");
        set.add("yellow");
        set.add("white");

        //遍历迭代器显示集合的内容
        System.out.println("集合中的元素:");
        Iterator it=set.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();

        //在集合中插入一个新的单词
        set.add("green");
        set.add("red");//插入重复单词无意义也不会报错
        System.out.println("插入后集合中的元素:");
        it=set.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
    }
复制代码

Set接口中hashCode和equals方法作用

  - hashCode()用于给对象返回hash code值,equals()方法用于判断其他对象是否与该对象相等

  - 由于HashSet中不允许添加重复元素,调用add方法时使用这两个方法判断元素是不同的。

  1.添加数据时,会调用hashCode方法得到hash code的值,通过这个值可以找到数据存储的位置,这个位置可以理解为一片区域,在该区域中存储的数据hash code都是相等的

  2.如果该区域已经有数据了,就继续调用equals()方法判断数据是否相等,如果相等就说明重复了,就不允许添加,如果hash code值不等,就找一个区域进行存储

  3.这些都是基于哈希算法完成的,它使得添加数据的效率得到提升,假设Set集合中100个元素,那么想添加101个元素时如果没有哈希算法,就需要调用equals()方法将第101个元素与前面100个元素依次进行比较,如果元素更多,比较所耗费的时间就越长。

  4.如果两个对象相等,那么他们hash code值一定相等,但是如果两个对象hash code值相等这两个对象不一定相等,就需要equals()方法进行判断。如果不重写hashCode()方法,默认每个对象的hashCode值都不一样,所以HashSet类每个对象都不会相等

案例4:HashSet实现宠物猫信息管理

复制代码
public static void main(String[] args) {
        //定义宠物猫对象
        Cat huahua=new Cat("花花",12,"英国短毛猫");
        Cat fanfan=new Cat("凡凡",3,"中华田园猫");
        //将宠物猫对象放入HashSet
        Set<Cat> set=new HashSet<Cat>();
        set.add(huahua);
        set.add(fanfan);

        //显示宠物猫信息
        Iterator<Cat> it= set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

        //添加一个新宠物猫,重写HashCode()方法和equals()方法后不会生效
        System.out.println("----------------------------------------------");
        Cat huahua01=new Cat("花花",12,"英国短毛猫");
        set.add(huahua01);
        it=set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //查找
        System.out.println("----------------------------------------------");
        //在集合中查找花花的信息并输出
        if(set.contains(huahua)){
            System.out.println("花花找到了");
            System.out.println(huahua);
        }else {
            System.out.println("花花没找到");
        }

        //在集合中使用名字查找花花的信息
        System.out.println("----------------------------------------------");
        System.out.println("按名字查询");
        boolean flag=false;
        Cat c=null;
        it= set.iterator();
        while(it.hasNext()){
            c=it.next();
            if(c.getName().equals("花花")){
                flag=true;
                break;
            }
        }
        if(flag){
            System.out.println("花花找到了");
            System.out.println(c);
        }else{
            System.out.println("花花没找到");
        }

        //删除花花二代的信息
        System.out.println("----------------------------------------------");
        Cat huahua02=new Cat("花花二代",2,"英国短毛猫");
        set.add(huahua02);
        System.out.println("删除前的数据");
        for(Cat cat:set){
            System.out.println(cat);
        }
        System.out.println("删除后的数据");
        Set<Cat> set1=new HashSet<Cat>();
        for(Cat cat:set){
            if("花花".equals(cat.getName())){
//                set.remove(cat);
//                break;
                set1.add(cat);
            }
        }
        set.removeAll(set1);

        for(Cat cat:set){
            System.out.println(cat);
        }

        //删除集合中所有的数据
        System.out.println("----------------------------------------------");
        boolean f=set.removeAll(set);
        if(set.isEmpty()){
            System.out.println("猫都不见了");
        }else {
            System.out.println("猫还在");
        }
    }
复制代码

Map接口 

  - Map中的数据是以键值对(key - value)的形式存在的

  - key - value 以Entry类型的对象实例化存在

  - 可以通过key值快速查找value值

  - 一个映射不能包含重复的键

  

  void clrear();清空集合

  Set<Map. Entry<K,V>> entrySet();获取键值对的所有内容

  V get(Object o);通过key取得对应的value

  Set<K> keySet();取出集合中所有key值

  V put(key,value);将元素添加到集合中

  V remove(Object key);移除Map中的数据

  Collection<V> values();返回所有的value值

HashMap实现类

  - 允许使用null值和null键

  - key值不允许重复

  - HashMap中的Entry对象是无序排列的

  

案例5:HashMap的应用

复制代码
        Map<String,String> animal=new HashMap<String,String>();
        System.out.println("请输入三组单词对应的注释,并存放到HashMap中");
        Scanner console=new Scanner(System.in);
        //添加数据
        int i=0;
        while(i<3){
            System.out.println("请输入key(单词)值:");
            String key=console.next();
            System.out.println("请输入value(注释)值:");
            String value=console.next();
            animal.put(key,value);
            i++;
        }

        //1.打印输出value的值(直接使用迭代器)
        System.out.println("---------------------------------------");
        System.out.println("使用迭代器输出所有的value");
        //迭代器接口可以以统一的方式对各种集合元素进行遍历
        Iterator<String> it=animal.values().iterator();
        while(it.hasNext()){
            System.out.print(it.next()+"  ");
        }
        System.out.println();

        //2.打印输出key和value的值(通过entrySet方法)
        System.out.println("---------------------------------------");
        System.out.println("通过entrySet得到key-value");
        //key-value组成到一起就是一个Entry对象
        //entrySet方法把HashMap中的键值对都放到一个Entry的集合里
        Set<Map.Entry<String,String>> entrySet=animal.entrySet();
        for(Map.Entry<String,String> entry:entrySet){
            System.out.println(entry.getKey()+"-"+entry.getValue());
        }

        //通过单词找到注释并输出
        //使用keySet方法
        System.out.println("---------------------------------------");
        String strSearch=console.next();
        //1.取得keySet
        Set<String> keySet=animal.keySet();
        //2.遍历keySet
        boolean flag=false;
        String k=null;
        for(String key:keySet){
            if(strSearch.equals(key)){
                k=key;
                flag=true;
                break;
            }
        }
        if(flag==true){
            System.out.println("找到了!键值对为:"+k+"-"+animal.get(k));
        }else{
            System.out.println("没找到。。。");
        }
复制代码

 

posted @   南风知君  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示