今天复习了一下Java集合框架的另一个成员Set 和 Map,发现集合不是那么简单是,当然想会用很容易,但是理解当中的一些原理,还是要花些功夫。
首先说一下Set集合。
Set集合是一个完美的Collection子类,因为Set集合的方法完全继承自Collection,没有任何特有的方法,即便如此,Set和List可以说是非常不同的两个集合子类,Set本身也是一个接口,它有许多实现类,最常见的有HashSet,TreeSet和LinkedHashSet.
Set集合中不允许存储相同元素,同时就这三个子类而言有着完全不同的特性。
当你尝试将一个自定义类型的对象放置到一个Set中,你就必须要考虑应用哪个Set的子类,并且根据这个子类来对你所创建的对象的类进行进一步编码。
首先,HashSet,从字面上很容易看出,这个机会有一个基于哈希表的数据结构,如果一个类对象被装入HashSet集合那他就必须同时复写Object的equals方法和hashCode方法,具体原因还没弄太明白,总的来说就是不因为不能保证元素的唯一性,而覆盖这两个方法根据自己的需求对其进行编码可以很好的解决这个问题
然后是TreeSet,这个集合是基于红-黑树的数据结构,核心思想就是比较两个元素的大小,然后根据比较结果来对元素进行具体的内存分配,所以元素的比较性对于TreeSet而言是必须的,所以如果你的对象即将要被放置到一个TreeSet中就要让你的对象具有比较性,达到 这种目的通常有两个方法:第一个就是让你的类继承Comparable接口,并复写他的compareTo方法,并定义自己的比较规则,第二种 就是自定以一个比较器(一个实现了Comparator接口的类),然后再创建TreeSet的同时把这个比较器传给他,让他按照这个比较规则对元素进行排序。
最后是LinkedHashSet,这个集合是一个基于哈希表的有序且不存放重复元素的集合,大体上跟Hash差不多,只是LinkedHashSet中的元素是有序的。
所以,如果你的类对象将被存入Set时,最后根据自己的需求重写equals(),hashCode()和实现Comparable接口,否则的话不能保证Set集合的正确性。
下面再简单讲一个对Map的初步理解,Map是以键值对的形式对元素进行存储,他是一个非常强大的编程工具,可以把一个对象与另一个对象相关联,常见的Map集合有HashMap,TreeMap和LinkedHashMap,Map集合本身不具有迭代功能,但是提供了一些方法可以很容易的对Map中的元素进行操作,例如values() 返回一个所有值的Collection集合,get(key) 根据key的值获得对应的value等,还有一个不得不说的是entrySet() 该方法返回的是Map由集合中每一个键值关系组成的Map.Entry类型的SEt集合
,可以对每一个键值对应关系用Set集合进行操作,然后再用Entry接口中的方法进行具体的操作。
Entry接口是Map接口中的一个子接口,这样设计的原因跟Iterator有异曲同工之妙,因为Map有很多的实现子类,而他们的底层数据结构又是不同的,所以不能抽取出一个类或者一个方法对他们所有实现类都起作用,所以就定义一个内部接口,让子类自己去实现。同时内部接口的好处在于能够操作外围类中的内容,这是很重要的。
Map中的Key:
Maps是已键值对的形式进行数据的存储,键是不可重复的,而值是可以重复的,这就好比一栋楼,楼中的门跟房间的关系就是一个键值对的关系,房间可以是相同的,但是门锁是不可以相同的,所以,作为键的那个对象就必须要保证他的唯一性。
还在继续学习中,有写内容还没弄通就不写了。