Java教程

11Java进阶-集合

本文主要是介绍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<T>接口需要实现int compareTo(T t)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。

7.外部比较器:Comparator接口

实现Comparable<T>接口需要实现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中元素个数。

 

这篇关于11Java进阶-集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!