集合的区别、适用场景以及如何排序(List,Map,Set)

作为一个稀有的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"}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值