11Java进阶-集合

1.集合

为什么要使用集合?

数组是定长的,可拓展性差
数组中经常有空余位置,造成空间的浪费,同时也不能获得实际元素个数
数组中元素是连续存在的,移动元素的效率很低
集合的分类:

Collection:是Iterable接口的子接口,主要有List、Queue、Set子接口
Map:主要有HashMap、TreeMap、HashTable三种实现类。
在这里插入图片描述

在这里插入图片描述

2.Set的方法:

boolean add(Object obj):添加不存在的元素,返回true,添加存在的元素,返回false。

void clear():移除所有元素

boolean contains(Object obj):判断元素是否存在

boolean isEmpty():判空

Iterator iterator():返回当前集合的迭代器

boolean remove(Object obj):移除指定元素

int size():set元素个数

Object[] toArray():转换为Object数组。注意无参方法数组类型不会随着泛型改变而改变。

Object[] toArray(T[] arr):转换为泛型数组。一般用toArray(new T[set.size()])。注意java不会判断类型是否合适,需要自行判断。

3.HashSet如何判断元素存在?

先调用hashcode()判断哈希值是否相等,如果相等,再调用equals()判断是否内容是否相等。

如果泛型类是自定义类型,需要重写hashcode()和equals()。

hashcode 是对象的映射地址,而equals()用于比较两个对象。

4.如何重写hashcode()

String中重写hashcode():

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    @Stable
    private final byte[] value;
    ...
    private int hash; // Default to 0
    ...
    // String类对hashCode()的重写
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];//相当于转换为31进制的整数值
            }
            hash = h;
        }
        return h;
    }
}
public class Vehicle {
    private String name;
    private int oil;
 
public int hashCode() {
        int result = 0;
        result = result * 31 + name.hashCode();
        result = result * 31 + oil;
        return result;
    }
}

为了简单,一般采用按位与的形式:

@Override
public int hashCode() {
    return name.hashCode() & oil;
}

5.TreeSet

TreeSet实现了SortedSet接口和Set接口,可以自动排序,默认升序。TreeSet的泛型类如果是自定义类,需要实现Comparable接口。

6.内部比较器:Comparable接口

实现Comparable接口需要实现int compareTo(T t)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。

7.外部比较器:Comparator接口

实现Comparable接口需要实现int compareTo(T t1,T t2)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。

8.List

List接口是元素有序且可以重复的。

常用方法:

void add(int index,Object o):指定位置插入元素

Object get(int index):获取下标的元素

int indexOf(Object o):获取元素第一次出现的下标

int lastIndexOf(Object o):获取元素最后一次出现的下标

Object remove(int index):删除下标的元素

Object set(int index,Object o):修改下标的元素

实现类:

ArrayList 实现了 List 接口,其底层采用的数据结构是数组。更适合元素访问。
LinkedList,它在存储方式上采用双端链表进行链式存储。更适合修改元素。
LinkedList常用方法:

void addFirst(Object o):链表头插入元素

void addLast(Object o):链表尾插入元素

Object getFirst():返回第一个元素

Object getLast():返回最后一个元素

Object removeFirst():删除第一个元素

Object removeLast():删除最后一个元素

9.Iterator接口

boolean hasNext():是否有下一个可迭代元素

Object next():获取下一个元素

void remove():删除上一个元素。(必须先使用next())

10.泛型

在之前使用集合的时候,装入集合的各种类型的元素都被当作 Object 对待,而非元素自身的类型。因此从集合中取出某个元素时,就需要进行类型转换,这种做法效率低下且容易出错。泛型解决了这个问题。

泛型类型必须是对象类型,不能是基本类型。

11.Collections工具类

void sort(List list):默认升序排序元素。使用内部比较类的compareTo()。

void sort(List list, Comparator c):使用自定义的比较规则排序元素。

void shuffle(List list):打乱元素的顺序

void reverse(List list):反转元素顺序

Object max(Collection coll):获得集合中最大值

Object min(Collection coll):获得集合中最小值

int binarySearch(List list,Object o):二分查找队列元素

int indexOfSubList(List source,List target):如果target是source的一个子集合,那么返回第一次出现的下标,否则返回-1

int lastIndexOfSubList(List source,List target):如果target是source的一个子集合,那么返回最后一次出现的下标,否则返回-1

void copy(List dest,List src):复制队列

void fill(List list,Object o):填充队列

boolean replaceAll(List list,Object old,Object new):替换所有值为old的元素

void swap(List list,int i,int j):交换下标的元素

12.Arrays工具类

Arrays 类是操作数组的工具类,和 Collections 工具类相似,Arrays 类主要有以下功能:

对数组进行排序。
给数组赋值。
比较数组中元素的值是否相等。
进行二分查找。

13.Map接口常用方法

Object put(Object key,Object value):将指定键值对(key 和 value)添加到 Map 集合中,如果此 Map 集合以前包含一个该键 key 的键值对,则用参数 key 和 value 替换旧值。

Object get(Object key):返回指定键 key 所对应的值,如果此 Map 集合中不包含该键 key,则返回 null。

Object remove(Object key):如果存在指定键 key 的键值对,则将该键值对从此 Map 集合中移除。

Set keySet():返回此 Map 集合中包含的键的 Set 集合。

Collection values():返回此 Map 集合中包含的值的 Collection 集合。

boolean containsKey(Object key):如果此 Map 集合包含指定键 key 的键值对,则返回 true。

boolean containsValue(Object key):如果此 Map 集合将一个或多个键 key 对应到指定值,则返回 true。

int size():map中元素个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: comparator是Java的一个接口,用于比较两个对象的大小。它可以用于对集合的元素进行排序,也可以用于自定义排序规则。实现comparator接口需要重写compare方法,该方法返回一个整数值,表示两个对象的大小关系。如果返回负数,则表示第一个对象小于第二个对象;如果返回正数,则表示第一个对象大于第二个对象;如果返回,则表示两个对象相等。comparator接口可以与Java的排序算法一起使用,例如Collections.sort()方法。 ### 回答2: jmu-java-04面向对象进阶--02-接口-comparator讲述了Java的接口以及比较器的使用。接口是一种约束,它规定了某个类必须要实现哪些方法,但不需要具体的实现方式。比较器则是一种接口,它规定了两个对象之间的排序方式。 在Java,接口的定义方式为interface,其的方法默认为public abstract形式。定义接口时,需要注意接口只能继承接口,并且可以有常量,但不能有成员变量。另外,接口所有的方法都没有方法体,必须由实现它的类去具体实现。举例来说,如果我们定义一个接口Animal,可以定义一个方法move(),而实现这个接口的类必须实现move()方法,并且可以自由决定具体的实现方式,如Dog类可以实现为跑步,Bird类可以实现为飞行。 在讨论了接口的使用之后,jmu-java-04面向对象进阶--02-接口-comparator着重介绍了比较器的使用。比较器类似于一个工具箱,可以定义多种比较方式供其他类使用。比较器的核心类是Comparator,其定义的方法为compare(),用于比较两个对象并返回结果(0、1或-1)。比较器可以用于对对象进行排序或查找指定的对象。 在使用比较器时,需要实现Comparator接口,并覆盖compare()方法。比如,我们可以定义一个Person类,并在其实现Comparator接口,然后在compare()方法指定按照年龄从小到大排序。当我们使用Collections.sort()对Person列表进行排序时,就会按照我们定义的比较方式进行排序。 总的来说,jmu-java-04面向对象进阶--02-接口-comparator讲述了Java的接口和比较器的使用,这是Java优秀的编程方式之一,也是开发者必备的基本知识。掌握了接口和比较器的使用,我们就可以更好地实现面向对象编程,并对Java集合框架有更深刻的理解。 ### 回答3: Comparator是Java一个非常重要的接口,它主要用于定义对象之间的比较规则。在Java,比较规则是由比较器来实现的。比较器可以用于排序、查找和其他需要比较的场景。 Comparator接口有一个方法compare(Object o1, Object o2),用于比较两个对象的大小。如果o1大于o2,则该方法返回一个正整数;如果o1小于o2,则该方法返回一个负整数;如果o1等于o2,则该方法返回0。 我们可以使用Comparator接口来实现自定义的比较规则。比如,我们可以定义一个Student类,包含姓名和年龄两个属性,然后实现一个比较器,按照年龄从小到大的顺序对Student对象进行排序。 可以通过使用Collections.sort()方法对Student对象进行排序,提供一个实现Comparator接口的比较器作为参数进行排序。 实现一个比较器还可以实现多种排序方式。例如,按照姓名从小到大排序,实现如下: ``` public class NameComparator implements Comparator<Student> { public int compare(Student s1, Student s2) { return s1.getName().compareTo(s2.getName()); } } ``` 在使用时,我们可以将NameComparator对象作为参数传递给sort()方法,进行姓名排序。 Comparator接口的使用不仅仅局限于对象的比较排序,还可以用于其他需要比较的场景,比如查找、筛选等。例如,我们可以按照年龄筛选出年龄大于20岁的Student对象,并将它们存储在一个新的List,实现如下: ``` List<Student> ageGreaterThan20 = students.stream() .filter(s -> s.getAge() > 20) .sorted(new AgeComparator()) .collect(Collectors.toList()); ``` 以上的代码使用了Java 8的新特性,使用流将年龄大于20岁的Student对象筛选出来,并按照年龄进行排序,最后存储在一个新的List。 总之,Comparator是一个非常重要的接口,在Java有着广泛的应用。掌握Comparator的使用可以帮助我们快速地实现对象比较、排序、筛选等操作,提高我们的编程效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值