List关注事物的索引列表
Collection是单个集合保存的最大父接口。
每一次进行数据操作的时候只能够对单个对象进行处理。
public interface Collection<E> extends Iterable<E>
****add(T t) //向类集中添加元素
****iterator() //取得类集迭代器
addAll()
clear()
contains()
remove()
size()
toArray()
---------简写,并不全是无参。加星号的表示比较重要。
collection只定义了存储数据的标准,但是无法区分存储类型。
实际中更多的是使用两个子接口:1. List(允许重复) 2. Set(不允许重复)
在进行单个集合处理时,优先考虑List接口,是允许数据重复的。
List接口若想保存自定义类的对象,该类必须覆写equals()才能使用contains()、remove()。
所以使用List接口一定得覆写equals()方法。
List接口除了实现Collection接口的方法,还有自己独有的方法。
public E get(int index) //根据索引获取数据
public E set(int index,E element) //根据索引更新数据,返回原来数据
List中有三个常用的子类,值得去深究它们之间的区别和底层实现。
1.ArrayList 2.Vector 3.LinkedList 都继承抽象类 AbstractList< E>抽象类
重点重点重点重点
共同点:底层都是用数组实现存储对象
区别:
共同点:都没有加锁操作,异步处理。
区别:
不允许数据重复!!
没有扩充方法,直接覆写collection的抽象方法。
它们的目的和作用都是一样的,在Java中实现自定义类的比较。
多用于TreeSet和TreeMap。
但是使用方法上和功能实现上都是完全不一样的。
实现java.lang.Comparable(1.2)接口,就说明该类支持排序。
存放该类的collection或者数组可以通过collections.sort()进行排序。可以直接存放在TreeSet中。
接口内就一个int ComparTo(T o)方法,覆写这个方法,就是告诉怎么去比较。在类内实现排序。
称之为 类内比较器。
第三方实现java.util.Comparator (1.5)接口,是需要比较的类本身不支持排序,就可以外部建立一个该类的"比较器"来进行排序。这个外部比较器实现Compartor接口即可。
接口中有个compare(T t,E e)方法。创建一个类在类外实现排序。必须实现equals
称之为 外部比较器。
-策略模式,更加灵活,可以轻松改变策略进行第三方排序。
这就得引出一个HashCode概念,这是通过哈希算法散列得来的。哈希表中的概念。
要判断大小就得同时覆写HashCode()和equals()两个方法。
必须hashCode和equals都返回ture才是相等。
equals比较的是元素的内容,HashCode比较的是元素存储的经过hash转化的地址。
equals相同,hashcode一定保证相同
hashcode相同,equals不一定相同
这里又引入了一个问题,问题3:哈希碰撞,~~~
把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的。
解决方法在这里就简单一提,
1.开放定址法,也就是一直为冲突的元素找新地址
2.再哈希法,就是同时构造多个hash函数,冲突就换函数
3.链地址法,把冲突的元素放进一个链表中
4.建立公共溢出区,将冲突的元素统一放入另一个区域
因为Set是不可重复的,那既然不可重复就得规定一个标准,让计算机知道怎么样才能算相等,就像定义了一个学生信息表,你就得规定姓名和学号完全一样才算相等。
还有就是TreeXXX在意的是对象的自然排序,所以必须要定义这个比较"准则"。
写到这里,Collection接口和Map接口的特点、实现以及它们的常用子类的特点、区别、适用都已经有个大概了解和区分了。
Collection接口及其常用子类(java.util包)
原文:https://www.cnblogs.com/renjiaqi/p/14073206.html