集合框架和泛型

集合框架

  • 一组接口的集合
  • java.util

集合框架体系

Collection接口:

  • 存储一组不唯一、无序的对象

List接口:

  • 存储==不唯一(值可重复),有序(插入顺序)==的对象

Set接口:

  • 存储一组唯一(值不能重复)、无序的对象

Map接口:

  • 存储一组=键值=对象,提供key到value的映像(键:key 值:value

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhVyRkCC-1618389510192)(F:\电脑文件\学习笔记\1.基础部分\高级特性\wps1.jpg)]

Collection

方法名说明
clear()把集合里的所有元素清空
isEmpty()判断一个集合是否为空
Iterator()获取遍历一个集合的迭代器
toArray()把一个集合转变成一个序列

List

实现类

  • ArrayList:
    • 长度可变的数组连续
    • 遍历和随机访问元素的效率高
  • LinkedList:
    • 链表存储方式
    • 插入、删除元素的效率较高
ArrayList
//新闻标题类  新闻标题  创建者
public class NewTitle {

    private int id;
    private String title;
    private String author;

    public NewTitle() {
    }

    public NewTitle(int id, String title, String author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}
import java.util.ArrayList;
//对新闻标题的存储及操作(ArrayList)
public class NewsMgr {
    public static void main(String[] args) {
        //创建新闻标题对象
        NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
        NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
        NewTitle title3 = new NewTitle(3,"北京热门景点北海","author");
        NewTitle title4 = new NewTitle(4,"北京热门景点颐和园","author");
        NewTitle title5 = new NewTitle(5,"北京热门景点天安门","author");

        //创建集合对象,并将新闻标题加入到集合中
        ArrayList list = new ArrayList();
        list.add(title1);//等同于数组中的list[0] = title1;
        list.add(title2);
        list.add(title3);
        list.add(title4);
        list.add(title5);

         //获取新闻标题的总数
        //ArrayList的size()方法等同于数组的length属性的作用
        System.out.println("新闻标题一共有"+list.size()+"条");
        //逐条打印新闻标题的名称
        //方法一:遍历ArrayList元素的位置(下标)
        for (int i = 0; i < list.size(); i++) {
            //list.get(i);//等同于list[i],但返回值是Object
            NewTitle title = (NewTitle)list.get(i);//数据类型转换
            System.out.println(title.getTitle()+"-"+title.getAuthor());
        }
        System.out.println("------------------------------------------------------------------");
        //方法二:增强型for
        for (Object obj:
             list) {
            NewTitle title = (NewTitle)obj;
            System.out.println(title.getTitle());
        }
    }
}

方法名说明
boolean add(Object o)在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)指定的索引位置添加元素,索引位置必须介于0和列表中元素个数之间=
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)判断列表中是否存在指定元素
boolean remove(Object o)从列表中删除元素
Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始
LinkedList
方法名说明
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表中的第一个元素
Object getLast()返回列表中的最后一个元素
Object removeFirst()删除并返回列表中的第一个元素
Object removeLast()删除并返回列表中的最后一个元素
import java.util.LinkedList;

//对新闻标题的存储及操作(ArrayList)
public class NewsMgr2 {
    public static void main(String[] args) {
        //创建新闻标题对象
        NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
        NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
        NewTitle title3 = new NewTitle(3,"北京热门景点北海","author");
        NewTitle title4 = new NewTitle(4,"北京热门景点颐和园","author");
        NewTitle title5 = new NewTitle(5,"北京热门景点天安门","author");

        //创建集合对象,并将新闻标题加入到集合中
        LinkedList list = new LinkedList();
        list.add(title1);//等同于数组中的list[0] = title1;
        list.add(title2);
        list.add(title3);
        list.add(title4);
        //在指定位置插入特定元素
        list.add(1,title5);

        //插入头条新闻标题
        NewTitle title6 = new NewTitle(6,"北京热门景点国家博物馆","李华");
        list.addFirst(title6);//在列表首部添加

         //获取新闻标题的总数
        //ArrayList的size()方法等同于数组的length属性的作用
        System.out.println("新闻标题一共有"+list.size()+"条");
        //逐条打印新闻标题的名称
        //方法一:遍历ArrayList元素的位置(下标)
        for (int i = 0; i < list.size(); i++) {
            //list.get(i);//等同于list[i],但返回值是Object
            NewTitle title = (NewTitle)list.get(i);//返回值为Object,要强制类型转换
            System.out.println(title.getTitle()+"-"+title.getAuthor());
        }
        System.out.println("------------------------------------------------------------------");
        //方法二:增强型for
        for (Object obj: list) {
            NewTitle title = (NewTitle)obj;
            System.out.println(title.getTitle());
        }

        //获取头条/末条新闻
        System.out.println("------------------------------------------------------------------");
        NewTitle titleFirst = (NewTitle)list.getFirst();
        System.out.println("头条新闻信息:"+titleFirst.getTitle());

        System.out.println("------------------------------------------------------------------");
        NewTitle titleLast = (NewTitle)list.getLast();
        System.out.println("末条新闻信息:"+titleLast.getTitle());

        //删除头条信息
        list.removeFirst();
        System.out.println("删除之后的条数:"+list.size());
        for (Object obj:
             list) {
            NewTitle title = (NewTitle)obj;
            System.out.println(title.getTitle()+"-"+title.getAuthor());
        }
    }
}

可以用父类引用子类(List list = new LinkedList)的方法,但是只能调用父子类共有的方法,子类独有方法不能调用

Set

实现类HashSet

因为Set接口是唯一、无序的,所以不能通过get输出。

  • Set中存放对象的引用
import java.util.*;
//Set中存放了对象的引用
public class SetDemo {
    public static void main(String[] args) {
        Set set = new HashSet();
        String s1 = new String("java");
        String s2 = s1;
        String s3 = new String("JAVA");
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set.size());//2
    }
}
  • Set接口采用对象的equals()方法比较两个对象是否相等
import java.util.*;

//Set如果对应的值一样
public class SetDemo2 {
    public static void main(String[] args) {
        Set set = new HashSet();
        String s1 = new String("java");
        String s2 = s1;
        String s3 = new String("java");
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set.size());//1
    }
}

遍历Set集合方法:

  • (1)增强for循环

  • (2)迭代器Iterator

    • 获取Iterator: Collection接口和iterator()方法
    • Iterator方法
      • boolean hasNext():判断是否存在另一个可访问的元素
      • Object next():返回要访问的下一个元素
    import java.util.*;
    
    //对新闻标题的存储及操作(ArrayList)
    public class NewsMgr3 {
        public static void main(String[] args) {
            //创建新闻标题对象
            NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
            NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
    
            //创建集合对象,并将新闻标题加入到集合中
            Set set = new HashSet();
            //Set--Collection(add(Object))
            set.add(title1);
            set.add(title2);
    
            //获取新闻标题的总数
            System.out.println("新闻标题一共有"+set.size()+"条");
    
            //逐条打印新闻标题的名称
            System.out.println("------------------------------------------------------------------");
            //方法一:增强for
            for (Object obj : set) {
                NewTitle title = (NewTitle)obj;
                System.out.println(title.getTitle()+"-"+title.getAuthor());//乱序
            }
            
            System.out.println("------------------------------------------------------------------");
            //方法二:迭代器Iterator
            //(1)获取迭代器对象
            Iterator itor = set.iterator();
            //(2)判断是否存在下一个元素
            while(itor.hasNext()){
                //(3)返回要访问下一个元素
                NewTitle title = (NewTitle)itor.next();
                System.out.println(title.getTitle()+"-"+title.getAuthor());
            }
        }
    }
    

Map

实现类HashMap

(key,value):key是唯一、无序的;value是可重复的

Map和Collection没有继承关系,Map不是Collection的 子接口。

对数据的操作:

  • put(key,value)
  • get(key)
  • size():
方法名说明
Object put(Object key, Object val)以“键-值”对的方式进行存储
Object get(Object key)根据键返回相关联的值,如果不存在指定的键,返回null
Object remove(Object key)删除=由指定的键映射的=“键-值”对==
int size()返回元素个数
Set keySet()返回的集合
Collection values()返回的集合
boolean containsKey(Object key)如果存在由指定的键映射的“键-值”对,返回true

遍历Map:

  1. 遍历key,通过key=>value
    1. 通过迭代器Iterator实现遍历
    2. 增强型for循环
  2. 遍历key-value对(数据类型为Map.Entry)
import java.util.*;
public class CountriesInfo {
    public static void main(String[] args) {
        //创建集合对象,并将国家信息键值对放入集合
        Map countries = new HashMap();
        countries.put("China","中国");
        countries.put("USA","美国");
        countries.put("Japan","日本");
        countries.put("France","法国");

        //获取集合中存储元素个数
        System.out.println(countries.size());

        //获取集合中特定的key和value,Object返回值类型,需要强制数据类型转换
        String country = (String)countries.get("China");
        System.out.println(country);

        //如果找不到,返回null
        String country2 = (String)countries.get("Australia");
        System.out.println(country2);

        //判断集合中是否存在某一国家
        System.out.println("是否存在china"+countries.containsKey("China"));

        //删除某个特定key对应的国家
        System.out.println("是否存在USA:"+countries.containsKey("USA"));
        countries.remove("USA");
        System.out.println("是否存在USA:"+countries.containsKey("USA"));
        System.out.println(countries.size());

        //获取键的集合、值的集合,键值对的集合
        System.out.println(countries.keySet());
        System.out.println(countries.values());
        System.out.println(countries);
        System.out.println("---------------------------------------------------------");
        //遍历Map 思路一:遍历key(Set),通过key=>value
        Set keys = countries.keySet();//获取Map中的所有key
        //方法一:增强型for遍历key(Set)
        for (Object obj:
             keys) {
            String key = (String)obj;//获取Map中的每一个key
            String value = (String)countries.get(key);//根据Map中的每一个key获取对应的value
            System.out.println(key+"--"+value);
        }
        System.out.println("---------------------------------------------------------");
        //方法二:迭代器Iterator遍历key(Set)
        Iterator itor = keys.iterator();
        while (itor.hasNext()){
            String key = (String)itor.next();//获取到了Map中的每一个key
            String value = (String)countries.get(key);//根据Map中的每一个key获取对应的value
            System.out.println(key+"--"+value);
        }
        //遍历Map 思路二:获取Map中的所有键值对,然后在键值对中分别获取key和value
        System.out.println("---------------------------------------------------------");
        Set set = countries.entrySet();//获取Map中的键值对
        //遍历键值对的集合,把每个键值对(obj)----Map.Entry(键值对的类型)拿出来
        for (Object obj:set) {
            Map.Entry me = (Map.Entry)obj;
            String key = (String)me.getKey();//获取出来键值对中的键
            String value = (String)me.getValue();//获取出来键值对中的值
            System.out.println(key+"--"+value);
        }
    }
}

实例:

//学生类型:姓名和性别
public class Student {
    private String name;
    private String sex;

    public Student() {
    }

    public Student(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

import java.util.*;

//学生信息管理(学生英文名获取对应学生详细信息
public class StudentInfoMgr {
    public static void main(String[] args) {
        Student stu1 = new Student("张三","男");
        Student stu2 = new Student("李华","男");
        Student stu3 = new Student("王晓华","女");

        Map stuMap = new HashMap();
        stuMap.put("Buck",stu1);
        stuMap.put("Jack",stu2);
        stuMap.put("Jession",stu3);

        //输出共几名学生进入了外企
        System.out.println("一共有"+stuMap.size()+"名学生进入了外企");
        System.out.println("------------------------ta们是----------------------");
        Set set = stuMap.entrySet();
        for (Object obj : set) {
            Map.Entry me = (Map.Entry)obj;
            String key = (String)me.getKey();
            Student student = (Student)me.getValue();
            System.out.println(key+"-"+student.getName()+"-"+student.getSex());
        }
    
        //实现获得特点英文名称下的学生信息
        System.out.println("------------------------------------");
        //String name = "Jack";
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查找到的学生英文名:");
        String name = scanner.nextLine();
        if (stuMap.containsKey(name)){
            //在Map中找到了相应的key,则根据key获得相应的value
            Student student = (Student)stuMap.get(name);
            System.out.println("该学生信息如下:");
            System.out.println(name+"-"+student.getName()+"-"+student.getSex());
        }else {
            System.out.println("对不起,没有该学员");
        }

    }
}

Collections算法类:

Collections类定义了一系列用于操作集合的静态方法

  • 常用的静态方法

    • sort():排序(升序)
    • binarySearch():查找
    • max()\min():查找最大、最小值
    • reverse():反转元素数组
  • import java.util.*;
    
    //Collections的常用方法
    public class CollectionsUseDemo {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("ant");
            list.add("bear");
            list.add("pen");
            list.add("zoo");
            list.add("apple");
            list.add("candy");
            list.add("zookeeper");
    
            System.out.println("-------------------------");
            for (String s:
                 list) {
                System.out.println(s);
            }
            System.out.println("-------------------------");
            //使用Collections对集合进行升序排序
            Collections.sort(list);
            for (String s:
                 list) {
                System.out.println(s);
            }
            System.out.println("-------------------------");
            //查找集合中的最大、最小值
            System.out.println("集合中的最大元素是:"+Collections.max(list));
            System.out.println("集合中的最小元素是:"+Collections.min(list));
            //查找集合中的特定元素,先排序
            System.out.println(Collections.binarySearch(list,"candy"));
            //反转集合元素
            Collections.reverse(list);
            for (String s:
                    list) {
                System.out.println(s);
            }
        }
    }
    
    
  • 自定义元素排序

    • 实现Comparable接口
    • 重写compareTo()方法
    public class Student implements Comparable {
        private int no;
        private String name;
        private String sex;
    
        public Student() {
        }
        public Student(int no, String name, String sex) {
            this.no = no;
            this.name = name;
            this.sex = sex;
        }
    
        public int getNo() {
            return no;
        }
    
        public void setNo(int no) {
            this.no = no;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        //重写方法,定义学生对象的比较规则
        //比较规则:学号大的往后排
        //比较对象:当前学生对象(this)和Object o
        public int compareTo(Object o) {
            Student student = (Student)o;
            if (this.no == student.no){
                return 0;//学号相同
            }else if (this.no > student.no){
                return 1;//当前学生学号大于比较学生学号
            }else {
                return -1;//当前学生学号小于比较学生学号
            }
        }
    }
    
    
    import java.util.*;
    
    //Collections的常用方法
    public class CollectionsUseDemo {
        public static void main(String[] args) {
            List<Student> list = new ArrayList<Student>();
            Student stu1 = new Student(1,"张三","男");
            Student stu2 = new Student(7,"李四","男");
            Student stu3 = new Student(3,"王晓华","女");
            Student stu4 = new Student(9,"王五","男");
            list.add(stu1);
            list.add(stu2);
            list.add(stu3);
            list.add(stu4);
    
            System.out.println("-------------------------");
            for (Student stu : list) {
                System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
            }
            System.out.println("-------------------------");
            //使用Collections对集合进行升序排序
            Collections.sort(list);
            for (Student stu:
                 list) {
                System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
            }
            System.out.println("-------------------------");
    
        }
    }
    

泛型

<>

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性稳定性

  • 本质是参数化类型
  • 使用泛型定义时,便不需要强制类型转换
  • 泛型集合可以约束集合的元素类型,如ArrayList student,表示student集合中只允许有E元素类型。
import java.util.*;

public class NewsMgr {
    public static void main(String[] args) {
        NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
        NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");


        ArrayList<NewTitle> list = new ArrayList<NewTitle>();
        list.add(title1);//等同于数组中的list[0] = title1;
        list.add(title2);
        
        //泛型约束了集合框架添加元素的安全性,错误类型元素添加,在编译时就不通过
        //list.add("aaa");
        //方法一:遍历ArrayList元素的位置(下标)
        for (int i = 0; i < list.size(); i++) {
            //list.get(i);//等同于list[i],但返回值是Object
            
            //NewTitle title = (NewTitle)list.get(i);//数据类型转换
            NewTitle title = list.get(i);//添加泛型后,返回值为NewTitle
            System.out.println(title.getTitle()+"-"+title.getAuthor());
        }
        System.out.println("------------------------------------------------------------------");
        //方法二:增强型for
        /*for (Object obj: list) {
            NewTitle title = (NewTitle)obj;
            System.out.println(title.getTitle());
        }*/
        for (NewTitle title: list) {
            System.out.println(title.getTitle());
        }
        System.out.println("------------------------------------------------------------------");
        //方法三:迭代器Iterator
        System.out.println("迭代器");
        Iterator<NewTitle> itor = list.iterator();
        while (itor.hasNext()){
            NewTitle title = itor.next();
            System.out.println(title.getTitle()+"-"+title.getAuthor());
        }
  • 泛型嵌套:<Map.Entry<key,value>>
 Set<Map.Entry<String,String>> set = countries.entrySet();//获取Map中的键值对
        //遍历键值对的集合,把每个键值对(obj)----Map.Entry(键值对的类型)拿出来
        for (Map.Entry<String,String> me:set) {
            String key = me.getKey();//获取出来键值对中的键
            String value = me.getValue();//获取出来键值对中的值
            System.out.println(key+"--"+value);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值