Java集合框架
1 集合框架
集合框架:
- Collection:存储单元素集合
- Set
- HashSet
- TreeSet
- LinkedHashSet
- List
- ArrayList
- LinkedList
- Vector
- Queue
- Deque
- Set
- Map:存储键值对元素集合
- HashMap
- TreeMap
- LinkedHashMap
2 存储单元素的集合:Set
Set的功能:
- 不允许存入重复元素
HashSet:
- 将元素存储在哈希表中(表现最佳的Set的实现)
- 不保证迭代顺序
TreeSet:
- 将元素存储在红黑树中
- 按元素的值进行排序
- 存取速度比HashSet慢的多
LinkedHashSet:
- 带有链表的哈希表
- 元素具有顺序(根据插入顺序排序)(提供HashSet不具有的功能,但付出一些性能代价)
2.1 Set的使用实例
例1,查找String数组中有多少个不重复的数组元素,版本1:
import java.util.*;
import java.util.stream.*;
class FindDups {
public static void main(String[] args) {
String[] s = {"I", "love", "you", "I"};
Set<String> distinctWords = Arrays.asList(s).stream()
.collect(Collectors.toSet());
System.out.println(distinctWords.size()+
" distinct words: " +
distinctWords);
}
}
- 将数组转成List
- 将List转换成stream
- 将stream使用Collectors.toSet()收集起来
版本2:
import java.util.*;
class FindDups {
public static void main(String[] args) {
String[] strings = {"I", "love", "you", "love"};
Set<String> s = new HashSet<String>();
for (String a : strings)
s.add(a);
System.out.println(s.size() + " distinct words: " + s);
}
}
例2,查找数组字符串中非重复和重复的元素:
import java.util.*;
class FindDups2 {
public static void main(String[] args) {
Set<String> uniques = new HashSet<String>();
Set<String> dups = new HashSet<String>();
String[] strings = {"I", "love", "you", "love"};
for (String a : strings)
if (!uniques.add(a))
dups.add(a);
// Destructive set-difference
uniques.removeAll(dups);
System.out.println("Unique words: " + uniques);
System.out.println("Duplicate words: " + dups);
}
}
- 定义两个HashSet,uniques、dups
- 遍历数组,将元素往uniques放,放不进就放dups
- 输出两个Set
3 存储单元素的集合:List
List的功能:
- 按位置访问元素
- 搜索元素返回下标
- 可迭代:利用列表有顺序的性质,listIterator方法提供该功能
- 范围视图:提供任意范围视图,subList方法提供
ArrayList:
- 通常是表现最佳的List的实现类
- 底层通过动态数组实现
LinkedList:
- 有时候表现更佳
3.1 ArrayList常用操作
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class ArrayListTest {
public static void main(String[] args){
//创建ArrayList<String> list
List<String> list = new ArrayList<String>();
//添加[Hello,world,!]
list.add("Hello");
list.add("World");
list.add(2,"!");
System.out.println("list当前内容:" + list);
//修改
list.set(1,"Dear");
System.out.println("修改后list当前内容:" + list);
//获取功能:
String element = list.get(0);
System.out.println("索引0处元素内容:" + element);
//迭代器遍历集合,还有一个迭代器ListIterator,主要区别是后者可以在遍历时插入对象
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String string = iterator.next();
System.out.print(string + " ");
}
System.out.println();
//foreach循环迭代集合:
for(String str:list){
System.out.print(str + " ");
}
System.out.println();
//判断功能:
System.out.println("集合是否为空:" + list.isEmpty());
System.out.println("集合是否包含Dear:" + list.contains("Dear"));
//长度功能:
int size = list.size();
//把集合转换成数组:
String[] strArray = list.toArray(new String[]{});
//删除功能:
list.remove(0);
list.remove("world");
list.clear();
System.out.println("clear()后,ArrayList当前容量:"+list.size());
}
}
4 存储键值对元素集合Map
Map的功能:
- 存储键值对对象
- 不能存储重复键
HashMap, TreeMap, LinkedHashMap表现与Set中对应类相似
4.1 Map实例
统计字符串数组中字符串重复的情况
import java.util.*;
class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
String[] strings = {"hello", "world", "hello"};
// Initialize frequency table from command line
for (String a : strings) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
- 设置一个map<String, Integer>
- 遍历字符串数组:
- 如果字符串不在map的key中,则将其值设为1,否则其值+1
- 将map打印输出