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 可排序。
暂时写到这。。。