我们在学习java的集合时,都知道接口Collection下有2个子接口:
List 是有序的集合
Set 是无顺序的集合
问题一:怎么有序了?
那么List所谓的有序是什么意思呢?初学者可能会有这个误解,就是我每次add进List的元素,它会自动排好序。这其实是不对的。我们看一个例子:
package CollectionTest;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhengchao
*/
public class TestMap {
public static void main(String[] args){
List<Integer> list = new ArrayList();
list.add(1);
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(1);
for(int str:list){
System.out.println(str);
}
}
}
代码很简单,输出结果:
run:
1
3
5
4
2
1
成功构建 (总时间: 0 秒)
发现输出的并没有顺序,
我们说的List有序是指它能保持你插入元素是的顺序,即先插入放在前面。其实List的ArrayList存储的结构类似于数组。它的优点是随机访问某一个index的速度很快,基本就是o(1)的速度,但是ArrayList的add和remove就比较慢了。
我们看下运行时ArrayList的结构:
可以看到ArrayList的元素存储是按照你插入的先后来的。LinkedList与之类似,只不过其内部实现是基于链表结构的,即插入删除很快,但是若是要随机访问一个元素就需要遍历。他们都允许数据重复。
再看看Set的情况:
package CollectionTest;
import java.util.HashSet;
import java.util.Set;
/**
* @author zhengchao
*/
public class TestMap {
public static void main(String[] args){
Set<String> set = new HashSet();
set.add("av");
set.add("bv");
set.add("cv");
set.add("av");
set.add("ev");
set.add("dv");
for(String str:set){
System.out.println(str);
}
}
}
运行结果:
run:
dv
ev
bv
cv
av
成功构建 (总时间: 0 秒)
我们发现Set接口的HashSet并不能保证元素插入时的顺序,并且不能有重复的元素。
问题二:Map和List、Set同级吗?
有些童鞋刚开始时,感觉这三个就是兄弟姐妹嘛,其实不然,我们看看他们的结构体系:
其实Map自己属于一个体系,你想想他的结构:key-value,明显感觉就和Colleciton不是一个‘种群’。
问题三:Map和List可以互相转换吗
转换可能谈不上,但是可以这样用:
package CollectionTest;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
*
* @author zhengchao
*/
public class Map_sort {
public static void main(String[] args){
Map<String,String> map = new HashMap();
map.put("A","@");
map.put("W","@");
map.put("E","@");
map.put("Q","@");
map.put("R","@");
map.put("B","@");
map.put("U","@");
//这样能得到map的key和value,在某些应用中,这很有用
for(Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey()+""+entry.getValue());
}
//如果想对Map集合的元素按照key进行排序怎么办?如下,用Collections.sort方法
List<Map.Entry<String, String>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
@Override
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
return (o1.getKey()).compareTo(o2.getKey());
}
});
System.out.println(list);
}
}
在上面的想对Map集合按照Key来排序的做法,我们使用了Collections.sort的方法。很管用,实际项目中用的也很多。
这里并没有讲Collection和Map的内容完全列出来,我感觉全部列出来会让读者感觉不舒服,的确,掌握几个基本的类的用法,其他的稍微了解,真正需要用时可以去查询官方api文档,我们不是机器,没法记住太多的东西,比如我,2k的记忆内存,记不了几个东东的,其他的都放在硬盘里啦,想用的时候再去读取。