Java集合:集合简述、HashSet
集合
- 集合只能存放对象,如int型数据被转换为Integer类后放入集合中
- 集合存放的是多个对象的引用,对象本身在堆中
- 集合可以存放不同类型,不限数量的数据类型
- JDK5增加了泛型,Java集合可以记住容器中对象的数据类型
Java集合分为:
- Set:无序、不可重复的集合
- List:有序,可重复的集合
- Map:具有映射关系的集合
HashSet
HashSet是Set接口的典型实现,大多set都指HashSet
HashSet类---实现--->set接口---继承--->Collection接口
- HashSet按Hash算法来存储集合中的元素
- HashSet的特点:
- 不能保证元素的排列顺序
- 不可重复(hashCode的返回值决定)
- HashSet不是线程安全的
- 集合元素可以是null
- 当HashSet集合中存入元素是,HashSet会调用该对象的
hashCode()
方法来得到该对象的hashCode值,由此确定对象的位置 - 如果两个元素的equals()方法返回true,但hashCode()返回值不想相等,HashSet会存在不同位置,仍可成功添加
常用方法
- 创建HashSet
Set set = new HashSet();//多态
- add:添加,可以添加null
set.add(1);
set.add('c');
set.add('a');
//'a'和'c'的添加顺序不影响他们在set中的位置
//可以添加男
set.add(null);
- remove:移除
set.remove(1);
- contains:查看set中是否存在该内容,返回值为布尔值
set.contains(1);
- clear:清空
set.clear();
- set的遍历
- 使用迭代器遍历set
//使用迭代器遍历set
Iterator it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
- for each增强for循环遍历set(推荐使用)
//2. for each迭代
for(Object obj : set){
System.out.println("for each:"+obj);
}
- size:集合的大小
set.size();
hashCode()方法
-
HashSet中判断两个元素相同的标准:
- 两个对象通过
equals()
比较相等 - 两个对象的
hashCode()
返回值相等
- 两个对象通过
-
通常来说,如果两个对象
equals()
返回为true
,两个对象的hashCode值也应相同;两个对象的hashCode值相同时,两个对象equals()
返回值不一定相同(哈希碰撞) -
在判断是首先对
hashCode()
返回值进行比较,相同时再进行equals()
比较,大大减少了执行equals()
的次数,增加了执行效率。 -
重写
equals()
时必须重写hashCode()
泛型
泛型,让集合只存放相同类型的对象
HashSet<类> ints = new HashSet();
//或
HashSet<类型> ints = new HashSet<类型>();//后面的<>可以不加
当类型为Object时,可以存放所有类型(所有类型都是Object的子类)