作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)
1.层级关系图
Map是不在Collection下的,是单独的一个体系。
1.有序和无序
ArrayList,LinkedList,LinkedHashMap,LinkedHashSet是插入有序的,TreeMap和TreeSet是逻辑有序,HashSet和HashMap是无序的。
插入有序:按照放入集合的先后顺序排序,不是按照大小
逻辑有序:按照大小排序
以Set举例:
public static void main(String[] args) {
HashSet set1 = new HashSet();
set1.add("hhh");
set1.add("qqq");
set1.add("www");
set1.add("eee");
set1.add("rrr");
set1.add("ttt");
System.out.println(JSONObject.toJSONString(set1));
LinkedHashSet set2 = new LinkedHashSet();
set2.add("hhh");
set2.add("qqq");
set2.add("www");
set2.add("eee");
set2.add("rrr");
set2.add("ttt");
System.out.println(JSONObject.toJSONString(set2));
TreeSet<String> set3 = new TreeSet<>();
set3.add("hhh");
set3.add("qqq");
set3.add("www");
set3.add("eee");
set3.add("rrr");
set3.add("ttt");
System.out.println(JSONObject.toJSONString(set3));
}
结果:
//无序
["qqq","rrr","eee","ttt","www","hhh"]
//插入有序
["hhh","qqq","www","eee","rrr","ttt"]
//逻辑有序
["eee","hhh","qqq","rrr","ttt","www"]
2.线程安全性
ArrayList,LinkedList,HashMap,LinkedHashMap,TreeMap,HashSet,LinkedHashSet,TreeSet都是线程不安全的
3.适用场景
集合 | 描述 |
---|---|
ArrayList | 底层是数组,适用于查询多,添加和删除少的场景 |
LinkedList | 底层是链表,适用于查询少,添加和删除多的场景 |
HashMap | 底层是数组+链表,存放的是key-value键值对 |
LinkedHashMap | 底层是数组+链表,存放的是key-value键值对 |
TreeMap | 底层是数组+链表,存放的是key-value键值对 |
HashSet | 底层是维护的HashMap,去重的数据场景 |
LinkedHashSet | 底层是维护的LinkedHashMap,去重插入有序的数据场景 |
TreeSet | 底层是维护的NavigableMap,去重逻辑有序的数据场景 |
4.排序
1.List的排序 :Collections.sort()
ArrayList list = new ArrayList();
list.add("hhh");
list.add("qqq");
list.add("www");
list.add("eee");
list.add("rrr");
list.add("ttt");
//默认按照从小到大
Collections.sort(list);
System.out.println(JSONObject.toJSONString(list));
//如果需要从大到小排序,反转集合即可
Collections.reverse(list);
System.out.println(JSONObject.toJSONString(list));
结果:
["eee","hhh","qqq","rrr","ttt","www"]
["www","ttt","rrr","qqq","hhh","eee"]
如果List中存放的是对象,需要按照对象的某个属性排序
List<User> listUser = new ArrayList<>();
User user1 = new User("李四",29);
User user2 = new User("张三",18);
User user3 = new User("王五",30);
User user4 = new User("李天一",40);
listUser.add(user1);
listUser.add(user2);
listUser.add(user3);
listUser.add(user4);
Collections.sort(listUser, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
if(o1.getAge()>o2.getAge()){
return 1;
}
if(o1.getAge()<o2.getAge()){
return -1;
}
return 0;
}
});
System.out.println(listUser);
结果:
[User(name=张三, age=18), User(name=李四, age=29), User(name=王五, age=30), User(name=李天一, age=40)]
2.TreeMap和TreeSet都是按大小排序的,因为它们的构造器可以使用Comparator比较器
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
默认是按照从小打大排序
TreeSet<String> set3 = new TreeSet<>();
set3.add("hhh");
set3.add("qqq");
set3.add("www");
set3.add("eee");
set3.add("rrr");
set3.add("ttt");
System.out.println(JSONObject.toJSONString(set3));//["eee","hhh","qqq","rrr","ttt","www"]
构造方法使用Comparator,在构造器中可以改变排序的方式
TreeSet<String> set3 = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.compareTo(o2)<0){
//小于时返回1,则按照从大到小排序
return 1;
}
if(o1.compareTo(o2)>0){
return -1;
}
return 0;
}
});
set3.add("hhh");
set3.add("qqq");
set3.add("www");
set3.add("eee");
set3.add("rrr");
set3.add("ttt");
System.out.println(JSONObject.toJSONString(set3));
//["www","ttt","rrr","qqq","hhh","eee"]
3.set和map的排序,把集合放入list,用Collections.sort()排序
HashMap<String,String> map = new HashMap();
map.put("hhh","hhh");
map.put("qqq","qqq");
map.put("www","www");
map.put("eee","eee");
map.put("rrr","rrr");
map.put("ttt","ttt");
List<Map.Entry<String,String>> list = new ArrayList<>(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) {
if (o1.getValue().compareTo(o2.getValue()) > 0) {
return 1;
}
if(o1.getValue().compareTo(o2.getValue())<0){
return -1;
}
return 0;
}
});
System.out.println(JSONObject.toJSONString(list));
//[{"eee":"eee"},{"hhh":"hhh"},{"qqq":"qqq"},{"rrr":"rrr"},{"ttt":"ttt"},{"www":"www"}]