集合
一、java集合概述
1、java集合类存放与java.util包中,是一个用来存放对象的容器。
- 集合只能存放对象。比如存一个int型数据1放入集合中,其实它是自动转换成Integer类后存入的,java中每一种基本类型都有对应的引用类型
- 集合存放的是多个对象的引用,对象本身还是放在堆内存中
- 集合可以存放不同类型,不限数量的数据类型
2、java集合可分为Set、List和Map三种大体系
- Set:无序、不可重复的集合
- List:有序、可重复的集合
- Map:具有映射关系的集合
3、在JDK5之后,增加了泛型 ,java集合可以记住容器中对象的数据类型
二、HashSet
1. HashSet是Set接口的典型实现
大多数时候使用Set集合时都使用这个实现类。大多数时候我们说的set集合就是HashSet
2、 HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能
3、HashSet具有以下特点
1) 不能保证元素的排列顺序
- 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置
- 比如存放第一个值a,再存放第二个值4.不能保证a一定在集合的第一个位置
- 存在set集合的哪个位置由这个值的hashCode决定
2) 不可重复
- 指的是hashCode不相同
- 如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,HashSet将会把他们存储在不同的位置,但依然可以添加成功
- 一般来说equals和hashCode会同时等或同事不等
3) HashSet不是线程安全的
4) 集合元素可以是null
5)HashSet
三、HashSet的使用
1.基本方法
添加、删除元素,清空集合
import java.util.HashSet;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
//向set中添加元素
set.add(1);
set.add("a");
System.out.println(set);
//set中移除元素
set.remove(1);
System.out.println(set);
//判断在set中一个元素是否存在
System.out.println(set.contains("a"));
//清空集合
set.clear();
System.out.println(set);
}
}
2、遍历集合
- 迭代器遍历集合
- for each迭代集合**(推荐使用)**
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);
//1.使用迭代器遍历集合
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//2.for each迭代集合
for(Object obj : set) {//这个的意思是把set的每一个值取出来,赋值给obj,直到循环set的所有值
System.out.println(obj);
}
}
}
3、获取集合的元素个数
set.size();
4、set集合存的值不重复,且可以存放null
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("d");//set集合存的值是不重复的
set.add(null);
System.out.println(set);
//1.使用迭代器遍历集合
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//2.for each迭代集合
for(Object obj : set) {//这个的意思是把set的每一个值取出来,赋值给obj,直到循环set的所有值
System.out.println(obj);
}
System.out.println(set.size());
}
}
存放的null却在第一个输出,说明set集合不保证元素的排列顺序
四、hashCode()方法
1、HashSet集合判断两个元素相等的标准
两个对象通过equals()方法比较相等,且两个对象的hashCode()方法返回值也相等
2、如果两个对象通过equals方法返回true,这两个对象的hashCode值也应该相同
五、泛型
set中可以存放不同类型的对象。
如果想要让集合只能存放同样类型的对象,怎么做?
- 使用泛型
import java.util.HashSet;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
//Set set = new HashSet();等价于
Set<Object> set = new HashSet<Object>();
//比如指定String为集合的泛型,那么这个集合就不能存放String类型之外的变量
Set<String> set1 = new HashSet<String>();
set1.add("abc");
}
}