Java之路---Day19(set接口)
2024-08-25 05:08:28
set接口
java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方 法基本一致,但是set接口中元素无序,并且不重复
分类
1.HashSet集合
2.LinkedHashSet集合
HashSet集合:
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序 不一致)
package demosummary.set; import java.util.HashSet; public class HashSetTest01 {
public static void main(String[] args) {
//创建set集合
HashSet<String> set = new HashSet<>();
//添加元素
set.add("德玛");
set.add("德邦");
set.add("皇子");
set.add("剑圣");
set.add("德玛");
System.out.println(set);//[德邦, 皇子, 德玛, 剑圣]//元素不允许重复,且无序
//遍历集合
for (String s : set) {
System.out.println(s);
}
}
}
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于: hashCode 与 equals 方法
HashSet集合存储数据的结构(哈希表)
哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示
HashSet存储自定义类型元素
HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保 证HashSet集合中的对象唯一
package demosummary.set; import java.util.Objects; public class SetPerson {
private String name;
private int age; public SetPerson() {
} public SetPerson(String name, int age) {
this.name = name;
this.age = 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;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SetPerson setPerson = (SetPerson) o;
return age == setPerson.age &&
Objects.equals(name, setPerson.name);
} @Override
public int hashCode() {
return Objects.hash(name, age);
} @Override
public String toString() {
return "SetPerson{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package demosummary.set; import java.util.HashSet; public class SetPersonTest {
public static void main(String[] args) {
//创建set集合
HashSet<SetPerson> sp = new HashSet<>();
//添加元素
SetPerson setPerson = new SetPerson("德玛",18);
sp.add(setPerson);
sp.add(new SetPerson("德邦", 19));
sp.add(new SetPerson("皇子", 20));
sp.add(new SetPerson("剑圣", 19));
//遍历set集合
for (SetPerson person : sp) {
System.out.println(person);
}
/**
* 执行结果
* SetPerson{name='皇子', age=20}
* SetPerson{name='德玛', age=18}
* SetPerson{name='德邦', age=19}
* SetPerson{name='剑圣', age=19}
*/
}
}
LinkedHashSet
HashSet的一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构,保证取出元素是有序的
package demosummary.set; import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList; public class LinkedHashSetTest01 {
public static void main(String[] args) {
//创建LinkedList集合
LinkedHashSet<String> set = new LinkedHashSet<>();
//添加元素
set.add("剑圣");
set.add("德玛");
set.add("皇子");
set.add("德邦");
//迭代器输出结果
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
/**
* 输出结果
* 剑圣
* 德玛
* 皇子
* 德邦
*/
}
}
可变参数
如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格 式:
修饰符 返回值类型 方法名(参数类型... 形参名){ }
等价于
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
package demosummary.set; public class SetTest {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1,5,8,66,88,345};
//定义一个结果并赋值
int sum = getSum(arr);//调用方法并给sum赋值
//输出结果
System.out.println(sum);
} /**
* 完成数组 所有元素的求和 原始写法
* public static int getSum(int[] arr){
* int sum = 0;
* for(int a : arr){
* sum += a;
* }
* return sum;
* }
*/
//可变参数写法
public static int getSum(int[] arr){
//定义一个sum参数
int sum = 0;
//增强for
for (int i : arr) {
//得出结果
sum += i;
}
//返回结果
return sum;
}
}
最新文章
- 网站中使用中文个性字库字体--@font-face解决方案探索 l(转)
- Python函数信息
- RF--换行
- android基础---->;JSON数据的解析
- Android@Home Apple HomeKit
- Java基础之一组有用的类——为标记定义自己的模式(ScanString)
- JavaScript之document对象使用
- DB Create and Insert
- Altium Designer 09 (Protel)总线使用方法(解决导入PCB无网络标号问题)
- MVC中关于JSON的处理
- 使用spring-data-mongodb操作mongodb
- 什么是Bootstrap?
- .net 连接SqlServer数据库及基本增删改查
- Xpath语法学习
- 为什么.Net平台不支持程序集卸载(Assembly.Unload)?
- Python基础学习篇章四
- iOS9自动布局神器StackView
- JavaScript的数组知识案例之随机点名器
- nexus2 配置
- 原生js实现Base64编码解码