一、Set
set用于存储无序的、不重复的元素。set是接口,不能被实例化,其子类HashSet和TreeSet可以被实例化。
(一)HashSet
Hash即哈希,是一种散列函数,不可逆的单向映射,用于将任意长度的输入映射成一个较短的定长哈希值的输出,该输出也叫散列值。
HashSet是Set集合的实现类。用于存储不重复、无序的元素,存储元素的顺序是哈希值(输入的顺序和输出的不同,加入后也不会排序)。
1.HashSet集合的创建:
Set<String> objects = new HashSet<>();
//前面的set可以换成hashet,因为hashset本身可以被实例化。
//后面的hashset不能被换成set,因为set不能被实例化。
若将字符串切割并存入hashset中:
String a = sc.nextLine();
String[] b = a.split(",");
Set<String> objects = new HashSet<>();
for(int i = 0;i<b.length;i++){
objects.add(b[i]);
}
2.HashSet的常用方法
add() | 往集合中添加元素 |
contains() | 判断集合中是否存在某元素 |
remove() | 从集合中删除指定的元素 |
clear() | 清除集合中所有元素 |
size() | 获取集合中元素个数 |
isEmpty() | 判断集合元素是否为空 |
Iterator() | 返回元素的迭代器 |
3.遍历集合所有元素:
import java.util.*;
Iterator<String> iterator = objects.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
/**输出:123
456
...*/
//若为直接输出整个集合,则直接打印集合即可:
System.out.print(objects);
(二)TreeSet
1.TreeSet集合的创建:
Set<String> set = new TreeSet<>();
若将字符串切割并存入Treeset中:
String a = sc.nextLine();
String[] b = a.split(",");
Set<String> set = new TreeSet<>();
for(int i = 0; i<b.length;i++){
set.add(b[i]);
}
2.TreeSet的有序性:
TreeSet 集合是 Set 集合的实现类,因此它也具有元素唯一性和无序性,它的底层数据结构是 TreeMap 树结构。
它既是无序的,又是有序的。无序指的是存储元素的顺序和输出顺序不同,但加入后会排序;有序指的是遍历集合时,输出的所有元素是有序的。
TreeSet比HashSet耗时更长(需对加入的元素排序)。
添加元素到 TreeSet 集合时,TreeSet 集合会调用元素的 compareTo() 方法来比较元素之间的大小关系,并将集合元素按升序排列,这就是它的有序性,下表展示了 TreeSet 集合对各种数据类型的默认排序规则:
元素类型 | 排序方式 |
---|---|
数值类型 | 按数值大小 |
Character类型 | 按字符的 unicode 值来进行比较 |
Boolean类型 | true 大于 false |
String类型 | 按字符串中字符的 unicode 值进行比较 |
Date、Time类型 | 后边的时间、日期比前面的时间、日期大 |
另外,TreeSet的常用方法和使用迭代器遍历集合元素的方法和HashSet完全相同。
二、List
List是一个有序集合,元素按顺序排列且可以重复。可以通过索引来访问、遍历元素。
(一)ArrayList
ArrayList是List集合的实现类,它的底层数据结构是数组,因此它查询快、增删慢。
ArrayList加入的元素输出时保持输入的顺序。
1.ArrayList集合的创建:
List list=new ArrayList<String>();
若将字符串切割并存入ArrayList中:
String a = sc.nextLine();
String[] b = a.split(" ");
List<String> list = new ArrayList<>();
for(int i = 0;i<b.length;i++){
list.add(b[i]);
}
2.ArrayList的常用方法:
(1)增
list.add("list");//在集合末尾添加元素
list.add(1,"list");//在指定位置添加元素
(2)删
list.remove(0);//删除指定索引的元素
list.remove("list");//删除指定元素
(3)改
list.set(1,"list");//修改索引位置的元素
(4)查
list.get(1);//获取索引处的元素
3.遍历集合所有元素:
(1)使用迭代器遍历:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
(2)使用foreach遍历:
for(String s:list){
System.out.println(s);
}
(3)使用size()方法获取集合长度,用for循环遍历集合:
for(int x=0;x<list.size();x++){
System.out.println(list.get(x));
}
若直接输出整个集合,则直接打印list即可:
System.out.println(list);
(二)LinkedList
LinkedList是List集合的实现类,它的底层数据结构是链表,因此它查询慢、增删慢。
1.LinkedList集合的创建:
List<String> strings = new LinkedList<>();
//前面的List可换成LinkedList
若将字符串切割并存入LinkedList中:
String a = sc.nextLine();
String[] b = a.split(",");
LinkedList<String> list =new LinkedList<>();
for(int i = 0;i<b.length;i++){
list.add(b[i]);
}
2.LinkedList集合的方法:
LinkedList集合的增删改查方法和ArrayList一样,以下为它特有的方法:
方法名 | 说明 |
---|---|
addFirst(Object obj) | 在集合第一位添加一个元素 |
addLast(Object obj) | 在集合最后一位添加一个元素 |
getFirst() | 得到集合第一位的元素 |
getLast() | 得到集合的最后一位元素 |
removeFirst() | 删除集合的第一个元素 |
removeLast() | 删除集合的最后一个元素 |
三、Map
Map是一个从关键字到值的映射对象,Map中不能有重复的关键字,每个关键字最多能够映射到一个值。Map是无序的且关键字不能重复。
(一) HashMap
HashMap是map接口的实现类,它存储的内容是键值对映射,其中key、value都可以为null。
HashMap是无序的,即被存入到HashMap中的元素,在遍历时,其输出是无序的。
1.创建HashMap集合:
Map<String, Integer> hashMap = new HashMap<>();
//String、integer分别代表key和value的数据类型
若将有两个符号的字符串切割并分别存入HashMap的key和value中:
//例如:字符串为:粉蒸肉:50,红烧鱼:50,小炒牛肉:75,手撕包菜:20,蒜蓉虾:100
String a = sc.nextLine();
String[] b = a.split(",");//先按“,”将字符串切割成单个key-value对
// 创建 HashMap 集合,key为菜名,value为价格
Map<String, String> hashMap = new HashMap<>();
for(int i = 0;i<b.length;i++){
String[] key = b[i].split(":");//对于每个key-value对,用“:”切割,并将值存入key
hashMap.put(key[0], key[1]);
}
2.HashMap集合常用方法:
方法名 | 方法说明 |
---|---|
put()方法 | 往集合中添加元素,key 值不可重复,重复时会覆盖之前的 value 值 |
size()方法 | 返回集合长度 |
get(key)方法 | 获取对应 key 值的 value 值 |
clear()方法 | 清除集合中的所有元素 |
values()方法 | 返回一个新集合,获取集合中所有元素的 values |
keySet()方法 | 返回一个新集合,获取集合中所有元素的 key |
remove()方法 | 根据 key 或者 key-value 去除集合中元素,并分别返回 value 值和 Boolean 值 |
iterator()方法 | 返回一个迭代器对象 |
entrySet()方法 | 将 Map 集合每个 key-value 转换为一个 Entry 对象,并返回由所有的 Entry 对象组成的 Set 集合 |
containsKey() | 判断集合中是否含右指定的 key 值 |
3.HashMap的遍历:
(1)通过keyset遍历:
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
(2)通过entrySet和迭代器遍历:
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
(3)通过entrySet和增强for循环遍历:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
(二)TreeMap
TreeMap是Map接口的实现类,它存储的元素是键值对映射,其key值不允许为null,在添加、删除元素上,TreeMap要比HashMap性能差。
TreeMap既是无序的,又是有序的。无序是指存储元素顺序和输出顺序不同,有序指的是TreeMap会默认对元素的键进行自然排序。
1.TreeMap集合的创建:
Map<String, Integer> map = new TreeMap<>();
将有两个符号的字符串切割并分别存入TreeMap的key和value中:
String a = sc.next();
String[] b = a.split(",|:");//|用于隔开两符号,表示字符串按这两个符号切割
for(int i = 0;i<b.length;i+=2){
map.put(b[i],b[i+1]);
}
2.TreeMap常见方法:
TreeMap集合增删改查的相关方法和HashMap是一样的,另外,还有以下特有方法:
方法名 | 方法说明 |
---|---|
ceilingEntry(key)方法 | 返回集合中大于或等于且最接近给定 key 值的元素,如果不存在这样的键值对,则返回 null |
ceilingKey(key) | 返回集合中大于或等于且最接近给定 key 值的键值 |
descendingKeySet() | 逆序返回集合的全部 Key |
firstEntry() | 返回集合中最小 Key 的元素 |
floorEntry(key) | 返回集合中小于或等于且最接近给定 key 值的元素,如果不存在这样的键值对,则返回 null |
headMap(key) | 返回所有小于给定 key 的元素 |
higherEntry(key) | 返回所有大于给定 key 的元素 |
lastEntry() | 返回 key 最大的元素 |
pollFirstEntry() | 删除集合中最小 Key 的元素 |