集合框架、泛型

集合框架、泛型,第1张

集合框架、泛型

目录

一、集合概述、

二、集合的体系结构

三、Collection集合的使用

四、List接口及其子类的使用

五、Set接口及其子类的使用

六、Map集合的使用

七、泛型编程


一、集合概述、

1.什么是集合

所处位置:位于java.util包下

集合类似于一个容器,可以用来存储数据。

2.集合容器的特点

1.集合容器的长度是可变的

2.集合容器只能存储引用数据类型,也就是对象的引用,非对象本身

3.一个集合容器可以存储不同引用数据类型的数据

4.可以使用泛型,存储指定引用数据类型数据

3.集合容器与数组容器的区别

1.集合容器的长度是可以变化的,数组一旦初始化长度就不能改变

2.集合容器只能存储引用数据类型、数组容器既可以存储引用数据类型也可以存储基本数据类型

3.一个集合可以存储多种引用数据类型,数组容器只能存储一种数据类型。

二、集合的体系结构

集合分为Collection(集合),和Map(映射)。

1.Collection 单列集合的顶级接口。

   List(列表) 子接口

    --ArrayList 实现类

    --linkedList 实现类

    --Vector  实现类

  Set(集) 子接口

    --HashSet 实现类

    --TreeSet 实现类

    --linkedHashSet 实现类

2.Map集合,双列集合的顶级接口

  Map 接口

    --HashMap 实现类

    --TreeMap 实现类

    --HashTable 实现类

      --Properties 实现类

    --linkedHashMap

三、Collection集合的使用

Collection接口,常见的成员方法

1.public boolean add(Object e):添加元素

2.public boolean addAll(Collection c):添加集合

3.public boolean remove(Object o)删除元素

4.public boolean removeIf(Predicate filter):按照条件删除元素

5.public void clear():清空容器

6.public int size():集合容器的长度

7.public boolean contains(Object o):判断集合容器中是否包含指定元素

8.public boolean isEmpty():判断集合容器是否为空

9.public Object[] toArray():将集合容器转为数组容器

10.Interator iterator():获取迭代器对象

增强for循环的使用:

for(数据类型 变量名(元素名):要遍历的数组容器){

}

集合容器的简单使用:

示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo01 {
    public static void main(String[] args) {
        Collection c=new ArrayList();
        //1.添加元素
        c.add("Maria");
        c.add("Jerry");
        c.add("Michael");
        c.add("Tom");
        c.add("Jane");
        //2.删除元素
        c.remove("Jane");
        //3.遍历容器1
        Object[] obj=c.toArray();
        for(int i=0;i 
四、List接口及其子类的使用 

1.List集合的特点:

1.元素存储是有序的

2.存储的元素可以重复

3.有索引的

2.常见的成员方法:

Collect有的List都有

public void add(int index, Object element):在指定的索引处添加元素
public E get(int index):获取指定索引处的元素
public Object remove(int index):删除指定索引处的元素
public Object set(int index, Object element):修改指定索引处的元素,返回被修改的数据

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

public class Demo01 {
    public static void main(String[] args) {
        List l=new ArrayList();
        //1.添加元素
        l.add("Maria");
        l.add("Jerry");
        l.add("Michael");
        l.add("Tom");
        l.add("Jane");
        //2.删除元素
        l.remove("Jane");
        //3.在指定的索引处添加元素
        l.add(0,"Jane");
        //遍历容器1
        Object[] obj=l.toArray();
        for(int i=0;i 

3.List子类ArrayList使用方法

ArrayList集合的特点?
1.有序的(存入的顺序和取出的顺序是一样的)
2.元素可以重复的
3.有索引的

ArrayList底层使用的数据结构:数组数据结构

public class Demo01 {
    public static void main(String[] args) {
        ArrayList l=new ArrayList();
        //1.添加元素
        l.add("Maria");
        l.add("Jerry");
        l.add("Michael");
        l.add("Tom");
        l.add("Jane");
        //2.删除元素
        l.remove("Jane");
        //3.在指定的索引处添加元素
        l.add(0,"Jane");
        //遍历容器1
        Object[] obj=l.toArray();
        for(int i=0;i 

练习一:删除集合{"aaa","bbb","aaa","aaa","ccc","ddd"}中所有"aaa"元素

import java.util.ArrayList;
import java.util.Iterator;
public class Demo01 {
    public static void main(String[] args) {
        ArrayList al=new ArrayList();
        al.add("aaa");
        al.add("bbb");
        al.add("aaa");
        al.add("aaa");
        al.add("ccc");
        al.add("ddd");
        /*for(int i=0;i

4.List子类linkedList使用方法

linkedList集合的特点?
1.有序的(存入的顺序和取出的顺序是一样的)
2.元素可以重复的
3.有索引的

linkedList底层使用的数据结构:双向链表数据结构

linkedList常见的成员方法

List有的linkedList也有

1.public void addFirst(Object e):将元素添加到第一个位置
2.public void addLast(Object e):将元素添加到最后一个位置
3.public Object getFirst():获取第一个位置的元素
4.public Object getLast():获取最后一个位置的元素
5.public Object removeFirst():删除第一个位置的元素
6.public Object removeLast():删除最后一个位置的元素

数组数据结构的优缺点:查找快,增删慢

链表数据结构的优缺点:增删快,查询慢

五、Set接口及其子类的使用

1.Set集合的特点

1.不保证顺序(存入的顺序和取出的顺序是不一样的)
2.元素唯一
3.无索引

常见的成员方法:和Collection类似

2.Set集合的遍历

1.转数组遍历

2.迭代器遍历

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Demo01 {
    public static void main(String[] args) {
        Set s = new TreeSet<>();
        s.add("e");
        s.add("f");
        s.add("b");
        s.add("a");
        s.add("c");
        s.add("d");
        s.add("z");
        s.add("h");
        Iterator it=s.iterator();
        while (it.hasNext()){
            String ss=it.next();
            System.out.println(ss);
        }
    }
}

 3.Set子类TreeSet的使用

TreeSet集合的特点:

1.不保证顺序(存入的顺序和取出的顺序是不一样的)
2.元素唯一
3.无索引
4.可以自动排序(由小到大)插入是按字典序排序的

注意事项:如果插入的是自定义对象,需要让类实现Comparable接口并且要重写compareTo方法

TreeSet底层的数据结构:红黑树

TreeSet常用成员方法:和Set差不多。

TreeSet的使用(插入自定义类对象):

//创建集合容器
		TreeSet ts = new TreeSet();
		//添加元素
		ts.add(new Pig("tom", 18));
		ts.add(new Pig("jerry", 19));
		ts.add(new Pig("tony", 20));
		System.out.println(ts);//运行报错:类型转换异常

注意:如果我们想要使用TreeSet来存储自定义对象的话,要满足两个条件之一才可以正常运行

条件1,自然排序

什么是自然排序:

1.自定义类,实现Comparable接口
2.重写抽象方法compareTo()
3.在compareTo()方法中写比较规
返回值为0:集合中的元素只有一个
返回值为正数:集合中的元素是正序
返回值为负数:集合中的元素是倒数

举例:

import java.util.TreeSet;
public class Demo01 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();//创建集合对象
        //向集合中存储自定义对象
        ts.add(new Pig("Tom", 14));
        ts.add(new Pig("jerry",15));
        ts.add(new Pig("Michael",12));
        //遍历集合并输出
        for(Pig p:ts){
            System.out.println("ts1:"+p.getName()+"  "+p.getAge());
        }
    }
}
class Pig implements Comparable{
    private String name;
    private int age;
    public Pig(){
    }
    public Pig(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int compareTo(Object o) {
        return -1;
    }
}

 练习:按照年龄小到大进行排序Compare中写法

public int compareTo(Object o) {
        Pig p=(Pig)o;
        int i=this.age-p.age;
        return i;
    }

练习:按照对象的年龄由小到大进行排序,如果年龄相同,再根据姓名字典顺序比较,如果
姓名也相同,就去重?

 public int compareTo(Object o) {
        Pig p=(Pig)o;
        int i=this.age-p.age;
        return i==0?p.name.compareTo(this.name):i;
    }

条件2:比较器Comparator

如何实现比较器?
1.自定义类
2.创建TreeSet集合对象,在构造方法中传递Comparator的对象
3.重写compare()方法
4.在compare()中写比较规则
返回值为0:集合中的元素只有一个
返回值为正数:集合中的元素是正序
返回值为负数:集合中的元素是倒数

TreeSet ts = new TreeSet(new Comparator(){
            @Override
            public int compare(Pig o1, Pig o2) {
                return 0;
            }
        });//创建集合对象

排序方法和Comparable类似。

 4.Set子类HashSet的使用
特点:
1.无序的
2.元素唯一的(存储自定义对象时,需要在类中重写hashCode()和equals()方法)
3.无索引    
数据结构:哈希表  
常见的方法?
和Set方法是一样的

遍历的方式?
方式一:转数组
方式二:迭代器
方式三:增强for

去重重写方法:

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Pig)) return false;
        Pig pig = (Pig) o;
        return age == pig.age &&
                name.equals(pig.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

 4.Set子类linkedHashSet的使用

特点:
1.有序的
2.元素唯一的
3.无索引

底层采用的数据结构:哈希表+链表

其他与HashSet类似。

六、Map集合的使用

1.Map接口

特点:
1.无序的
2.无索引
3.元素唯一的 键唯一 值可以重复
4.双列的集合框架

常见的成员方法:

1.V put(K key,V value):1.添加元素 2.修改,返回被修改前的值
2.V remove(Object key):根据键来删除元素,返回被删除的元素的值
3.int size():获取集合容器的长度
4.void clear():清空
5.V get(Object key):根据键获取值
6.boolean containsKey(Object key):判断是否包含指定的键的元素
7.boolean containsValue(Object value):判断是否包含指定的值的元素
8.Set keySet():将map集合中的所有的键获取到,扔到Set集合中
9.Collection values():将map集合中的所有的值后去到,扔到Collection集合
10.Set> entrySet():将键值对对象扔到Set集合中

Map集合的遍历(通过键获取值)

import java.util.Set;
import java.util.TreeMap;

public class Demo01 {
    public static void main(String[] args) {
        TreeMap tm=new TreeMap();
        tm.put("dd",11);
        tm.put("aa",11);
        tm.put("bb",11);
        tm.put("cc",11);
        Set k=tm.keySet();
        for(String str:k){
            Integer i=tm.get(str);
            System.out.println(i);
        }
    }
}

通过键值对象来获取键和值

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Demo01 {
    public static void main(String[] args) {
        TreeMap tm=new TreeMap();
        tm.put("dd",11);
        tm.put("aa",11);
        tm.put("bb",11);
        tm.put("cc",11);
        Set> k=tm.entrySet();
        for(Map.Entry entry:k){
            String str=entry.getKey();
            Integer it=entry.getValue();
            System.out.println("Key:"+str+" Value:"+it);
        }
    }
}

2.Map接口子类HashMap使用
特点:
1.无序的
2.无索引
3.元素唯一的 键唯一 值可以重复(自定义对象作为键需要重写equal方法和HashCode方法)
4.双列的
数据结构?哈希表,HashSet底层使用的就是HashMap
常见的方法?和Map集合中的方法是一样的。

练习:HashMap存储自定义对象,对自定义对象去重,自定义对象作为键。

import java.util.*;

public class Demo01 {
    public static void main(String[] args) {
        HashMap tm=new HashMap();
        tm.put(new Person("Tom",14),001);
        tm.put(new Person("Jane",42),002);
        tm.put(new Person("jerry",67),003);
        tm.put(new Person("jerry",67),004);
        Set> k=tm.entrySet();
        for(Map.Entry entry:k){
            Person p=entry.getKey();
            Integer it=entry.getValue();
            System.out.println("Key:"+p.getName()+" "+p.getAge()+" Value:"+it);
        }
    }
}
class Person{
    private String name;
    private int age;
    public Person(){

    }
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }
}

3.Map接口子类TreeMap使用

特点:
1.无序的
2.无索引
3.元素唯一的
键唯一
值可以重复
4.双列的
5.可以排序的(根据键来排序)   
数据结构?
红黑树,TreeSet底层使用的就是TreeMap
常见的方法?和Map集合中的方法是一样的

注意:当键值为自定义对象时,需要满足自然排序或者时比较器。

七、泛型编程

1.什么是泛型

泛型即参数化类型,使用泛型一般都会与集合有关。

2.泛型的作用

运用泛型可以创建类型安全更好的集合,让许多问题尽可能在编译时期就能抓到。

没有泛型:集合中以对象的引用形式存储,拿出时都是Object类型的引用。

使用泛型:例如ArrayList仅有Fish对象能以引用形式加入到ArrayList中。不能把非Fish放进ArrayList中,取出来也是Fish的引用。

public class Demo01 {
    public static void main(String[] args) {
        ArrayList s = new ArrayList();
        s.add("aaa");
        s.add("bbb");
        s.add("ccc");
        String[] ss=new String[3];
        s.toArray(ss);
        System.out.println(ss[0]);
        System.out.println(ss[1]);
        System.out.println(ss[2]);
    }
}

 泛型的注意事项:

1.泛型里面不能写基本数据类型
2.前面的<>和后面的<>里的数据类型要匹配
3.在jdk新特性,后面<>可以省略不写了
ArrayList al = new ArrayList();
ArrayList al = new ArrayList<>();
ArrayList al = new ArrayList();

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3992799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存