List、Set、Map
Collection集合:
–Collection
----List(有序,带有索引,可重复)
------ArrayList:底层数据结构为数组,优点–>查询快,根据元素下标索引进行查询。缺点增删慢,增删时需要移动大量元素。线程不安全,效率高。
------LinkedList:底层数据结构为链表,优点–>增删快,根据元素间相互引用的节点进行增删。缺点查询慢,不像ArrayList中的元素拥有索引。线程不安全,效率高。
------Vector:底层数据结构为数组,查询快,增删慢。线程安全,但效率低,现有使用率不高。
----Set(无索引,唯一)
--------HashSet:底层数据结构为哈希表(哈希表查询速度快)。通过hashCode()方法和equals()方法两次比较来保证所含元素的唯一性。(此类的元素无序且唯一, 允许null元素)
--------LinkedHashSet:底层数据结构为链表和哈希表。(元素按照FIFO方式插入,有序且唯一)。通过链表保证元素有序,通过哈希表保证元素唯一性。
--------TreeSet:底层数据结构为红黑树(元素有序且 唯一)。通过自然排序和比较器排序来保证元素的有序,根据比较返回值是否为0来决定元素是否唯一。
Map集合:
–Map
Map集合的特点:1.Map集合是一个双列集合,一个元素可以包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key是唯一的,value是可以重复的。‘
4.Map集合中的key和value是一一对应的。
----HashMap:1.HashMap集合底层为哈希表,查询的速度特别快,
key是唯一的,允许存储null键和null值
(JDK1.8之前:数组+单向链表)
(JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8采用红黑树,提高查询效率)
2.HashMap集合是一个无序的集合,即存储元素的顺序与取出时的顺序有可能不一致
----LinkedHashMap:
1.LinkedHashMap集合底层是哈希表+链表(链表是保证迭代的顺序)
2.LinkedHashMap集合是一个有序集合,即存储元素的顺序与取出时的顺序一致
----HashTable:集合底层同样为哈希表,相比较HashMap
集合中不允许存在空值(任何非null对象都可以用作键或值)
单线程,线程安全,同步,速度慢
----TreeMap:有序
public class CountString {
/*
计算一个字符串中每个字符出现的次数
1.用Scanner获取用户键盘输入的字符串
2.创建Map集合,key是字符串中的字符,value是字符的个数
3.遍历字符串获取每一个字符
4.使用获取到的字符,去Map集合中判断key值是否存在,
key存在
则通过,并将value++,同时将新的value存储到Map集合中去。
key不存在
则将当前key值储存,并将value赋值为1。
5.遍历Map集合,输出结果
*/
public static void main(String[] args) {
//1.使用Scanner获取用户输入的字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一串字符串:");
String str = sc.next();
//2.创建一个map集合来存储元素
HashMap<Character, Integer> map = new HashMap<>();
//3.利用增强for循环遍历并获取字符串,同时进行判断
for (char c:str.toCharArray()) {
//如果map集合中存在该字符,则其次数即value++,并重新赋值给value
// 否则将value赋值为1
if (map.containsKey(c)){
Integer value = map.get(c);
value++;
map.put(c,value);
}else {
map.put(c, 1);
}
}
for (char c : map.keySet()) {
Integer value = map.get(c);
System.out.print(c + "=" + value + " ");
}
System.out.println("统计结果为:"+ map);
}
}