提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
JAVA基础之Set集合、TreeSet、Vector
前言
提示:这里可以添加本文要记录的大概内容:
今天学习了Vector、Set集合、TreeList
提示:以下是本篇文章正文内容,下面案例可供参考
一、Vector
向量与ArrayList之间的共性:都是List接口下的实现类底层都是数组。
区别:
Vector | ArrayList |
---|---|
线程安全 | 线程不安全 |
每次扩容2倍 | 每次扩容1.5倍 |
实例代码如下:
public class Class_09_Vector {
public static void main(String[] args) {
new Vector<>(16).add(10);
System.out.println(new Vector<>(16).add(10));
}
}
二、Set集合
Set集合 : 无序的、去重的
新增方法 : static Set of(E… elements) 返回包含任意数量元素的不可修改集合。
遍历方式 : foreach iterator
实例代码如下:
public class Class_10_Set {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(15);
set.add(15);
set.add(78);
set.add(799);
set.add(100);
System.out.println("我是普通输出==================");
System.out.println(set);
System.out.println("我是forEach输出==================");
set.forEach(System.out::println);
System.out.println("我是迭代器输出==================");
Iterator<Integer> i = set.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
System.out.println("我是增强for循环输出==================");
for (Integer integer : set) {
System.out.println(integer);
}
System.out.println("我是of方法创建的set集合");
Set<Double> list1 = Set.of(1.00, 12.00, 3.00);
list1.add(50.00);
System.out.println(list1);
}
}
输出结果如下:
三、TreeSet
1、TreeSet的基本用法
TreeSet:无序的、去重的
特点:可以自动升序排列
遍历方式:
- foreach
- iterator
- descendingIterator()
TreeSet一些方法的实现
实例代码如下:
public static void main(String[] args) {
TreeSet<Integer> tree = new TreeSet<>();
tree.add(12);
tree.add(45);
tree.add(12);
tree.add(23);
tree.add(90);
System.out.println(tree);
//ceiling 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则null 。
System.out.println(tree.ceiling(20));
//floor返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则null 。
System.out.println(tree.floor(20));
//按降序返回此 set 中元素的迭代器。
tree.descendingIterator();
System.out.println(tree);
//last()返回此集合中当前的最后一个(最高)元素。
System.out.println(tree.last());
//lower(E e)返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则null 。
System.out.println(tree.lower(20));
//pollLast()检索并删除最后一个(最高)元素,如果此集合为空,则返回null 。
tree.pollLast();
System.out.println(tree);
//remove(Object o)如果存在,则从此集合中删除指定的元素。
tree.remove(12);
输出结果如下:
2、TreeSet的比较器
TreeSet不能存放不同类型的数,否则会抛出类型转换异常(ClassCastException)。
示例代码如下:
TreeSet<Object> t4 = new TreeSet<>();
t4.add("se");
t4.add(15);
t4.add('a');
t4.add(15);
System.out.println(t4);
输出结果如下:
但是可以通过重写内部比较器 Comparable来执行所需求的比较类型。
示例代码如下:
public class Hw_05 {
public static void main(String[] args) {
// TreeSet<employee> tree = new TreeSet<>();
// TreeSet<employee> tree = new TreeSet<>(new Dome());
/*匿名内部类
TreeSet<employee> tree = new TreeSet<>(new Comparator<employee>(){
@Override
public int compare(employee o1, employee o2) {
return o1.getAge() - o2.getAge();
}
});*/
TreeSet<employee> tree = new TreeSet<>((o1, o2) -> o1.getAge() - o2.getAge());
tree.add(new employee("迪迦", 18, 23000));
tree.add(new employee("盖亚", 19, 22000));
tree.add(new employee("戴拿", 20, 21000));
tree.add(new employee("梦比优斯", 20, 21000));
System.out.println(tree);
}
}
//comparator 外部比较器
//class Dome implements Comparator<employee> {
//
// @Override
// public int compare(employee o1, employee o2) {
// return o1.getAge() - o2.getAge();
// }
//
//
//}
class employee implements Comparable<employee> {
private String name;
private int age;
private double salary;
public employee() {
}
public employee(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "employee{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
@Override
//重写内部比较器
/**
* 若返回值为整数则升序排序 则代表this.大于o 否则就是小于
* 若返回值为0 则说他们相等,则去重
*/
public int compareTo(employee o) {
int a = Double.compare(this.salary, o.salary);//首先按工资比较,若this>o 则返回正数,否则返回负数。相等返回0
if (a == 0) {
if ((this.age - o.age) != 0) {
return this.age - o.age;
} else if (this.name.equals(o.name)) {
return 0;
} else {
return this.name.compareTo(o.name);
}
}
return a;
}
}
输出结果如下:
总结
今天主要学习了上述的知识。重点掌握了TreeSet重写比较器。明天加油!