黑马程序员__set集合以及map集合

  ------- android培训java培训、期待与您交流! ----------

 

set集合
元素是无序的。(存入和取出的顺序不一致)。元素不可以重复。
set集合的功能与list功能是一致的。
set集合取出只有一种方式,就是使用迭代器。

其中常见的子类有:
   hashset:底层数据结构是哈希表。按照哈希值来存,也按照哈希值来取,类中都有一个哈希值,hashcode方法可以自定义哈希值。哈希值也就是一个int类型的值。在哈希表中存放的元素如果哈希值相同,还要再判断一次是否是同一个对象,比较则会调用equals方法。(这里很关键,必须记住)哈希值就是地址,地址不同哈希值不同,但是如果复写哈希值的方法那么,则不然。
contains remove add 等方法都会自动先调用hashcode()算哈希值以及再可能调用equals方法用来判断。


   Treeset:
可以对集合中的元素进行排序,所以添加的元素必须具备比较性,比较性就需要实现一个接口,也就是comparable接口。此接口就一个
compareTo方法,compareTo方法实现时返回正数说明本类对象大于比较对象,0代表相等,负数代表小于。返回0的时候就判定是相同对象,不会将该元素存入。注意string类实现了comparable接口,自身按照字典顺序排序。
底层是二叉树的排序。
Treest集合的第二种排序方式,当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
Treeset中有个带比较器的构造函数:
所以需要自定义一个子类实现comparator比较器接口并复写compare方法。和string类型一样,基本类型的包装类都基本实现了comparable接口。当存在两种比较方式时,以比较器的方法为主。注意实现比较器接口的子类在定义好了之后,应该创建它的对象并作为参数传递给新创建的Treeset集合。

 

Map集合
Map(双列)集合与collection(单列)集合是并列的,都是顶层的。
map接口使用两个泛型。
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 重复的键添加时,新的键值会覆盖原有键值,所以还是没有重复的键。
1.添加
V put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
 
 
2.删除
clear() 删除所有元素
V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

3.判断
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()  
4.获取
V get(Object key)
int size()  返回此映射中的键-值映射关系数。
Collection<V> values()返回此映射中包含的值的 Collection 视图
Set<Map.Entry<K,V>> entrySet() (重要)
Set<K> keySet()(重要)
 
map集合的三个实现子类
hashtable底层是hash表数据结构,不可以存入null键null值,是线程同步的
hashMap底层是哈希表处理结构,允许使用空键空值,该集合不同步。

TreeMap底层是二叉树结构,线程不同步,可以用于给map集合中的键进行排序。

set集合底层就是使用了map集合。

Map <String,String> map=new HashMap<String,String>();
map.put("01","zhangsan6");
map.put("02","zhangsan5");
map.put("03","zhangsan4");
map.put("04","zhangsan3");
map.put("05","zhangsan2");
map.put(null,"zhangsan1")
map.remove("01");//会返回01的值,并且删除这个键)
map.get("03");//返回03的值,如果没有返回空。
map.get(null);//null可以作为键值,此时返回zhangsan1.
null也可以作为值。hashtable则不可以。


Collection<String> coll =map.values();//此方法返回一个collection集合,collection集合虽然不能直接创建,可以用此方法得到。
当存到相同键的时候,put方法会返回一个原来的值而将新的值存入这个键其中,没有值当然不会返回。

Keyset 方法返回map集合中所有的键存入一个set集合中,set集合有迭代器,所以可以通过迭代方式取出所有的键,然后通过get方法获取每一个键值。

Set<String> Keyset=map.keySet();
Iterator<String> it=Keyset.iterator();
while(it.hasNext()){
   String key=it.next();
   String Value=map.get(key);
  
}

map中的entrySet方法:返回的是一个包含键与值的关系的视图。
 Set<Map.Entry<K,V>> entrySet() //前面一大坨是返回一个set集合
也就是说,这个方法的本质就是得到一个set集合,这个集合中的每一个元素都是是一个Map.Entry这个类型,这个类型记录了这个原map集合中键值关系,然后如果想要拿到键或者是值,则需要先拿到这Map.Entry.而set中拿到元素的方法就是迭代器的建立,这样通过建立一个迭代器拿到这个Map.Entry对象再通过其中的一些方法(具体方法参考API)得到我们想要的键和值,事实就是这么简单明了,难道不是吗?

set<Map.Entry<String,String>> entryset=map.entrySet();
Map.Entry本身是一个类型,它自己有两个泛型。
Iterator<Map.Entry<String,String>> it=Keyset.iterator();
while(it.hasNext()){
  
Map.Entry<String,String> me=it.next();
String key=me.getKey();
String value=me.getValue();

}

 
详解Entry,事实上Map接口中有一个静态的Entry接口,可以直接Map调用

interface Map{

  public static interface Entry{
     public abstract Object getKey();
     public abstract Object getValue();

}
}

class HashMap implements Map{
  class haha implements Map,Entry(){
     public Object getKey(){}
     public Object getValue(){}
}

}

用内部类实现内部接口,因为class实现了Map集合


能加static的接口必定是内部接口。

对象可能的存储方式有三种,数组,哈希表,或者二叉树,所以对象中如果需要存入到容器中,需要按需实现hashCode方法,equals方法,以及compareTo方法。

TreeMap也可以传入一个比较器

什么时候使用Map集合?
当数据之间存在映射关系时就要先想到Map集合。

 



 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值