Java集合框架之Set
来源:互联网 发布:excel 数据透视图 编辑:程序博客网 时间:2024/05/22 13:16
1 集合类—SetNo15
【Set是Collection子接口,无序(指元素放入的顺序,有例外),不重复
因为无序,所以没有带有下标参数的方法】
【Set集合类常用的有:
HashSet:散列存放
TreeSet:有序存放
LinkedHashSet
Set接口存、取、删对象都有很高的效率。
】
1.1 HashSet
【HashSet不保存元素的加入顺序。
HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。
2:向HashSet中添加元素时,系统为保证不重复,先比较hashCode( ),如果相同,再比较equals(),如果还相同,则认为是同一个对象,不再加入,add(...)返回false。
---要存入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法。
---同一个对象的hash值一定相同,同一个hash值不一定是同一个对象,甚至可能是不同类的对象。
】
【
HashSet是Set的最常见实现类,数据存储的方式是哈希表<散列存储>
boolean add(E e)添加参数中的元素,并不是添加到末尾(因为是无序的,顺序没有意义),
添加成功返回true,失败返回false.当添加重复元素,就添加不进去,返回false.
Int size(); 返回元素的个数
没有get方法,可以用迭代器来遍历所有元素
不能有重复、相同元素,这个重复、相同的定义是什么?
【
1、 先比较两个对象的hashCode(),如果不同,则认为是不同元素,如果相同,需要再用equal
来判断两个元素
2、 如果用equal比较两个元素返回true,就认为是相同的,否则不同
】
TreeSet 是Set的实现类,数据存储方式是二叉树(红黑树)
LinkedHashSet 是改进版的HashSet,用链表的方式保存元素放进去
】
没有get(int index)方法,由于它是无序的,下标对它来说没有任何意义,所以没有一个方法是有下标的(Set、Collection都是这样)
要遍历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
【
1:TreeSet使用红黑树结构对加入的元素进行排序存放,输出时也会按排序后的顺序,所以放入TreeSet中元素必须是”可排序的”。
2:什么是 "可排序的"
《---加入TreeSet集合中的javabean类本身要实现Comparable['kɑmpərəbl]接口
------自定义一个实现Comparator['kɑmpə,retɚ]接口的比较器实现类,在创建TreeSet对象时,将自定义比较器传入构造方法
------如果加入的类”不可比较”,则add()方法在运行时会报错》
3:Comparable接口:
《所有"可排序"的类都必须实现java.lang.Comparable接口,实现该接口中的唯一方法:
public int compareTo(Object obj); 该方法如果
this:新加入对象,obj:集合中已经存在的对象.
返回 0,表示 this == obj,不加入集合
返回正数,表示 this > obj,this较大放后面
返回负数,表示 this < obj,this较小放前面
--- "可排序"的类通过Comparable接口的compareTo方法来确定该类对象的排序方式。
》
4:java.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有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序。
》
5:Collections类
《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
》
6:java提供的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]);
》
9:LinkedHashSet
《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,用链表的方式保持了元素放进去
的顺序
- JAVA集合框架之set
- Java集合框架之Set
- Java集合框架之Set
- Java集合框架之set
- java基础-- 集合框架 之 Set集合
- Java集合总结之Set整体框架
- Java基础--集合框架之Set
- Java 学习之集合框架---Set
- Java-集合框架Collection之Set(一)
- Java-集合框架Collection之Set(二)
- Java基础-集合框架之Set
- Java复习之集合框架Set接口
- JAVA集合框架之List Set接口
- 集合框架之Set
- java集合框架Set
- Java集合框架------Set
- Java常见集合框架(九):Set之Set、AbstractSet
- 奋斗黑马程序员----Java集合框架之Set集合
- redis
- 使用libnet与libpcap构造TCP/IP协议软件
- iOS开发之一篇文章学会页面传值详解 - 十种页面传值方法大全 swift 版本
- Android NDK: WARNING:jni/Android.mk: non-system libraries in linker flags: -lopencv_java3
- 安装VMware导致系统USB设备无法识别
- Java集合框架之Set
- mybatis 传入多个参数,存入orcale
- 为什么你要使用Java 8
- logshipping 14421问题解决
- 距离离开还有14天
- spring中少用的注解@primary解析
- ViewPager,实现真正的无限循环(定时+手动)
- AutoreleasePool详解和runloop的关系
- spring开发总结