集合(Set)学习笔记
(一)Set:无序(存入与取出是无序的),不可重复。HashSet:底层是哈希表。HashSet通过元素的hashCode()和equals()方法来保证元素的唯一性,如果hashCode相同才会调用equals方法。即先判断哈希值,若相等则调用equals方法在判断。线程非同步。
(二)TreeSet:可以对Set集合中的元素进行排序。
package cn.cx.collection.study;
import java.util.*;
publicclass SetDemo {
publicstaticvoid main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person(1,"zhansan"));
ts.add(new Person(6,"lisi"));
ts.add(new Person(3,"wanwu"));
ts.add(new Person(2,"chenxin"));
Iterator i = ts.iterator();
while(i.hasNext()) {
Person p = (Person)i.next();
System.out.println(p.toString());
}
}
===============person类必须实现Comparable接口==============
package cn.cx.collection.study;
publicclass Person implements Comparable {
intid;
String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public String toString() {
return"Person [id=" + id + ", name=" + name + "]";
}
publicint compareTo(Object o) {
if(!(o instanceof Person)) {
thrownew RuntimeException("Not Person");
}
Person p = (Person)o;
if(this.id>p.id)
return 1;
if(this.id==p.id)
returnthis.name.compareTo(p.name);//当主要条件相同时判断次要条件
return -1;
}
}
(三)TreeSet底层数据结构为二叉树。保证元素唯一性的依据是compareTo方法返回 0
(四)TreeSet的第二种排序方式:当元素自身不具备比较性,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。通过构造方法把自定义的比较器传进去。
package cn.cx.collection.study;
import java.util.*;
publicclass TreeSetDemo02 {
publicstaticvoid main(String[] args) {
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Person(1,"zhansan"));
ts.add(new Person(6,"lisi"));
ts.add(new Person(3,"wanwu"));
ts.add(new Person(2,"chenxin"));
System.out.println(ts);
}
}
class MyCompare implements Comparator {
publicint compare(Object o1, Object o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.name.compareTo(p2.name);
}
(五)练习:按字符串长度排序
package cn.cx.collection.study;
import java.util.Comparator;
import java.util.TreeSet;
publicclass TreeSetDemo01 {
publicstaticvoid main(String[] args) {
TreeSet<String> ts = new TreeSet<String>(new MyCompare0());
ts.add("alll");
ts.add("agsf");
ts.add("bba");
ts.add("amjjjjj");
ts.add("awwww");
ts.add("abb");
System.out.println(ts);
}
}
class MyCompare0 implements Comparator<String> {
publicint compare(String s1, String s2) {
if(s1.length()>s2.length()) {
return 1;
}
if(s1.length()==s2.length()) {
return s1.compareTo(s2);
}
return -1;
}
(六)泛型“< >”用来接收类型。将元素类型传到里面;当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型。
package cn.cx.collection.study;
import java.util.*;
publicclass GenericDemo {
publicstaticvoid main(String[] args) {
ArrayList<String> al1 = new ArrayList<String>();
al1.add("haha");
al1.add("hahe");
al1.add("hae");
al1.add("hah\\a");
ArrayList<Integer> al2 = new ArrayList<Integer>();
al2.add(1);
al2.add(4);
al2.add(5);
al2.add(0);
printCollec(al1);
printCollec(al2);
}
publicstaticvoid printCollec(ArrayList<?> al) { //”?”为通配符,匹配任何类型。
Iterator<?> i = al.iterator();
while(i.hasNext()) {
System.out.println(i.next());
}
}
(七)泛型限定:ArrayList<? extends Person> 集合里放Person及其子类,上限; ArrayList<? super E> 接收E类型或其父类,下限; “?”通配符,占位符。