请说明set接口的特点?
元素存取无序,没有索引、只能通过迭代器或增强 for 循环遍历,不能存储重复元素。
set接口的实现类有哪些?他们的底层实现是什么?分别有什么特点?
-
HashSet 集合,底层实现是哈希表,特点:集合元素可以是 null;对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致;没有索引,只能通过迭代器或增强 for 循环遍历;不包含重复元素,保证元素唯一性
-
LinkedHashSet,底层:哈希表和链表;特点:链表保证元素有序,也就是说元素的存储和取出顺序是一致的;哈希表保证元素唯一,也就是说没有重复的元素
-
TreeSet,底层数据结构是二叉树;特点:元素有序,可以按照一定的规则进行排序;集合中元素唯一; 没有索引、只能通过迭代器或增强 for 循环遍历
TreeSet 的排序方式有哪两种?
- 自然排序Comparable
- 比较器排序Comparator
在List集合内去除重复数字值,要求尽量简单(可借助其他集合!!)
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("2");
List<String> li=new ArrayList(new HashSet(list));
for (String s : li){
System.out.println(s);
}
2019年1月份的世界编程语言排行榜从高到低依次如下: Java、C、Python、C++、Visual Basic .NET、JavaScript… 请将以上语言名称作为字符串元素,按顺序存入set集合中,并遍历查看。要求存储和遍历的顺序保持一致。
LinkedHashSet<String> ha = new LinkedHashSet<>();
ha.add("Java");
ha.add("C");
ha.add("Python");
ha.add("Visual");
ha.add("Basic");
ha.add(".NET");
ha.add("JavaScript");
for (String s : ha){
System.out.println(s);
}
在某次考试中,学生的成绩信息如下(公有属性): 姓名(String) 年龄(int) 成绩(int): Tom 20 90; Jerry 22 95; John 20 100; Lily 22 100 ;Lucy 22 90; Kevin 22 90 请分别用Comparable和Comparator两个接口对以上同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序,成绩和年龄都一样,则按照姓名的字典顺序排序。
public class Student implements Comparable<Student> {
private String name;
private int age;
private int score;//成绩
public Student() {
}
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
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 int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(Student s) {
//返回值是负数:降序:大到小
//正数:升序
int num = s.score - this.score;
//年龄由小到大排序
int num1 = num == 0 ? this.age - s.age : num;
//按照姓名的字典顺序排序
return num1 == 0 ? this.name.compareTo(s.name) : num1;
}
}
测试类
TreeSet<Student> ha = new TreeSet<>();
Student b1 = new Student("Tom", 20, 90);
Student b2 = new Student("Jerry", 22, 95);
Student b3 = new Student("John", 20, 100);
Student b4 = new Student("Lily", 22, 100);
Student b5 = new Student("Lucy", 22, 90);
Student b6 = new Student("Kevin", 22, 90);
ha.add(b1);
ha.add(b2);
ha.add(b3);
ha.add(b4);
ha.add(b5);
ha.add(b6);
for (Student b : ha) {
System.out.println(b.getName()+"\t"+b.getAge()+"\t"+b.getScore());
}