set接口java
java.util.Set 接口和 java.util.List 接口同样,一样继承自 Collection 接口,它与 Collection 接口中的方 法基本一致,可是set接口中元素无序,而且不重复数组
分类ide
1.HashSet集合性能
2.LinkedHashSet集合this
HashSet集合:spa
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,而且元素都是无序的(即存取顺序 不一致)code
1 package demosummary.set; 2
3 import java.util.HashSet; 4
5 public class HashSetTest01 { 6 public static void main(String[] args) { 7 //建立set集合
8 HashSet<String> set = new HashSet<>(); 9 //添加元素
10 set.add("德玛"); 11 set.add("德邦"); 12 set.add("皇子"); 13 set.add("剑圣"); 14 set.add("德玛"); 15 System.out.println(set);//[德邦, 皇子, 德玛, 剑圣]//元素不容许重复,且无序 16 //遍历集合
17 for (String s : set) { 18 System.out.println(s); 19 } 20 } 21 }
HashSet 是根据对象的哈希值来肯定元素在集合中的存储位置,所以具备良好的存取和查找性能。保证元素惟一性 的方式依赖于: hashCode 与 equals 方法对象
HashSet集合存储数据的结构(哈希表)blog
哈希表是由数组+链表+红黑树(JDK1.8增长了红黑树部分)实现的,以下图所示继承
HashSet存储自定义类型元素
HashSet中存放自定义类型元素时,须要重写对象中的hashCode和equals方法,创建本身的比较方式,才能保 证HashSet集合中的对象惟一
1 package demosummary.set; 2
3 import java.util.Objects; 4
5 public class SetPerson { 6 private String name; 7 private int age; 8
9 public SetPerson() { 10 } 11
12 public SetPerson(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16
17 public String getName() { 18 return name; 19 } 20
21 public void setName(String name) { 22 this.name = name; 23 } 24
25 public int getAge() { 26 return age; 27 } 28
29 public void setAge(int age) { 30 this.age = age; 31 } 32
33 @Override 34 public boolean equals(Object o) { 35 if (this == o) return true; 36 if (o == null || getClass() != o.getClass()) return false; 37 SetPerson setPerson = (SetPerson) o; 38 return age == setPerson.age &&
39 Objects.equals(name, setPerson.name); 40 } 41
42 @Override 43 public int hashCode() { 44 return Objects.hash(name, age); 45 } 46
47 @Override 48 public String toString() { 49 return "SetPerson{" +
50 "name='" + name + '\'' +
51 ", age=" + age +
52 '}'; 53 } 54 }
1 package demosummary.set; 2
3 import java.util.HashSet; 4
5 public class SetPersonTest { 6 public static void main(String[] args) { 7 //建立set集合
8 HashSet<SetPerson> sp = new HashSet<>(); 9 //添加元素
10 SetPerson setPerson = new SetPerson("德玛",18); 11 sp.add(setPerson); 12 sp.add(new SetPerson("德邦", 19)); 13 sp.add(new SetPerson("皇子", 20)); 14 sp.add(new SetPerson("剑圣", 19)); 15 //遍历set集合
16 for (SetPerson person : sp) { 17 System.out.println(person); 18 } 19 /**
20 * 执行结果 21 * SetPerson{name='皇子', age=20} 22 * SetPerson{name='德玛', age=18} 23 * SetPerson{name='德邦', age=19} 24 * SetPerson{name='剑圣', age=19} 25 */
26 } 27 }
LinkedHashSet
HashSet的一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构,保证取出元素是有序的
1 package demosummary.set; 2
3 import java.util.Iterator; 4 import java.util.LinkedHashSet; 5 import java.util.LinkedList; 6
7 public class LinkedHashSetTest01 { 8 public static void main(String[] args) { 9 //建立LinkedList集合
10 LinkedHashSet<String> set = new LinkedHashSet<>(); 11 //添加元素
12 set.add("剑圣"); 13 set.add("德玛"); 14 set.add("皇子"); 15 set.add("德邦"); 16 //迭代器输出结果
17 Iterator<String> iterator = set.iterator(); 18 while (iterator.hasNext()) { 19 System.out.println(iterator.next()); 20 } 21 /**
22 * 输出结果 23 * 剑圣 24 * 德玛 25 * 皇子 26 * 德邦 27 */
28 } 29 }
可变参数
若是咱们定义一个方法须要接受多个参数,而且多个参数类型一致,咱们能够对其简化成以下格 式:
修饰符 返回值类型 方法名(参数类型... 形参名){ }
等价于
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
1 package demosummary.set; 2
3 public class SetTest { 4 public static void main(String[] args) { 5 //定义一个数组
6 int[] arr = {1,5,8,66,88,345}; 7 //定义一个结果并赋值
8 int sum = getSum(arr);//调用方法并给sum赋值 9 //输出结果
10 System.out.println(sum); 11 } 12
13 /**
14 * 完成数组 全部元素的求和 原始写法 15 * public static int getSum(int[] arr){ 16 * int sum = 0; 17 * for(int a : arr){ 18 * sum += a; 19 * } 20 * return sum; 21 * } 22 */
23 //可变参数写法
24 public static int getSum(int[] arr){ 25 //定义一个sum参数
26 int sum = 0; 27 //加强for
28 for (int i : arr) { 29 //得出结果
30 sum += i; 31 } 32 //返回结果
33 return sum; 34 } 35 }