Set集合中没有特有的方法,所有的方法直接继承自Collection。 Set集合组成:HashSet和TreeSet 1, HashSet:底层数据结构是哈希表,线程不同步,存取速度快。判断元素唯一方式:先判断元素的hashCode值是否相同,若相同,再判断元素的equals方法是否为true。 注意:子类LinkedHashSet基于哈希表,又融入了链表,可以对Set集合进行增删提高效率。 示例: - /*
- * 在hashSet集合中存入自定义对象,去除重复的元素,并取出元素
- * 思路:
- * 1,描述手机,对手机的一些属性进行封装
- * 2,定义容器,存入手机对象
- * 3,使用迭代器取出容器内的对象
- * 4,打印结果
- *
- * */
- import java.util.HashSet;
- import java.util.Iterator;
- public class HashSet1 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- HashSet<Phone> h = new HashSet<Phone>();
- h.add(new Phone("魅族", 5));
- h.add(new Phone("苹果", 4));
- h.add(new Phone("小米", 3));
- h.add(new Phone("华为", 4));
- h.add(new Phone("华为", 4));
- Iterator<Phone> it = h.iterator();
- while(it.hasNext()){
- Phone p = (Phone) it.next();
- System.out.println(p.getBRAND()+"---"+p.getSIZE());
- }
- }
- }
- class Phone{
- private String BRAND;
- private int SIZE;
- public Phone(String brand,int size) {
- // TODO Auto-generated constructor stub
- this.BRAND = brand;
- this.SIZE = size;
- }
- public String getBRAND() {
- return BRAND;
- }
- public void setBRAND(String bRAND) {
- BRAND = bRAND;
- }
- public int getSIZE() {
- return SIZE;
- }
- public void setSIZE(int sIZE) {
- SIZE = sIZE;
- }
- @Override
- public boolean equals(Object obj) {
- // TODO Auto-generated method stub
- if(!(obj instanceof Phone)){
- return false;
- }
- Phone p=(Phone)obj;
- return this.BRAND.equals(p.BRAND)&&this.SIZE==p.SIZE;
- }
- @Override
- public int hashCode() {
- // TODO Auto-generated method stub
- return this.BRAND.hashCode()+this.SIZE;
- }
- }
复制代码2, TreeSet:底层数据结构是二叉树结构。判断元素唯一方式:通过比较方法的return 0来判断元素是否相同。 treeSet可以对Set集合中的元素进行排序,原因是TreeSet类实现了Comparable接口,强制对元素进行比较。 两种排序方式: 1, 让元素自身具有比较性。也就是实现Comparable接口,覆盖compareTo方法,这种方式作为元素的自然排序,也可以说是默认排序。 示例: - import java.util.Iterator;
- import java.util.TreeSet;
-
- public class TreeSet1 {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TreeSet<Person1> t = new TreeSet<Person1>();
- t.add(new Person1("小明", 21));
- t.add(new Person1("小明", 21));
- t.add(new Person1("小明", 22));
- t.add(new Person1("小红", 21));
- t.add(new Person1("小刚", 23));
-
- Iterator<Person1> it = t.iterator();
- while(it.hasNext()){
- Person1 p = it.next();
- System.out.println(p.getName()+"---"+p.getAge());
- }
- }
-
- }
-
- class Person1 implements Comparable{
- private String name;
- private int age;
-
- public Person1(String name,int age) {
- // TODO Auto-generated constructor stub
- this.name = name;
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName()
- {
- return name;
- }
-
- public int getAge()
- {
- return age;
- }
-
- @Override
- public int compareTo(Object o) {
- // TODO Auto-generated method stub
- Person1 p = (Person1) o;
- if(this.age==p.age)
- return this.name.compareTo(p.name);
- return this.age-p.age;
- }
- }
复制代码
2,自定义比较器。若元素自身不具有比较性,或者元素自身具有的比较性不是自己所需要的,这时只能让容器自身具备。 示例: - import java.util.Comparator;
- import java.util.Iterator;
- import java.util.TreeSet;
-
- public class TreeSet2 {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TreeSet<Person2> t = new TreeSet<Person2>(new CompareTest());
- t.add(new Person2("小明", 21));
- t.add(new Person2("小明", 21));
- t.add(new Person2("小明", 22));
- t.add(new Person2("小红", 21));
- t.add(new Person2("小刚", 23));
-
- Iterator<Person2> it = t.iterator();
- while(it.hasNext()){
- Person2 p = it.next();
- System.out.println(p.getName()+"---"+p.getAge());
- }
- }
-
- }
-
- class Person2 implements Comparable{
- private String name;
- private int age;
-
- public Person2(String name,int age) {
- // TODO Auto-generated constructor stub
- this.name = name;
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName()
- {
- return name;
- }
-
- public int getAge()
- {
- return age;
- }
-
- @Override
- public int compareTo(Object o) {
- // TODO Auto-generated method stub
- Person2 p = (Person2) o;
- if(this.age==p.age)
- return this.name.compareTo(p.name);
- return this.age-p.age;
- }
- }
-
- //定义一个比较器,以姓名长度(name)和年龄(age)比较
- class CompareTest implements Comparator<Person2>{
-
- @Override
- public int compare(Person2 o1, Person2 o2) {
- // TODO Auto-generated method stub
- int res=new Integer(o1.getName().length()).compareTo(new Integer(o2.getName().length()));
- if (res==0)
- {
- return new Integer(o1.getAge()).compareTo(o2.getAge());
- }
- return res;
- }
-
- }
复制代码
那么多容器,如何判断容器的数据结构? 可以通过容器的命名就可以明确其数据结构: ArrayList:数组Array LinkedList:链表link HashSet、HashMap:哈希表hash TreeSet、TreeMap:二叉树tree
|