Collection : 无序可重复的单个对象`
Set : 无序不可重复
HashSet : 使用哈希算法实现的Set集合
基于数组,使用哈希算法让对象散列在数组中, 所以也称为散列表.
性能总是最好, 唯一的缺点是内存要求高.
适用场景 : 只要是内存大, 肯定选它.
内部使用的是一个HashMap…
TreeSet : 使用二叉搜索树实现的Set集合
二叉树的特点也是由Node对象组成
在java中的Tree使用的就是红黑树(自动平衡二叉搜索树), 保证它的最好的搜索性能
插入和删除速度慢, 原因是每个结点的插入都要和已有的大量元素进行比较
检索速度极快, 因为它是基于二分搜索
对内存要求低.
应用场景 : 主要主于搜索, 多用于数据的索引.
List : 有序可重复
ArrayList : 基于数组实现的List集合, 扩容1.5倍
数组的特点是内存连续, 是一个严格的线性结构
末端插入和删除数据最快, 数组[下标], 下标由计数器来决定
非末端插入和删除数据最慢, 因为会有大量的元素的移动.
对内存要求高, 内存必须连续.
检索速度尚可, 一般.
应用场景 : 保存归档的数据, 不需要频繁插入和删除, 只是检索…
LinkedList : 基于链表实现的List集合,
链表的特点是它是由一个一个的Node对象, Node的特殊之处在于内部有指针
任意位置的插入和删除都是极快的, 因为只需要修改几个指针
对内存要求低, 不要求内存连续.
检索速度最慢, 需要遍历节点时根据指针再去定位下一个结点.
应用场景 : 需要频繁的插入和删除操作的场景.
相关练习:
给定一个字符串, 统计每个字符出现的次数
方法一:
public static void main(String[] args){
String str = “asdfggfdfgf”;
int[] count = new int[26]; //用来存储小写字母a-z出现的次数。
for(int i=0; i<str.length(); i++){
char tmp = str.charAt(i); //依次取出每个字母
int index = tmp - 97; //利用ascii码表,最小结果是0.
count[index] = count[index] + 1;
}
//循环打印每个字母出现次数
for(int j=0; j<count.length; j++){
if(count[j]!=0)
System.out.println("字母"+(char)(j+97)+"出现次数:"+count[j]);
}
}
方法二:
public static void main(String[] args){
String string = “erge5g1651651egr按了什么地方离开vs15qef”;
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
Integer count = map.get(ch);
if (count == null) { // 如果count为null, 说明没有put过,
count = 0; // count为0
}
map.put(ch, count + 1); // 如果没有put过, 直接put,如果Put过, 刷新老值
}
System.out.println(map);
}
}