最近看了很多关于Java集合的概念和使用,在这里做个总结。
先放上之前在慕课网看视频学习的一张图,我们最常使用的是ArrayList和HashMap。
1、ArrayList和ListedList的区别和联系(这是很多面试官会问到的一题)
ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁插入和删除操作,因此每次插入和删除都需要移动数组中的元素。
LinkedList的链式线性表的特点为:适合于在链表中间需要频繁进行插入和删除操作。
LinkedList数组线性表的缺点为:随机访问速度较慢。查找一个元素需要从头开始一个一个的找,速度比较慢。
ArrayList和LinkedList都是线程不安全的。
2、线程安全类(线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低):
Vector:比ArrayList多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速率)是优先考虑的。
stack:堆栈类,先进后出
hashtable:就比hashmap多个线程安全,hashtable不允许插入空值,hashmap允许
enumeration:枚举,相当于迭代器
StringBuffer是线程安全,而StringBuilder是线程不安全。
3、List排序
Collections.sort(numList);
无參Sort()方法是使用Comparer.Default比较器来排序的。对于对象Student类,可以实现IComparable接口compareTo方法
public int compareTo(User o) {
int i = this.getAge() - o.getAge();//先按照年龄排序
if(i == 0){
return this.score - o.getScore();//如果年龄相等了再用分数进行排序
}
return i;
}
4、List集合
List list = new ArrayList();
(1)第一种遍历方式:for遍历
for(Object li : list){
System.out.println(li.toString);
}
(2)第二种遍历方式:ListIterator迭代遍历
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
5、Map集合
Map<Integer,String> map = new HashMap<Integer,String>();
//第一种:通过Map.keySet遍历key和value
for(Integer in:map.keySet()){
//map.keySet()返回的是所有key的值
String str = map.get(in);//得到每个key多对用value的值
}
//第二种:通过Map.entrySet遍历key和value
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//Map.entry<Integer,String> 映射项(键-值对) 有几个方法
//entry.getKey() ;entry.getValue(); entry.setValue();
//map.entrySet() 返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey() + " and value= "+entry.getValue());
}
//第三种:通过Map.entrySet使用iterator遍历key和value
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种:通过Map.values()遍历所有的value,但不能遍历key
for (String v : map.values()) {
System.out.println("value= " + v);
}