setj集合
Hashset集合
HashSet是一种在多种编程语言里都存在的数据结构,它主要用于存储唯一元素,也就是集合里不会有重复的元素。在 Java 里,HashSet是Set接口的一个实现类,它基于哈希表来存储元素。
HashSet常用方法
①:add(Object o):向Set集合中添加元素,不允许添加重复数据。
②:size():返回Set集合中的元素个数
package set;
import java.util.HashSet;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
System.out.println(set);
System.out.println(set.size());
}
}
注意:不会按照保存的顺序存储数据(顺序不定),遍历时不能保证下次结果和上次相同。且向HashSet集合中添加元素,HashSet add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key不允许,所以HashSet添加的元素也不允许重复。
③.remove(Object o): 删除Set集合中的obj对象,删除成功返回true,否则返回false。
④.isEmpty():如果Set不包含元素,则返回 true。
package set;
import java.util.HashSet;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
System.out.println(set.isEmpty());
System.out.println(set.remove("111"));
System.out.println(set);
}
}
⑤.clear(): 移除此Set中的所有元素。
package set;
import java.util.HashSet;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
System.out.println(set);
set.clear();
System.out.println(set);
}
}
⑥.iterator():返回在此Set中的元素上进行迭代的迭代器。
package set;
import java.util.HashSet;
import java.util.Iterator;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
Iterator<String> iterator=set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
⑦.contains(Object o):判断集合中是否包含obj元素。
package set;
import java.util.HashSet;
import java.util.Iterator;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
System.out.println(set.contains("111"));
System.out.println(set.contains("222"));
}
}
⑧:加强for循环遍历Set集合:
package set;
import java.util.HashSet;
import java.util.Iterator;
public class settest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("abc");
set.add("111");
for(String i:set) {
System.out.println(i);
}
}
}
LinkedHashSet集合
LinkedHashSet是一种特殊的集合类,它结合了链表和哈希表的特性。在 Java 里LinkedHashSet是HashSet的一个子类,它继承了HashSet的特性,同时使用链表维护元素的插入顺序,这意味着它可以保证元素按照插入的顺序进行迭代。
LinkedHashSet的基本使用
①.创建 LinkedHashSet
- 使用默认构造函数创建一个空的 LinkedHashSet。
- 可以指定初始容量和负载因子。
package set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class settest {
public static void main(String[] args) {
// 创建一个空的 LinkedHashSet
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
// 创建具有初始容量的 LinkedHashSet
LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10);
// 创建具有初始容量和负载因子的 LinkedHashSet
LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f);
}
}
2. 添加元素
- 使用 add() 方法添加元素。
- 如果元素已存在,则不会重复添加。
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Cherry");
linkedHashSet.add("Apple"); // 重复元素,不会添加
System.out.println(linkedHashSet);
3. 删除元素
- 使用 remove() 方法删除指定元素。
- 使用 clear() 方法清空所有元素。
package set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class settest {
public static void main(String[] args) {
// 创建一个空的 LinkedHashSet
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
// 创建具有初始容量的 LinkedHashSet
LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10);
// 创建具有初始容量和负载因子的 LinkedHashSet
LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f);
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Cherry");
linkedHashSet.add("Apple"); // 重复元素,不会添加
System.out.println(linkedHashSet); // 输出: [Apple, Banana, Cherry]
linkedHashSet.remove("Banana");
System.out.println(linkedHashSet); // 输出: [Apple, Cherry]
linkedHashSet.clear();
System.out.println(linkedHashSet); // 输出: []
}
}
4. 检查元素是否存在
- 使用 contains() 方法检查是否包含指定元素。
package set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class settest {
public static void main(String[] args) {
// 创建一个空的 LinkedHashSet
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
// 创建具有初始容量的 LinkedHashSet
LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10);
// 创建具有初始容量和负载因子的 LinkedHashSet
LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f);
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Cherry");
linkedHashSet.add("Apple"); // 重复元素,不会添加
System.out.println(linkedHashSet); // 输出: [Apple, Banana, Cherry]
linkedHashSet.remove("Banana");
System.out.println(linkedHashSet); // 输出: [Apple, Cherry]
//
// linkedHashSet.clear();
// System.out.println(linkedHashSet); // 输出: []
boolean containsApple = linkedHashSet.contains("Apple");
System.out.println("Contains Apple: " + containsApple); // 输出: Contains Apple: true
}
}
5. 获取大小
- 使用 size() 方法获取集合中元素的数量。
int size = linkedHashSet.size();
System.out.println("Size: " + size); // 输出: Size: 2
6. 遍历 LinkedHashSet
- 使用 for-each 循环遍历。
- 使用 Iterator 遍历。
// 使用 for-each 循环遍历
for (String fruit : linkedHashSet) {
System.out.println(fruit);
}
// 使用 Iterator 遍历
Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
7. 转换为数组
- 使用 toArray() 方法将 LinkedHashSet 转换为数组。
String[] array = linkedHashSet.toArray(new String[0]);
for (String s : array) {
System.out.println(s);
}
TreeSet集合
TreeSet
是一种常用的集合类,在 Java 里,TreeSet
是 Set
接口的一个具体实现类,它基于红黑树(一种自平衡的二叉搜索树)来存储元素。
TreeSet的基本使用
①.插入是按字典序排序的
public class Test {
public static void main(String[] args) {
TreeSet ts=new TreeSet();
ts.add("agg");
ts.add("abcd");
ts.add("ffas");
Iterator it=ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
②.如果插入的是自定义对象 需要让类实现 Comparable 接口并且必须要重写compareTo
class Person implements Comparable{
String name;
int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
@Override
public int compareTo(Object o) {
Person p=(Person)o;
//先对姓名字典序比较 如果相同 比较年龄
if(this.name.compareTo(p.name)!=0) {
return this.name.compareTo(p.name);
}
else
{
if(this.age>p.age) return 1;
else if(this.age<p.age) return -1;
}
return 0;
}
}
public class Test {
public static void main(String args[])
{
TreeSet ts=new TreeSet();
ts.add(new Person("agg",21));
ts.add(new Person("abcd",12));
ts.add(new Person("ffas",8));
ts.add(new Person("agg",12));
Iterator it=ts.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.name+":"+p.age);
}
}
}
HashSet、LinkedHashSet、TreeSet的使用场景
HashSet:HashSet的性能基本上比LinkedHashSet和TreeSet要好,特别是添加和查询,这也是用的最多的两个操作
LinkedHashSet:LinkedHashSet的查询稍慢一些,但是他可以维持元素的添加顺序。所以只有要求当插入顺序和取出顺序一致的时候 才使用LinkedHashSet。
TreeSet:只有在需要对元素进行排序时使用