1、LinkedHashSet
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。
特点:
1.元素唯一性
2.有序的
3.允许null存在一个
4.不是线程安全(效率高)
package cn.tx.set;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetDemo2 {
public static void main(String[] args) {
//创建一个set集合
Set<String> set = new LinkedHashSet<String>();
set.add("刘备");
set.add("关羽");
set.add("张飞");
set.add("刘备");
System.out.println(set);
}
}
2、TreeSet
TreeSet可以支持自定义排序,如果TreeSet所存储的对象的类没有实现Comparable接口就会报错ClassCastException。所以我们如果想要使用TreeSet来对自定义的对象来排序必须实现Comparable接口。
特点:
1.元素唯一性
2.可自定义排序的
3.不允许null存在
4.不是线程安全
package cn.tx.set;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo1 {
public static void main(String[] args) {
//创建一个set集合
/**
* Treeset的特点:
*1、 会自动做自然排序
* 2、元素不可重复
* 3、不允许有null
*
*/
Set<String> set = new TreeSet<String>();
set.add("b");
set.add("t");
set.add("d");
set.add("c");
System.out.println(set);
Set<Integer> set1 = new TreeSet<Integer>();
set1.add(55);
set1.add(24);
set1.add(75);
set1.add(124);
System.out.println(set1);
}
}
3、可变参数
可变参数的语法:
修饰符 返回值类型 方法名(数据类型…变量){
}
publicstaticint sum(int ... p){
return0;
}
注意:参数p实际是一个数组,p都是同一种类型
package cn.tx.set;
public class DymanicParam {
public static void main(String[] args) {
int[] p ={1,3,5,7};
int sum = add(p);
System.out.println(sum);
}
//重载
public static int add(int a,int b){
return a+b;
}
public static int add(int a,int b,int c){
return a+b+c;
}
/**
* 可变参数的定义
*
* int...p 参数是一个int类型的数组,相当于int[] p
*/
public static int add(int...p){
int sum = 0;
for(int i = 0;i < p.length;i++){
sum += p[i];
}
return sum;
}
}
4、数组工具
数组的工具类,在API这里的方法都是静态的
①把数组转换成字符串
②对任意数组排序
③对任意的数组做二分法的查找
④把数组转换成List
package cn.tx.set;
import java.util.Arrays;
import java.util.List;
public class ArraysDemo3 {
public static void main(String[] args) {
Integer[] arr = {3,19,48,71,119};
//将数组转换为List
List<Integer> iList = Arrays.asList(arr);
System.out.println(iList);
//从数组转换过来的List不能添加和删除,但是可以修改
//iList.add(15);
//iList.remove(15);
iList.set(2,56);
System.out.println(iList);
}
}
package cn.tx.set;
import java.util.Arrays;
public class ArraysDemo2 {
public static void main(String[] args) {
int[] arr = {3,19,48,71,119};
int index = queryBin(arr,48);
System.out.println(index);
}
//用二分法查找必须是数组是有序排列的,如果没有有序排列,需要先进行排列后在用二分法查找
public static int queryBin(int[] arr,int val){
return Arrays.binarySearch(arr, val);
}
}
package cn.tx.set;
import java.util.Arrays;
public class ArraysDemo1 {
public static void main(String[] args) {
int[] arr = {3,157,48,71,19};
ArraysDemo1.arrayToString(arr);
Student[] sarr ={new Student(1,"haha",23),new Student(1,"hehe",23),new Student(1,"",23)};
ArraysDemo1.arrayToString(sarr);
//ArraysDemo1.arraySort(arr);
ArraysDemo1.arraySort1(arr);
ArraysDemo1.arraySort2(sarr);
}
//数组变成字符串
public static void arrayToString(int[] arr){
String str = Arrays.toString(arr);
System.out.println(str);
}
public static void arrayToString(Student[] sarr){
String str = Arrays.toString(sarr);
System.out.println(str);
}
public static void arraySort(int[] arr){
//对int的数组做排序
Arrays.sort(arr);
arrayToString(arr);
}
//对自定索引位置的数组的元素进行排列
public static void arraySort1(int[] arr){
Arrays.sort(arr,1,3);
arrayToString(arr);
}
//对象的排序
public static void arraySort2(Student[] sarr){
Arrays.sort(sarr);
arrayToString(sarr);
}
}
5、小结
①LinkedHashSet是有序的
②TerrSet是可以自定义排序的
③排序:类必须实现一个接口:comparable<T>才能做排序
④二分法查找数组元素需要该数组必须有序排列,如果没有有序排列,需要先对数组进行排列
⑤数组Arrays工具类中的方法都是静态的,可以直接调用。