Set集合
2023-06-13 09:12:34 时间
1、Set概述
java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不 同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet、java.util.TreeSet这三个集合。
2、HashSet类
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看 HashSet的add(Object obj)方法的实现就可以一目了然了。
import java.util.HashSet;
import java.util.Iterator;
public class SetDemo01 {
public static void main(String[] args) {
//创建Set集合对象
HashSet<String> set = new HashSet<String>() ;
//添加元素(增)
set.add("hello");
set.add("java") ;
set.add("java") ;
set.add("world") ;
set.add("world") ;
set.add("world") ;
System.out.println("集合中添加的元素:"+set);//打印的是内容(原因:传入参数类型是String,底层重写了toString()方法)
System.out.println("集合中元素的个数:"+set.size());
//增强for遍历
Iterator i=set.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
//删除元素(删)
System.out.println("是否成功删除:"+set.remove
("hello"));//删除是否成功
System.out.println("删除后集合中的元素:"+set);
//查询
System.out.println("是否包含此元素:"+set.contains
("hello"));
}
}
import java.util.HashSet;
import java.util.Iterator;
class Book{
String name;
double price;
public Book(String name,double price) {
// TODO Auto-generated constructor stub
this.name = name;
this.price = price;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[书名:" + this.name + " 价格:" + this.price + "]";
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Book b = (Book) obj;
return this.name.equals(b.name);
}
}
public class SetDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//不允许重复,增加自定义对象
HashSet<Book> books = new HashSet<Book>();
books.add(new Book("深入Javaweb",34));
books.add(new Book("java神书",78));
books.add(new Book("java神书",78));
// books.remove(new Book("java神书",78));
//修改书名
Iterator<Book> it = books.iterator();
while(it.hasNext()){
Book b = it.next();
if(b.name.equals("java神书")){
b.name = "java编程思想";
}
}
//为什么改了名字后不能删除了!
books.remove(new Book("java编程思想",78));
System.out.println("集合的元素: "+ books);
}
}
3、LinkedHashSet类
LinkedHashSet是有序的而且不能重复,是HashSet的一个子类,一个链表; 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
import java.util.Iterator;
import java.util.LinkedHashSet;
class Student{
private int age;
private String name;
public Student(int age,String name)
{
this.age = age;
this.name = name;
}
//要显示Student类的信息,必须重写toString 方法
public String toString(){
return "age :"+age+" name:"+name;
}
public int hashCode()
{
return age*name.hashCode();
}
public boolean equals(Object o){
Student s = (Student) o;
return age == s.age && name.equalsIgnoreCase(s.name);
}
}
public class SetDemo03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedHashSet linkHashSet = new LinkedHashSet();
Student linkedstu1 = new Student(18,"zxx");
Student linkedstu2 = new Student(23,"zyj");
Student linkedstu3 = new Student(25,"xmh");
Student linkedstu4 = new Student(25,"zah");
Student linkedstu5 = new Student(25,"zah");
linkHashSet.add(linkedstu3);
linkHashSet.add(linkedstu4);
linkHashSet.add(linkedstu1);
linkHashSet.add(linkedstu2);
linkHashSet.add(linkedstu5);
linkHashSet.add(null);
Iterator it = linkHashSet.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
//经过测试是有序的而且不能重复
}
}
4、TreeSet类
SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
TreeSet提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SetDemo04 {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<String>();
//增加元素
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println("HashSet 顺序:\n"+hs);
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
lhs.add("B");
lhs.add("A");
lhs.add("D");
lhs.add("E");
lhs.add("C");
lhs.add("F");
System.out.println("LinkedHashSet 顺序:\n"+lhs);
TreeSet<String> ts = new TreeSet<String>();
ts.add("B");
ts.add("A");
ts.add("D");
ts.add("E");
ts.add("C");
ts.add("F");
System.out.println("TreeSet 顺序:\n"+ts);
}
}
相关文章
- Java 常用Set集合和常用Map集合
- java集合中:set与list相互转换[通俗易懂]
- ZOJ Problem Set - 1002
- Java集合中List,Set以及Map(三者的区别,什么时候用Set,Connection接口)
- MySql常用函数(逻辑判断,字符串处理,日期函数)FIND_IN_SET、IF、ISNULL、IFNULL、NULLIF、SUBSTR、SUBSTRING_INDEX、CONCAT、LENGTH
- Set集合
- ORA-31405: cannot make changes while change set string is advancing ORACLE 报错 故障修复 远程处理
- ORA-31431: all source tables must belong to the synchronous change set ORACLE 报错 故障修复 远程处理
- ORA-32167: No payload set on the Message ORACLE 报错 故障修复 远程处理
- ORA-38473: cannot drop a type used for Expression Filter attribute set ORACLE 报错 故障修复 远程处理
- ORA-47342: error creating Rule Set string, string ORACLE 报错 故障修复 远程处理
- ORA-07227: rtneco: unable to set noecho mode. ORACLE 报错 故障修复 远程处理
- ORA-12739: Express Instant Client: unsupported client character set string ORACLE 报错 故障修复 远程处理
- ORA-15321: cannot set attribute with connected clients ORACLE 报错 故障修复 远程处理
- Java Set.contains()方法:判断Set集合是否包含指定的对象
- Java Set.isEmpty()方法:判断Set集合对象是否为空
- Java Set集合详解:HashSet类、TreeSet 类
- Linux中的Set命令:配置为自由的系统(linux中的set命令)
- 深入探究Linux Set命令:使用及常见应用(linux的set)
- MySQL中SET集合的使用方法及注意事项(mysql中set集合)
- MySQL中SET语句的使用及注意事项(mysql中set语句)
- 灵活运用Redis中Set结构(redis设置set)
- Python中集合类型(set)学习小结