Set接口
- 不包含重复元素的集合。
- 没有索引,没有带索引的方法,也不能使用for循环遍历。
HashSet类
- 此类实现Set接口,由哈希表(实际为HashMap实例)支持。查询速度快。
- 对集合的迭代次序不作任何保证;
- 特别是,它不能保证订单在一段时间内保持不变。
- 这个类允许null元素。不能有重复的元素。
public static void main(String[] args) {
Set<Integer> s =new HashSet<>();
for(int i=1;i<=5;i++){
s.add(i);
}
Iterator<Integer> i= s.iterator();
while (i.hasNext()){
Integer ss=i.next();
System.out.println(ss);
}
System.out.println("------------");
for(int j:s){
System.out.println(j);
}
}
HashSet存储自定义类型元素
- 存储的元素必须重写hashCode()和equals(),建立自己的比较方式,才能保证HashSet集合中的对象唯一。
HashSet<HashSetDemo> hs=new HashSet<>();
HashSetDemo p1=new HashSetDemo("ltf",18);
HashSetDemo p2=new HashSetDemo("fjc",18);
HashSetDemo p3=new HashSetDemo("fjc",18);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p3.hashCode());
hs.add(p1);
hs.add(p2);
hs.add(p3);
System.out.println(hs);
public class HashSetDemo {
private String name;
private int age;
@Override
public String toString() {
return "HashSet{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void HashSet(){
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof HashSetDemo)) return false;
HashSetDemo hashSet = (HashSetDemo) o;
return age == hashSet.age &&
name.equals(hashSet.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public HashSetDemo(String name, int age) {
this.name = name;
this.age = age;
}
}
LinkedHashSet
- 继承了HashSet集合
- 底层是一个哈希表(数组+链表/红黑树)+链表,多了一条链表,它记录了元素的存储顺序,保证元素有序。
public static void main(String[] args) {
LinkedHashSet<Integer> set=new LinkedHashSet<>();
set.add(5);
set.add(6);
set.add(4);
System.out.println(set);
}
- 与HashSet不同的是,LinkedHashSet是有序的。
可变参数
格式:
修饰符 返回值类型 方法名(参数类型[] 形参名)
原理:
- 可变参数底层就是一个数组,根据传递参数的个数不同,会创建不同长度的数组,来存储这些参数传递的参数个数,可以是0(不传递),1,2,3…
public static void main(String[] args) {
int s=demo(1,2,3,4,5);
System.out.println(s);
}
private static int demo(int...i) {
int sum=0;
for (int j:i) {
sum+=j;
}
return sum;
}
注意事项
- 一个方法的参数列表,只能有一个可变参数。
- 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾。
public static void main(String[] args) {
int s=demo("100",1,2,3,4,5);
System.out.println(s);
}
private static int demo(String s,int...i) {
int sum=0;
System.out.println(s);
for (int j:i) {
sum+=j;
}
return sum;
}
}