11Java进阶-集合
2021/7/26 14:05:59
本文主要是介绍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进阶-集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-22项目:远程温湿度检测系统
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南