java 集合

List接口 集合的特点是可以放入重复
ArrayList子类
ArrayList是用数组实现的,可以
remove(index)
add(Object)
indexOf(Object)
set(index,Object)
把它看做一个功能强大的数组就可以了
Vector
这是一个线程安全的List子类,里面有同步代码,所以比较重比较慢

LinkedList子类
LinkedList链表实现的队列,因为实现了队列接口Queue,可以
addFirst(E o)
addLast(E o)
removeFirst()
removeLast()
add(int index,E o)

Set接口 集合的特点是不能放重复的元素
set接口存入”相同”的元素时,不会出错,但是存入是无效的
hashSet 子类
用散列存的,所以是无序的
hashSet其实是存到hashMap中的,以hashSet的值为key,value是同一个object对象。
看来其他人的博客得到这样的信息,存入hashMap时,首先会调用对象的hashCode的到哈希值和原来存在表中的哈希值比较(遍历链表元素),如果不相等,就认为表中没有重复的对象,直接存。如果相等,还会调用equals方法比较每个对象。如果相同,就再次确定是相同的对象,不存;如果不相同,则存在冲突。会帮我们解决冲突,并存进去。
如果是原生对象,equals 是比较两个对象的引用。
那么new Person(“name”) new Person(“name”),hashCod结果是不同,直接就存了。在我们的逻辑它们应该是重复的
Person p1 = new Person(“name”) Person p2=p1,hashCode结果是相同的,再比较equals()结果仍是相同,不存。这个在我们的逻辑看来没问题

那么我可以试着重写hascode方法,来自定义我们的”重复”的标准,看能不能符合我们的逻辑
hashCode(){ return this.name.hashCode()}
我们以对象的一个成员变量来区分。再来分析,因为两个对象实例化的时候成员变量name都是指向常量池中的”name”,所以hashCode返回是一样的,那么就会在调用equals(),由于equals是比较两个对象的引用,因为他们是不同的对象所以返回不同。存在冲突,但是还是会帮我们存进去。
还是没解决,我们再覆写equals方法
equals(obj){return this.name==obj.name}
这时候equals比较的时候就会返回相同,不会存进去了。

当new Person(“name”), new Person(new String(“name”))时,不管用原生的方法还是刚才修改的,都会存进去。因为”name” 和 new String(“name”) 是不同对象。
我们应该把equals改成下面这样
equals(obj){return this.name.equals(obj.name)}

TreeSet子类
是有序的,放入的元素都要实现 Comparable的compareTo方法进行比较是否重复

Map接口 特点也是不允许重复
其实Set的子类都是用相应的Map子类
HashMap,上面的将hashSet时候已经讲了。
HashTable,线程安全的,性能比较差
TreeMap 可排序。

暂时写到这。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值