java集合和泛型教程

集合

1、集合和数组存储数据的概述:

集合、数组都是对多个数据进行存储操作的结构,简称java容器。(此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储)。

​ 开发应用程序时,如果想存储多个同类型的数据,可以通过数组来实现,但是使用数组存在如下一些明显的缺陷:

  • 数组长度固定不变,不能很好的适应元素数量动态变化的情况。

  • 可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。

  • 数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较。

java集合框架提供了一套优良,使用方便的接口和类,他们都位于java.util包中,其主要内容及彼此之间的关系如下图所示:(虚线框代表接口 、实现框代表接口的实现类)

在这里插入图片描述

2、List接口

List接口常用的实现类有:ArrayList和LinkedList.

1)使用ArrayList动态存储数据

​ java集合框架提供了ArrayLIst 集合类,对数组进行了封装,实现了长度可变的数组,他不等同于数组,ArrayList集合中可以添加任何类型的数据,并且添加的数据都将转换成Obejct类型,而在数组中只能添加同一数据类型的数据。

​ 下面是ArrayList类的常用方法:

package ArrayLIst;

import java.util.ArrayList;

public class day1 {

    public static void main(String[] args) {
        ArrayList list = new ArrayList(); //创建ArrayList对象
        // boolean add(Object o)   add方法在列表的末尾添加元素o,起始索引位置从0开始
        list.add("张三丰");
        list.add("郭靖");
        list.add("黄蓉");
        list.add(10);
        list.add(10.0);

        //boolean contains(Object o)  contains方法 判断列表中是否存在指定元素o
       System.out.println(list.contains("李莫愁"));

        System.out.println("----------------------");
       //Object remove(int index)  remove方法 从列表中删除指定位置的元素,起始索引位置从0开始
       list.remove(0);

       //void set(int index,Object obj)  set方法 将index索引位置的元素替换为obj员素
       list.set(1,"黄蓉");

       for (int i=0;i<list.size();i++){  //size()方法 返回列表中的元素个数
           //get方法,返回指定索引位置处的元素
           Object name = list.get(i);
           System.out.println(name);
       }

        System.out.println("------------------");
       //int indexOf(Object obj)  indexOf 方法 返回元素在集合中出现的索引位置 没有返回-1
        System.out.println(list.indexOf("小龙女"));



    }
}

运行结果
false
----------------------
郭靖
黄蓉
10
10.0
------------------
-1

练习题:

​ 使用ArrayLIst集合存储新闻标题信息(包含ID、名称、创建者),输出新闻标题的总数量及每条新闻标题的名称。

2)使用LInkedList类动态存储数据

​ LinkedList类是LIst接口的链接列表实现类,他支持实现所有LIst接口可选的列表操作,并且允许元素值是任何数据,包括null.

​ LinkedLIst类采用链表存储方式存储数据,优点在于插入,删除元素时效率比较高,但是LinkedList类的查找效率很低。

​ 他除了包含ArrayLIst类包含的方法外,还提供了以下方法,可以在LinkedList类的首部或尾部进行插入,删除操作。

LInkedLIst类的常用方法如下:这里用一个实例说明;

​ 实例:使用LInkedLIst集合存储新闻标题(包含Id、名称、创建者),实现获取、添加及删除头条和末条新闻标题信息功能,并遍历集合。

package LinkedLIst;

import java.util.LinkedList;

public class NewTitle {

    int id;
    String name;
    String creator;

    public NewTitle() {
    }

    public NewTitle(int id, String name, String creator) {
        this.id = id;
        this.name = name;
        this.creator = creator;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }


    public static void main(String[] args) {
        NewTitle car = new NewTitle(1, "汽车", "管理员");
        NewTitle medical = new NewTitle(2, "医学", "管理员");
        NewTitle fun = new NewTitle(3, "娱乐", "管理员");
        NewTitle gym = new NewTitle(4, "体育", "管理员");

        LinkedList newsTileList = new LinkedList();

        newsTileList.add(car);
        newsTileList.add(medical);

        newsTileList.addFirst(fun);//void addFirst(Object obj) 将指定元素插入到当前集合的首部
        newsTileList.addLast(gym);//void addLast(Object obj) 将指定元素插入到当前集合的尾部
        System.out.println("头条和末条新闻已添加");

        //获取头条以及末条新闻标题
        NewTitle first =(NewTitle) newsTileList.getFirst();//Object getFirst() 获得当前集合的第一个元素
        System.out.println("头条新闻的标题为:"+first.getName());
        NewTitle last = (NewTitle) newsTileList.getLast();//Object getLast() 获取当前集合的最后一个元素
        System.out.println("末条新闻的标题为:"+last.getName());

        //删除头条和末条新闻标题
        newsTileList.removeFirst();//Object removeFirst() 移除并返回点前集合的第一个元素
        newsTileList.removeLast();//Object removeLast() 移除并返回当前的最后一个元素
        System.out.println("头条和末条新闻标题已移除");

        System.out.println("遍历所有的新闻标题");
        for (Object obj:newsTileList){
            NewTitle newTitle=(NewTitle)obj;
            System.out.println("新闻标题名称:"+newTitle.getName());
        }
        
    }
}
运行结果:
头条和末条新闻已添加
头条新闻的标题为:娱乐
末条新闻的标题为:体育
头条和末条新闻标题已移除
遍历所有的新闻标题
新闻标题名称:汽车
新闻标题名称:医学

进程已结束,退出代码 0


3.Set接口

​ Set接口是Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合。集合中的对象并不按一定的方式排序,并且不能保存重复的对象,也就是说Set接口可以存储一组唯一、无序对象。

Set接口常用的实现类有HashSet

1)使用HashSet类动态存储数据

HashSet集合的特点:

  • 集合内的元素是无序排列的。

  • HashSet类是非线程安全的。

  • 允许集合元素值为null。

    下表是HashSet类的常用方法:

    方法说明
    boolean add(Object obj)如果Set中尚未包含指定元素obj,则添加指定元素obj
    void clear()从Set中移除所有元素
    int size()返回Set中的元素的数量(Set的容量)
    boolean isEmpty()如果Set不包含任何元素,则返回true
    boolean contians(Object obj)如果Set包含指定元素obj,则返回true
    Boolean remove(Object obj)如果指定元素obj存在于Set中,则将其移除

​ 练习题:使用HashSet列的常用方法存储并操作新闻标题信息,并遍历集合

4.Map接口

1)Map接口概述:

​ Map接口存储一组成对的 键(key) 值(value)对象,提供key到value的映射,通过key来检索,Map接口中的key不要求有序,不允许重复,value同样不要求有序。但允许重复。

​ 下表列举了Map接口的常用的方法:

方法说明
Object put(Object key,Object value)将相互关联的一个key与一个value放入该集合,如果次Map接口中已经包含了可以对应的value,则旧值将被替换
Object remove(Object key)从当前集合中移除与指定key 相关的映射,并返回该key关联的旧value,如果key没有任何关联,则返回null
Object get(Object key)获得与key相关的value,如果该key不关联任何非null值,则返回null
boolean containsKey(Object key)判断集合中是否存在key
boolean containsValue(Object value)判断集合中是否存在value
boolean isEmpty()判断集合中是否存在元素
void clear()消除集合中的所有元素
int size()返回集合中元素的数量
Set keySet()获取所有key的集合
Collection value()获取所有value的集合

​ Map 接口中存储的数据都是键值对,例如,一个身份证号对应一个人,其中身份证号及时key ,榆次号码对应的人就是value。

2)使用HashMap类动态存储数据

​ 最常用的Map实现类是HashMap,其优点是查询指定元素效率高。

下面是一个实例:练习一下上面的方法

​ 实例:使用HashMap类存储学生信息,要求可以根据英文名称检索学生信息。

package HashMap;

import java.util.HashMap;

public class Student {
    String name;
    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;
    }

    public static void main(String[] args) {
        Student student1 = new Student("黎明", "男");//创建保存“键值对”的集合对象
        Student student2 = new Student("琉璃", "女");

        HashMap students = new HashMap();

        students.put("jack",student1);
        students.put("Rose",student2);
        System.out.println("已添加"+students.size()+"个学生信息");

        System.out.println("键集:"+students.keySet());//输出键集

        //判断是否存在jack这个键,如果存在,则根据键获取相应的值
        String key="jack";
        if(students.containsKey(key)){
            Student student =(Student) students.get(key);
            System.out.println("英文名"+key+"的学生姓名:"+student.getName());
        }

        System.out.println("输出学生名:");
        for (Object key1:students.keySet()){
            System.out.println(key1.toString());
        }
        //输出学生详细信息
        System.out.println("输出学生详细信息");
        for (Object value:students.values()){
            Student student=(Student)value;
            System.out.println("姓名:"+student.getName()+"性别:"+student.getSex());
        }

    }
}
运行结果:
已添加2个学生信息
键集:[Rose, jack]
英文名jack的学生姓名:黎明
输出学生名:
Rose
jack
输出学生详细信息
姓名:琉璃性别:女
姓名:黎明性别:男

进程已结束,退出代码 0

泛型

1、认识泛型

​ 泛型是JDK 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型,简单来说,java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。

泛型的定义语法格式如下:类1或者接口<类型实参> 对象=new 类2<类型实参>();

例如:ArrayLIst list=new ArrayList();

上述代码表示创建一个AarryList集合,但规定该集合中存储的元素类型必须为String类型。

2、泛型在集合中的应用

​ 在学习如何使用泛型之前,还需要了解以下两个重要的概念:

  • 参数化类型:参数化类型包含一个类的接口,以及实际的类型参数列表。
  • 类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型。

1)使用LinkedList的泛型:

package ArrayLIst;


import java.util.LinkedList;

public class NewTitle2 {
    int id;
    String name;
    String creator;

    public NewTitle2() {
    }

    public NewTitle2(int id, String name, String creator) {
        this.id = id;
        this.name = name;
        this.creator = creator;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }

    public static void main(String[] args) {
        NewTitle2 car = new NewTitle2(1, "汽车", "管理员");
        NewTitle2 medical = new NewTitle2(2, "医学", "管理员");
        NewTitle2 fun = new NewTitle2(3, "娱乐", "管理员");
        NewTitle2 gym = new NewTitle2(4, "体育", "管理员");

        LinkedList<NewTitle2> newsTileList = new LinkedList<NewTitle2>();


        newsTileList.add(car);
        newsTileList.add(medical);

        newsTileList.addFirst(fun);//void addFirst(Object obj) 将指定元素插入到当前集合的首部
        newsTileList.addLast(gym);//void addLast(Object obj) 将指定元素插入到当前集合的尾部
        System.out.println("头条和末条新闻已添加");

        //获取头条以及末条新闻标题
        NewTitle2 first = newsTileList.getFirst();//Object getFirst() 获得当前集合的第一个元素
        System.out.println("头条新闻的标题为:"+first.getName());
        NewTitle2 last = newsTileList.getLast();//Object getLast() 获取当前集合的最后一个元素
        System.out.println("末条新闻的标题为:"+last.getName());

        //删除头条和末条新闻标题
        newsTileList.removeFirst();//Object removeFirst() 移除并返回点前集合的第一个元素
        newsTileList.removeLast();//Object removeLast() 移除并返回当前的最后一个元素
        System.out.println("头条和末条新闻标题已移除");

        System.out.println("遍历所有的新闻标题");
        for (NewTitle2 title2:newsTileList){
            System.out.println("新闻标题名称:"+title2.getName());
        }

    }



}

2)使用HashMap的泛型

package HashMap;

import java.util.HashMap;

public class Student {
    String name;
    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;
    }

    public static void main(String[] args) {
        Student student1 = new Student("黎明", "男");//创建保存“键值对”的集合对象
        Student student2 = new Student("琉璃", "女");

        HashMap<String,Student> students = new HashMap<String, Student>();

        students.put("jack",student1);
        students.put("Rose",student2);
        System.out.println("已添加"+students.size()+"个学生信息");

        System.out.println("键集:"+students.keySet());//输出键集

        //判断是否存在jack这个键,如果存在,则根据键获取相应的值
        String key="jack";
        if(students.containsKey(key)){
            Student student =students.get(key);
            System.out.println("英文名"+key+"的学生姓名:"+student.getName());
        }

        System.out.println("输出学生名:");
        for (Object key1:students.keySet()){
            System.out.println(key1.toString());
        }
        //输出学生详细信息
        System.out.println("输出学生详细信息");
        for (Student value:students.values()){
            System.out.println("姓名:"+value.getName()+"性别:"+value.getSex());
        }

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值