集合框架和泛型

本文详细介绍了Java集合框架的各种接口及其实现类,包括Collection、List、Set和Map接口的特点与用法,以及ArrayList、LinkedList、HashSet和HashMap等常用类的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中

各接口的特点

Collection接口存储一组不唯一,无序的对象

LIst接口存储一组不唯一,有序(插入顺序)的对象

Set接口存储一组唯一,无序的对象

Map接口存储一组键值对象,提供key到value的映射,一对一。

Collection接口常用方法

方法说明
boolean add(Object o)从末尾添加元素o
boolean addAll(Collection c)把一个集合中的所有元素添加到集合
boolean remove(Object o)删除指定元素
boolean removeAll(Collection c)从集合中删除一个指定的集合元素,该元素是两个集合的交集部分
void clear()删除集合中的所有元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean containsAll(Collection c)判断集合中是否存在指定的一个集合中的元素,当前集合元素调用equals方法,与集合c挨个比较
Iterator iterator()实现遍历功能,获取集合中的每一个元素
boolean isEmpty()判断集合是否为空
int size()获取集合中元素的个数
boolean retainAll(Collection c)

把当前集合与集合c的共有元素存入当前元素中,并且不影响集合c

注意:上述两个contains方法,如果是自定义的对象,则需要在对象中重写Object的equals方法,否则比较的是地址值。重写后比较属性值。

List接口的实现类

ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

LinkedList采用链表存储方式,插入、删除元素时效率比较高

 ArrayList集合类常用方法

方法说明
boolean add(Object o)在列表末尾添加元素o,起始索引位置从0开始
void add(int index,Object o)在指定索引位置添加元素o,索引位置必须介于0和列表中元素个数之间
int size()返回列表中元素的个数
Object get(int index)返回指定索引位置的元素,取出的元素时Object类型的,使用之前需要强制类型转换
void set(int index,Object obj)将index索引位置的元素替换为obj元素,覆盖。
boolean contains(Object o)判断列表中是否存在指定元素o
int indexOf(Object obj)获取列表中指定元素obj的索引位置
boolean remove(Object o)从列表中删除元素o
Object remove(int index)

从列表中删除指定索引位置的元素,索引起始位置从0开始

LinkedList独有方法

方法说明
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表中第一个元素
Object getLast()返回列表中的最后一个元素
Object removeFirst()删除并返回当前集合的首位元素
Object removeLast()删除并返回当前集合的末尾元素

Set接口的常用实现类

Set接口描述的是一种比较简单的一种集合,集合中的对象并不按特定的方式排序,并且不能保存重复的对象。

HashSetSet接口的常用实现类。而Set接口继承了Collection接口,同时没有添加新的方法,所以在使用上与List接口的实现类使用方式一致。

但是,要注意的是Set接口不存在get方法,也就是没有List接口中通过索引取值的方法。

没有get方法Set集合要怎么遍历输出呢?

方法1:增强for循环

方法2:通过迭代器Iterator实现遍历

获取Iterator :Collection 接口的iterator()方法

Iterator的方法:

boolean hasNext(): 判断是否存在另一个可访问的元素

Object next(): 返回要访问的下一个元素

Map接口

key使用Set存储,不允许重复;value使用Collection存储Map对象所对应的类必须重写hashCode() 和equals( )

常用实现类,HashMap 、 TreeMap 、LinkedHashMap 

map接口的常用方法

方法说明
Object put(Object key,Object value)

将相互关联的一个key与一个value放入该集合中,如果此接口中已经包含了key对应的value,新的value值将对旧value覆盖

Object remove(Object key)从当前集合中移除与指定key相关的映射值value,并返回该key值关联的旧value值,如果旧value没有关联,就返回null
Object get(Object key)获得与key值相对应的value值,没有则返回null
boolean containsKey(Object key)判断指定key值在本集合中存不存在
boolean containsValue(Object value)判断集合中是否存在value
boolean isEmpty()判断集合是否为空
void clear()清除集合中的所有元素
int size()返回集合中元素的数量
Set keySet()遍历集合中的key值(获取集合中所有key值的集合)
Collection values()

获取所有value的集合

这个地方返回的是collection接口,使用的时候需要实例化。最简单的方式是利用list的构造函数实现,List  =ArrayList(Collection<? extends E>) 

遍历Map集合

方法1:先遍历key,再通过key值来遍历value值(增强for,Iterator)

方法2:遍历key-value对,使用entrySet()(增强for,Iterator)

Set set = hashMap.entrySet();

for(Object key:set){

Map.Entry entry = (Map.Entry) key;

System.out.println(entry.getKey()+"-"+entry.getValue());

 由于集合中啥类型都能放,我们在获取集合中存放元素时,最后输出类型默认值为Object,无法确定具体类型,在我们需要强制类型转换时,容易出现异常问题。所以我们需要引入一个新的概念,泛型,它在集合中的体现"<E>,<K,V>"用来表示泛型集合中的元素类型,泛型集合中的数据不再转换为Object,相较之前的集合,就多了一个指定元素类型外,泛型集合和集合没有区别,用法完全一致。JDK5.0使用泛型改写了集合框架中的所有接口和类。

Collections算法类

Java集合框架将针对不同数据结构算法的实现都保存在工具类中

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

Collections和Collection不同,前者是集合的操作类,后者是集合接口

Collections提供的常用静态方法

  • sort():排序
  • binarySearch():查找
  • max()\min():查找最大\最小值
  • reverse():反转元素顺序

实现一个类的对象之间比较大小(单纯比较是判断地址值,需要比较其中某个成员变量时要实现以下方法)

  • 该类要实现Comparable接口
  • 重写compareTo()方法
  • 该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
public class Student implements Comparable<Student>{
public static void main(String[] args) {
            Student s1 = new Student(1, "zhangsan", 18);
            Student s2 = new Student(1, "zhangsan", 18);
            System.out.println(s1.compareTo(s2));
        }
//输出0,表示两个对象的id相等;输出-1表示s2.id<s1.id;输出1表示s2.id>s1.id
//输出结果:0
    private int id;
    private String name;
    private int age;
    private Genders gender;

    public Student() {
    }

    public Genders getGender() {
        return gender;
    }

    public void setGender(Genders gender) {
        this.gender = gender;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        if(this.id==o.id){
            return 0;
        }else if(o.id<this.id){
            return 1;
        }else{
            return -1;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值