集合框架和泛型

一.Java集合框架

在这里插入图片描述

说明:对于以上的框架图有如下几点说明

1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
4. 实现类:8个实现类(实线表示),对接口的具体实现。
5.Set、List和Map可以看做集合的三大类:
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

二.Collection

集合接口:Collection(无序,可重复的一组数据)

Collection常用的方法

在这里插入图片描述
此外还有:
toArray()方法 返回一个表示集合的数组。
iterator()方法 返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。

1.List

List(接口):有序(插入顺序),可重复的
常用的两个实现类ArrayList,LinkedList

a . ArrayList

1)基本知识

以数组作为底层存储
1.插入前先判断容量是否越界,则扩容
a.扩容后比数组最大长度大,则是int的最大值作为数组长度,还没达到数组最大长度,则就是数组最大长度
b.正常来说扩容1.5倍,如果扩容1.5倍以后还不够,则直接把当前长度赋值给数组新长度
c.如果是新数组和把长度与10比较,大的复制给新数组长度
2.不需要扩容则直接插入
Vector:ArrayList的线程安全版,在多线程的状况下使用
由于底层是数组,遍历方便,随机访问方便,改动对应方便

2)ArrayList常用方法

在这里插入图片描述

public class ArrayListDemo {
    public static void main(String[] args) {
       ArrayList array=new ArrayList();//声明并分配空间
        //元素的增加
        array.add("我");
        array.add("123");
        array.add("mini");
        //指定下标插入元素,同时把后面的元素后移
        array.add(0,"hi");
        //元素的删除,两种方法,移除具体对象或者移除指定下标元素
        array.remove("123");
        array.remove(1);
        //指定下标修改元素
        array.set(1,"big");
        System.out.println(array);
    }
}

效果图

[hi, big]

3)ArrayList的遍历(3种)

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList array=new ArrayList();
        array.add("我");
        array.add("爱");
        array.add("吃");
        //for循环遍历
        for (int i = 0; i <array.size(); i++) {
            System.out.println(array.get(i));//获取对应的下标元素
        }
       //增强for遍历
        for (Object o : array) {//for(数据类型 变量名:遍历的目标)
            System.out.println(o);
        }
        //迭代器
        Iterator it=array.iterator();
        while (it.hasNext()){
            Object o=it.next();//如果需要使用当前元素多次,则用变量接受
            System.out.println(o);//多次调用时,直接用接受的变量即可
        }
    }
}

效果图

我
爱
吃
public class TitleList {
    public static void main(String[] args) {
        ArrayList titles=new ArrayList();
        Title t=new Title();
        t.setId(1);
        t.setName("读者");
        t.setCreator("小陈");
        Title t2=new Title(2,"格林","小陈");
        titles.add(t);
        titles.add(t2);
        System.out.println(titles);
        for (Object title : titles) {
            //instanceof 是 Java 的保留关键字。
            // 它的作用是测试它左边的对象是否是它右边的类的实例,
            // 返回 boolean 的数据类型
            if (title instanceof Title){
                Title t1=(Title) title;
                System.out.println(t1.getName());
            }

        }
    }
}

效果图

[1读者小陈, 2格林小陈]
读者
格林

b . LinkedList

1)基本知识

以链表作为底层存储
链表:多个node互相存储地址,以下一个node的地址存储
根据Node对象中的Node属性next和prev来确定顺序
遍历很不方便,增加node和删除node(插入和删除元素)会很快

2)LinkedList常用方法

在这里插入图片描述

public class Node {//模拟链表的每一个节点
    public Object element;
    //下一个
    public Node next;
    //上一个,如果不定义上一个,则是单向链表
    public Node pre;
    public static void main(String[] args) {
        Node n1=new Node();
        n1.element="我是第一个";
        Node n2=new Node();
        n2.element="我是第二个";
        n1.next=n2;
        Node n3=new Node();
        n3.element="我是第三个";
        n2.next=n3;
        n2.pre=n1;
        n3.pre=n2;
    }
}

3)LinkedList的遍历(3种)

public class TestLinkedList {
    public static void main(String[] args) {
        LinkedList list=new LinkedList();
        list.add("a");
        list.add(0,"pei");
        list.addFirst("number1");
        //for循环遍历
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }
        //增强for遍历
        for (Object o : list) {
            System.out.println(o);
        }
        //迭代器遍历
        Iterator it=list.iterator();
        while (it.hasNext()){
            Object ob=it.next();
            System.out.println(ob);
        }
    }
    }

效果图

number1
pei
a

2.Set

set:不可重复(元素),无序的
HashSet是Set接口常用的实现类

1)HashSet

是以HashMap的key值的hash码来进行存储(保证唯一,理论上)
Set接口中判断加入对象是否已经存在的方法
采用对象的equals()方法比较两个对象是否相等
set接口没有get()方法,无法按下标查找或遍历

2)Set接口的遍历(2种,因为Set接口没有下标,用不了for循环遍历)

在这里插入图片描述

public class TestHashSet {
    public static void main(String[] args) {
        HashSet set=new HashSet();
        set.add("abc");
        set.add(123);
        //增强for遍历
        for (Object o : set) {
            System.out.println(o);
        }
        //迭代器遍历
        Iterator it=set.iterator();
        while (it.hasNext()){
            Object obj=it.next();
            System.out.println(obj);
        }
    }
}

效果图

abc
123

3.Map

1).基本知识

Map继承Collection接口,是Collection的子接口
Map接口存储一组键值对象,提供key到value的映射
包含接口Entry<K,V>
在HashMap中使用Node节点实现了Entry键值对
Node节点用next属性实现了单向链表
map底层entry+单向链表,数组+单向链表
当元素节点个数超过8时,转用红黑树进行底层存储
使用map.remove(Object key,Object value)方法进行删除操作时,必须要key和value都匹配时才能删除

2).Map接口常用方法

在这里插入图片描述

public class TestHashMap {
    public static void main(String[] args) {
        HashMap map=new HashMap();
        map.put("CN","中华人民共和国");
        map.put("UK","大不列颠");
        map.put("US","美利坚合众国");
        map.put("RU","俄罗斯联邦共和国");
        System.out.println(map);
        System.out.println(map.get("CN"));
        map.put("US","美国");//修改,map.replace()修改方面基本一致
        map.remove("RU");
        map.remove("US","美国");//必须要key和value都匹配时才能删除
        System.out.println(map);
        System.out.println(map.size());
        System.out.println(map.containsKey("CN"));
        System.out.println(map.containsValue("美国"));
        map.clear();
        if (map.isEmpty()){
            System.out.println("已清空");
        }
        }}

效果图

{RU=俄罗斯联邦共和国, UK=大不列颠, CN=中华人民共和国, US=美利坚合众国}
中华人民共和国
{UK=大不列颠, CN=中华人民共和国}
2
true
false
已清空

3).遍历Map集合

在这里插入图片描述

public class TestStudentDemo {
    public static void main(String[] args) {
       HashMap map=new HashMap();
       map.put("1","rose");
       map.put("2","jay");
       //遍历,键值对的映射
       Set entrys=map.entrySet();
        for (Object o : entrys) {
            System.out.println(o);
        }
    }
}

效果图

1=rose
2=jay

4).HashMap

a.获取键

public class TestStudentDemo {
    public static void main(String[] args) {
       HashMap map=new HashMap();
       map.put("1","rose");
       map.put("2","jay");
       Set key=map.keySet();
        for (Object o : key) {
            System.out.println(o);
            System.out.println(map.get(o));
        }
    }
}

效果图

1
rose
2
jay

b.获取值

public class TestStudentDemo {
    public static void main(String[] args) {
       HashMap map=new HashMap();
       map.put("1","rose");
       map.put("2","jay");
       Collection values=map.values();
        for (Object o : values) {
            System.out.println(o);
        }
    }
}

效果图

rose
jay

5).练习

  • 学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象。实现通过英文名称,获得该学员对象的详细信息(学员属性包括姓名以及性别)

学生类

public class StudentDemo {
    private String name;
    private String sex;

    @Override
    public String toString() {
        return "对应的学员姓名是:" +
                getName() + ",性别是:" +getSex();
    }

    public StudentDemo() {
    }

    public StudentDemo(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 class TestStudentDemo {
    public static void main(String[] args) {
        StudentDemo stu=new StudentDemo("李明","男");
        HashMap map=new HashMap();
        map.put("Jack",stu);
        Set key=map.keySet();
        for (Object o : key) {
            System.out.println(o+""+map.get(o));
        }
    }
}

效果图

Jack对应的学员姓名是:李明,性别是:男

三.泛型

1.定义

在这里插入图片描述

2.泛型集合

在这里插入图片描述

3.练习

  • 学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象。实现通过英文名称,获得该学员对象的详细信息(学员属性包括姓名以及性别,通过泛型解决该问题)

学生类同上
测试类

public class TestStudentDemo {
    public static void main(String[] args) {
       StudentDemo stu=new StudentDemo("李明","男");
       HashMap<String,StudentDemo> map=new HashMap<>();
       map.put("Jack",stu);
       Set<String> key=map.keySet();
        for (Object o : key) {
            System.out.println(o+""+map.get(o));
        }//使用泛型的时候,可以使用集合输入类型
    }
}

效果图同上

四.Collections算法类

Collections类常用方法

在这里插入图片描述

Collections排序

在这里插入图片描述
自定义entry

猜你喜欢

转载自blog.csdn.net/nayomi927/article/details/113183433
今日推荐