Java集合框架之Set

来源:互联网 发布:excel 数据透视图 编辑:程序博客网 时间:2024/05/22 13:16

1      集合类—SetNo15

SetCollection子接口,无序(指元素放入的顺序,有例外),不重复

因为无序,所以没有带有下标参数的方法

Set集合类常用的有:

         HashSet:散列存放

         TreeSet:有序存放

         LinkedHashSet

Set接口存、取、删对象都有很高的效率。

1.1    HashSet

HashSet不保存元素的加入顺序。

HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。

2:向HashSet中添加元素时,系统为保证不重复,先比较hashCode( ),如果相同,再比较equals(),如果还相同,则认为是同一个对象,不再加入,add(...)返回false

---要存入HashSet集合的自定义类型的对象通常需要重写hashCode()equals()方法。

---同一个对象的hash值一定相同,同一个hash值不一定是同一个对象,甚至可能是不同类的对象。

HashSetSet的最常见实现类,数据存储的方式是哈希表<散列存储>

boolean  add(E e)添加参数中的元素,并不是添加到末尾(因为是无序的,顺序没有意义),

添加成功返回true,失败返回false.当添加重复元素,就添加不进去,返回false.

Int size();    返回元素的个数

没有get方法,可以用迭代器来遍历所有元素

 

不能有重复、相同元素,这个重复、相同的定义是什么?

 

1、  先比较两个对象的hashCode(),如果不同,则认为是不同元素,如果相同,需要再用equal

来判断两个元素

2、  如果用equal比较两个元素返回true,就认为是相同的,否则不同

 

TreeSet 是Set的实现类,数据存储方式是二叉树(红黑树)

LinkedHashSet 是改进版的HashSet,用链表的方式保存元素放进去

没有get(int index)方法,由于它是无序的,下标对它来说没有任何意义,所以没有一个方法是有下标的(SetCollection都是这样)

要遍历HashSet必须使用Iterator或者增强型for循环

boolean remove(Object o) 从set中移除参数中的元素,如果成功则返回true

boolean contains(Object o) 如果当前集合包含参数中的元素,返回true,否则返回false

 

1.2    哈希表

首先计算放入元素的hashCode,hashCode根据一定算法得到一个下标(一般使用直接取余法,直接除以表、数组的长度取余数),然后将这个元素放在数组中的下标的位置

 

HashSet中所指的重复,如何才能两个两个对象是重复的对象?

1、首先判断两个对象的hashCode(),如果不同则认为是不同的对象

2、如果hashCode()相同,那么还要使用这个元素类的equals()进行比较,如果返回false,则认为是不同的元素对象,反之是相同元素对象

 

(对元素的hash码用直接取余法进行操作,可以快速地对HashSet中的元素进行访问(相对于ArrayList、LinkedList,HashSet定位某个值很快)

将hash码除以数组的长度取余,余数作为存储在数组中的下标位置

如果两个元素使用直接取余法获得的下标相同,那么就用链表的形式将其进行存储;要访问一个元素,首先使用直接取余法直接定位到散列数组的某个位置,然后如果这个位置的第一个元素不是要找的元素,那就遍历这个链表直到找到。)

 

1.3    TreeSet

         1TreeSet使用红黑树结构对加入的元素进行排序存放,输出时也会按排序后的顺序,所以放入TreeSet中元素必须是”可排序的”。

         2:什么是 "可排序的"

---加入TreeSet集合中的javabean类本身要实现Comparable['kɑmpərəbl]接口

------自定义一个实现Comparator['kɑmpə,retɚ]接口的比较器实现类,在创建TreeSet对象时,将自定义比较器传入构造方法

------如果加入的类”不可比较”,add()方法在运行时会报错》

         3Comparable接口:

《所有"可排序"的类都必须实现java.lang.Comparable接口,实现该接口中的唯一方法:

public int compareTo(Object obj); 该方法如果

this:新加入对象,obj:集合中已经存在的对象.

返回 0,表示 this == obj,不加入集合

返回正数,表示 this > obj,this较大放后面

返回负数,表示 this < obj,this较小放前面

--- "可排序"的类通过Comparable接口的compareTo方法来确定该类对象的排序方式。

         4java.util.Comparator<T>

《使用Comparable接口定义排序顺序有局限性:实现此接口的类只能按compareTo(T t)

的这一种方式排序。

----如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类)

--- Comparator<T>接口中的比较方法:

public int compare(T a, T b); 该方法如果

返回 0,表示 a== b

返回正数,表示 a> b

返回负数,表示 a< b

--- TreeSet有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序。

5Collections

java.util.Collections类是操作集合的工具类,提供了一些静态方法实现了基于集合的一些常用算法。

void sort(List list) 根据元素的自然顺序对指定List列表按升序进行排序。List列表中的所有元素都必须实现 Comparable 接口,否则编译报错。

void shuffle(Listlist) 对List列表内的元素进行随机排列

void reverse(Listlist) 对List列表内的元素进行反转

void copy(List dest,List src) 将src列表内的元素复制到dest列表中,要求dest列表的现有长度大于等于src列表的现有长度,否则运行时会出现IndexOutOfBoundsException

 

6java提供的copy方法

Collections:

static void copy(Listdest, List src) 将src列表内的元素复制到dest列表中

Arrays:

static int[]copyOf(int[] original, int newLength)
          
复制指定的数组,截取或用 0填充(如有必要),以使副本具有指定的长度。

System:

static void  arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
          
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

7:集合与数组的相互转换

Arrays类的方法   [数组]集合

static <T> List<T>  asList(T... a) 返回一个受指定数组支持的固定大小的列表,例如:

Integer [] arr = {1,2,3};//必须是引用数据类型

List<Integer> list = Arrays.asList(arr);

String[] arr2 = new String[] {"1","2"};

List<String> list = Arrays.asList(arr2);

8:集合与数组的相互转换

Collection接口的方法 集合[数组]

Object[] toArray()

              返回包含此 collection中所有元素的Object数组。

<T> T[] toArray(T[] a)
       
返回包含此 collection中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

List list = new ArrayList();

list.add("1");list.add("2");

int size = list.size();//获取集合的大小

String[] arr = (String[])list.toArray(newString[size]);

9LinkedHashSet

LinedHashSet根据元素的哈希码进行存放,同时用链表记录元素的加入顺序。》

 

【《有序存放》

不可重复、无序

Add(E  e)添加元素,重复的添加不进去

Int  size()   返回的长度

 

Iterator  iterator() 生成迭代器对象,用于遍历这个set,虽然TreeSet不保持元素放进的顺序,但会对这些元素排序。

 

注意:要将元素放入TreeSet,必须满足两个条件之一:

1、  放入的元素实现Comparable接口

Comparable接口有一个抽象方法,int  compareTo(E e),当一个元素添加到TreeSet

需要和其中原有的元素进行比较,比较的逻辑就写在compareTo()的实现方法中

Int compareTo(E  e)参数为要比较的对象,如果按照这个逻辑比较下来,当前放入的元素

在括号里的元素前面,就返回-1,在后面,返回1,相等则返回0.

2、  TreeSet传入一个Comarator对象

不需要改变元素类,需要定义一个类实现Comparator比较器接口,实现其中的int

Compare(Object ol,Object  o2)方法,实例化这个类,并传入TreeSet的构造方法

《Compare方法中,两个参数表示要比较的对象,返回值表示排列顺序,如果哦排在o2

后面,返回正数,相同返回0》

 

Comparable方式和Comparator方式可以同时存在,此时Comparator方式的逻辑优先

 

TreeSet 基于树的Set实现类,会自动排序(根据元素大小进行升序排列,和HashSet所说无序不一样,可以说TreeSet也是无序(放入的顺序丢失)的,但是可以对元素进行排序),从Set那里继承了不可重复的特性

它的主要方法和HashSet差不多

 

Comparable 可比较的,是一个接口,有一个抽象方法

int compareTo(Object o)参数是要比较的对象,返回值是表示比较结果的数字,这是一个回调方法,我们需要将我们的比较逻辑写进这个方法,让系统去调用它来进行比较排序

TreeSet要正常运作,有两种方式:

1、让元素类型实现Comparable接口,并在实现方法中写上比较逻辑

2、元素可以不实现Comparable接口,但是要在TreeSet的构造方法中传入一个对象,这个对象是Comparator接口的实现类

Comparator比较器 ,是一个接口,代表了比较的逻辑,其中有个抽象方法int compare(Object o1,Object o2)参数表示要比较的两个对象,返回值根据<0==0  >0 来决定哪个对象排在前面

这种方式将比较的逻辑和模型分离,更符合面向对象的思想

 

数组、List也可以使用Comparator方式进行排序

Arrays.sort()

Collections.sort()

 

Comparator方式也可以用于数组以及List的排序

Arrays.sort(T[] arr,Comparator c)

Collections.sort(List l,Comparator c)

 

1.4    LinkedHashSet

是改进版的HashSet,用链表的方式保持了元素放进去

的顺序

4 0
原创粉丝点击