您的位置:首页 > 职场人生

黑马程序员--集合Set总结--java

2015-08-07 22:25 465 查看

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

集合Set总结

01、Set集合的特点

元素无序,唯一。

         注意:这里的顺序是指存储和取出顺序。

02、HashSet集合的特点

         (1)HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。

         (2)HashSet如何保证元素唯一性         

HashSet底层数据结构是哈希表。

通过分析源码,确定跟以下语句判断有关

e.hash == hash && ((k = e.key) ==key || key.equals(k))

                以上语句说明依赖两个方法:hashCode()和equals()

                顺序:

                           首先,判断hashCode()值是否相同。

                                     相同:

                                               继续走equals()方法,根据其返回值:

                                                        true:说明元素重复,不添加到集合。

                                                        false:说明元素不重复,添加到集合。

                                     不同:直接添加到集合。

         (3)怎么重写hashCode()和equals()方法呢?

                   hashCode():

                            把对象的所有成员变量值相加即可。

                            如果是基本类型,就加值。如果是引用类型,就加哈希值。

                   equals():

                            A:this==obj

                            B:! ( obj  instanceof Student )

                            C:所有成员变量的值比较。基本类型用==,引用类型用equals()。

 

         (4)开发中怎样重写hashCode()和equals()?

                自动生成,右键“source”,然后选择“Generate hashCode() and equals()”

注意:HashSet集合存储自定义对象时,需要去重写hashCode()和equals()

         (4)案例:

                   HashSet存储字符串并遍历案例:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetDemo {
publicstatic void main(String[] args) {
//创建集合对象
//Collection<String> c = new HashSet<String>();
//Set<String> set = new HashSet<String>();
//HashSet<String> hs = new HashSet<String>();

Set<String>set = new HashSet<String>();

//创建并添加元素
set.add("hello");
set.add("world");
set.add("java");
set.add("world");

//遍历
Iterator<String>it = set.iterator();
while(it.hasNext()) {
Strings = it.next();
System.out.println(s);
}

System.out.println("--------------");

for(String s : set) {
System.out.println(s);
}
}
}


03、TreeSet集合的特点

         (1)TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。

                     按照实际的需求,可以对元素进行排序。并且保证唯一。

         (2)怎么保证的呢?

                   排序:底层结构是二叉树。按照树节点进行存储和取出。

                            两种实现:

                                     A:自然排序(元素具备比较性)

                                               TreeSet的无参构造,要求对象所属的类实现Comparable接口。     

自定义Student类实现Comparable实例:      

public class Student implements Comparable<Student>{
privateString name;
privateint age;

publicStudent() {
}

publicStudent(String name, int age) {
this.name= name;
this.age= age;
}

publicString getName() {
returnname;
}

publicvoid setName(String name) {
this.name= name;
}

publicint getAge() {
returnage;
}

publicvoid setAge(int age) {
this.age= age;
}

//需求:我想按照对象的年龄排序,从小到大排序。怎么做?
//@Override
//public int compareTo(Student s) {
//// 需求是比较年龄
//int num = this.age - s.age;
//// 由于对象有多个成员变量,你不能根据其中的某一个决定其他的。
//// 当某一个相同的时候,你还需要判断其他的是不是也是相同的。
//int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
//return num2;
//}

//需求:我想按照姓名的长度排序,从小到大排序。怎么做?
@Override
publicint compareTo(Student s) {
//姓名的长度
intnum = this.name.length() - s.name.length();
//               System.out.println(num);
//很多时候,别人给我们的需求其实只是一个主要需要
//还有很多的次要需求是需要我们自己进行分析的。
//比较姓名的内容
intnum2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
//继续分析,姓名长度和内容都相同的情况下,年龄还可能不一样呢?
//所以,当姓名长度和内容都相同的时候,我们在比较下年龄就好了
intnum3 = (num2 == 0) ? (this.age - s.age) : num2;
returnnum3;
}
}


                                     B:比较器排序(集合具备比较性)

                                               TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。

                   唯一:根据返回值是否为0。

比较器排序实现方法一:自定义MyComparator类实现Comparator接口

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

@Override
publicint compare(Student s1, Student s2) {
//按年龄排序,从小到大
intnum = s1.getAge() - s2.getAge();
//次要条件
intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
returnnum2;
}
}


比较器排序实现方法二:匿名内部类

               

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

4000
@Override
publicint compare(Student s1, Student s2) {
//按年龄排序,从小到大
intnum = s1.getAge() - s2.getAge();
//次要条件
intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
returnnum2;
}
}

                   注意:

                            如果同时有两种方案,以比较器为主。

04、Collections工具类的使用

 面试题:
Collection和Collections的区别?

A:Collection是Collection体系的顶层接口,里面定义了这个体系中的共性方法.

B:Collections是针对Collection集合操作的工具类 里面一定了一些对集合操作的方法

比如 排序,查找,反转,最值,置换

public static void sort ( List list )

排序

public static <T> int binarySearch( List list, T key )

二分查找

public static void reverse( List list )

反转

public static T max( Collection coll )

最大值

public static void shuffle( List list )

随机置换.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: