集合二

Set

  • 特点:储存的元素无序唯一,是一个抽象的接口,不能直接实例化一个set对象。

  • 定义:public interface Set extends Collection

  • 常见方法:

    • add( ) 向集合中添加元素

    • clear( ) 去掉集合中所有的元素

    • contains( ) 判断集合中是否包含某一个元素

    • isEmpty( ) 判断集合是否为空

    • iterator( ) 主要用于递归集合,返回一个Iterator()对象

    • remove( ) 从集合中去掉特定的对象

    • size( ) 返回集合的大小

  • 迭代方法:foreach,迭代器

  • 迭代器接口:Iterator 用来迭代元素; Iterable 可以作为foreach的目标

    public static void main(String[] args){  
           //Set  
           Set<String> sets=new HashSet<>();  
             
           //添加  
           sets.add("格莱美");  
           sets.add("奥斯卡");  
           sets.add("图灵奖");  
             
           System.out.println(sets.add("图灵奖"));  
           System.out.println(sets);  
             
           System.out.println("迭代元素");  
           for(String str:sets){  
               System.out.println(str);  
           }  
             
           System.out.println("迭代器迭代元素");  
           Iterator<String> it=sets.iterator();  
           while (it.hasNext()){  
               System.out.println(it.next());  
           }  
       }  
    

HashSet

概念

Set集合的一种,首先是无序的,不可重复的;允许存放null值;底层封装HashMap;实现是不同步的,线程不安全。

常用构造: public HashSet() :构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

迭代器功能:public Iterator iterator() 返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。

常用方法

  • boolean add(E e) : 如果此 set 中尚未包含指定元素,则添加指定元素

  • boolean isEmpty(): 如果此 set 不包含任何元素,则返回 true

  • boolean contains(Object o): 如果此列表中包含指定的元素,则返回 true

  • int size() : 返回此 set 中的元素的数量(set 的容量)。

  • void clear() :移除此列表中的所有元素。

  • boolean remove(Object o):如果指定元素存在于此 set 中,则将其移除。

注意事项:hashset存储自定义对象时一定要重写hashcode和equals方法。

  public static void main(String[] args){  
        //创建一个HashSet  
        HashSet<User> ss=new HashSet<User>();  
  
        //添加User对象  
        ss.add(new User(6300,"疾风剑豪"));  
        ss.add(new User(4800,"雷霆咆哮"));  
        ss.add(new User(6300,"疾风剑豪"));  
          
        System.out.println(ss);  
  
    }  
}  
class User{  
    private int money;  
    private String name;  
     public User(){  
  
     }  
     public User(int money,String name){  
         super();  
         this.money=money;  
         this.name=name;  
     }  
  
    public int getMoney() {  
        return money;  
    }  
  
    public void setMoney(int money) {  
        this.money = money;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
    @Override  
    public String toString(){  
         return "User[money="+money+",name="+name+"]";  
    }  
    @Override  
    public int hashCode() {  
        final int prime = 31;  
        int result = 1;  
        result = prime * result + money;  
        result = prime * result + ((name == null) ? 0 : name.hashCode());  
        return result;  
    }  
  
  
    @Override  
    public boolean equals(Object obj) {  
        if (this == obj)  
            return true;  
        if (obj == null)  
            return false;  
        if (getClass() != obj.getClass())  
            return false;  
        User other = (User) obj;  
        if (money != other.money)  
            return false;  
        if (name == null) {  
            if (other.name != null)  
                return false;  
        } else if (!name.equals(other.name))  
            return false;  
        return true;  
    }  

TreeSet

概念

TreeSet是一个不同步的非线程安全的二叉树。是SortedSet接口的实现类。

优缺点: 维护数据的大小 (有序),添加速度和删除速度高于ArrayList 比其他的都低
查询速度高于List 低于Hash。
如果对于存储的数据有 排序的要求,那么首选TreeSet。

常用方法

与HashSet方法大致相同;多了些针对排序元素的操作。

  • Object first(): 返回集合中的第一个元素。

  • Object last():返回集合中的最后一个元素。

  • Object lower(Object e):查找小于给定元素的最小元素

  • Object higher(Object e): 查找大于给定元素的最小元素

  • Object ceiling(Object e):返回大于或等于给定元素的最小元素

  • Object floor(Object e):返回小于或等于给定元素的最小元素

    public static void main(String[] args){  
          TreeSet<String> treeSet=new TreeSet<>();  
            
          //添加元素  
          treeSet.add("o");  
          treeSet.add("a");  
          treeSet.add("b");  
          treeSet.add("e");  
          treeSet.add("j");  
            
          System.out.println(treeSet);  
            
          //查找  
          System.out.println("查找大于或等于给定元素的最小元素:"+treeSet.ceiling("e"));  
          System.out.println("查找大于给定元素的最小元素:"+treeSet.higher("e"));  
          System.out.println("获取最小元素:"+treeSet.first());  
          System.out.println("获取最大元素:"+treeSet.last());  
      
          System.out.println("查找小于或等于给定元素的最小元素:"+treeSet.floor("e"));  
          System.out.println("查找小于给定元素的最小元素:"+treeSet.lower("e"));  
            
          for(String str:treeSet){  
              System.out.println(str);  
          }  
          Iterator it=treeSet.iterator();  
          while (it.hasNext()){  
              System.out.println(it.next());  
          }  
      }  
    

注意事项

如果存储的元素需要按照指定的需求进行排序,创建TreeSet对象时 指定比较器。
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeSet对象是 指定外部比较器Comparetor接口 重写compare方法

set中每个元素存储的时候 都是存储在一个map集合中 map集合的键是set中的元素, map中的值是自动添加的一个默认值。

  public static void main(String[] args){  
        MyCom m=new MyCom();  
        //传入一个比较器  
        //TreeSet<String> treeSet=new TreeSet<>(new MyCom());  
        TreeSet<String> treeSet=new TreeSet<>(new Comparator<String>() {  
            @Override  
            public int compare(String o1, String o2) {  
                return o1.length()-o2.length();  
            }  
        });  
  
  
        //添加元素  
        treeSet.add("oracle");  
        treeSet.add("ajax");  
        treeSet.add("bootstrap");  
        treeSet.add("ejb");  
        treeSet.add("java");  
          
        System.out.println(treeSet);  
  
  
    }  
}  
class MyCom implements Comparator<String>{  
    @Override  
    public int compare(String o1,String o2){  
        return o1.length()-o2.length();  
    }  
}  

Map

概念

Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

常用方法

  • get方法:获取指定键(key)所对应的值(value);

  • put方法:将指定的键与值对应起来,并添加到集合中,方法返回值为键所对应的值;

  • remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value);

public static void main(String[] args){
        //创建map对象
        Map<String,String> mps=new HashMap<>();
        //put 如果存在键 返回对应的值 添加的值会覆盖之前的值
        mps.put("圣城游侠","奥巴马");
        mps.put("皮城女警","女警");
        mps.put("德玛西亚","大宝剑");

        System.out.println(mps.put("圣城游侠","卢锡安"));
        System.out.println(mps.remove("德玛西亚"));//如果键不存在 返回null 如果存在返回值

        System.out.println(mps);
        System.out.println(mps.size());
        
        System.out.println("获取键对应的值:"+mps.get("皮城女警"));//如果键不存在 返回null 如果存在返回值
        System.out.println("查看键是否存在:"+mps.containsKey("皮城女警"));
        System.out.println("查看值是否存在:"+mps.containsValue("女警"));

    }

迭代方法

  • 获取键 迭代键的过程中通过get方法获取值
  • 获取Entry对象,通过getKey和getValue获取键和值
public static void main(String[] args){  
      //创建map对象  
      Map<String,String> mps=new HashMap<>();  
  
      //put  如果存在键 返回对应的值  添加的值会覆盖之前的值  
      mps.put("圣枪游侠", "奥巴马");  
      mps.put("皮城女警", "女警");  
      mps.put("德玛西亚", "大宝剑");  
        
      //迭代元素  
      System.out.println("迭代所有的key:");  
      Set<String> keys=mps.keySet();  
      for(String key:keys){  
          System.out.println(key+"==="+mps.get(key));  
      }  
        
      System.out.println("迭代所有的值Value");  
      Collection<String> coll=mps.values();  
      for(String value:coll){  
          System.out.println(value);  
      }  
  
      //获取entry对象  
      Set<Map.Entry<String,String>> kvs=mps.entrySet();//返回一个set集合 该集合中的每个元素都是entry对象  
      //实际上是HashSet中的Node对象 因为Node实现了Map中的Entry接口  
      for(Map.Entry<String,String>entry:kvs){  
          System.out.println(entry.getKey()+"=="+entry.getValue());  
      }  
  }  

HashMap

  • 概念:

最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,添加、删除、修改效率都很高。底层是数组+链表。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。

  • 注意事项:
    • 存储自定义对象作为键时 要保证当前自定义类重写hashcode和equals方法什么情况下要重写,当前两个对象的属性相同 我们觉得是同一个对象 此时要重写。
    • 覆写equals方法时必须覆写hashcode()
    • 如果两个对象的equals方法返回值为true,则两个object对应的HashCode值应该相同
    • 如果两个对象的equals方法返回false,但是这两个object对应的HashCode是有可能会相同的,(但是必须意识到: HashCode返回独一无二的值,对后续存储此对象的hashtable\hashmap等容器更好的处理有很大帮助。因此覆写的时候可以考虑下hashcode的算法,尽量避免重复情况)

TreeMap

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

注意事项:

如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeMap对象是 指定外部比较器Comparetor接口 重写compare方法

HashMap与TreeMap

  • 在添加、删除和定位映射关系上,TreeMap类要比HashMap类的性能差一些,但是其中的映射关系具有一定的顺序。

  • 如果不需要一个有序的集合,则建议使用HashMap类;如果需要进行有序的遍历输出,则建议使用TreeMap类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值