HashSet的算法

一、集合:

1、特点:存储对象;长度可变;存储对象的类型可不同;

2、集合框架:

2Collection

(1)List:有序的;元素可重复,有索引

(add(index, element)、  add(index, Collection)、  remove(index)、  set(index,element)、  get(index)、  subList(from, to)、 listIterator())

    ①ArrayList:底层是数组结构,查询快,增删慢,不同步。

    ②LinkedList:底层是链表结构,增删快,查询慢,不同步

      addFist();addLast()  getFirst();getLast()

      removeFirst();removeLast() 获取并删除元素,无元素将抛异常:NoSuchElementException

      替代的方法(JDK1.6):

      offerFirst();offerLast();

      peekFirst();peekLast();无元素返回null

      pollFirst();pollLast();删除并返回此元素,无元素返回null

    ③Vector:底层是数组结构,线程同步,被ArrayList取代了

    注:对于判断是否存在,以及删除等操作,以依赖的方法是元素的hashCode和equals方法

    ArrayList判断是否存在和删除操作依赖的是equals方法

(2)Set:无序的,无索引,元素不可重复

  ①HashSet:底层是哈希表,线程不同步,无序、高效

    保证元素唯一性:通过元素的hashCode和equals方法。若hashCode值相同,则会判断equals的结果是否为true;hashCode不同,不会调用equals方法

    LinkedHashSet:有序,是HashSet的子类

  ②TreeSet:底层是二叉树,可对元素进行排序,默认是自然顺序

  保证唯一性:Comparable接口的compareTo方法的返回值

===》TreeSet两种排序方式:两种方式都存在时,以比较器为主

第一种:自然排序(默认排序):

添加的对象需要实现Comparable接口,覆盖compareTo方法

第二种:比较器

添加的元素自身不具备比较性或不是想要的比较方式。将比较器作为参数传递进去。

定义一个类,实现Comparator接口,覆盖compare方法。当主要条件相同时,比较次要条件。

3)Map集合:

(1)HashTable:底层数据结构是哈希表,不可存入null键和null值。同步的

Properties继承自HashTable,可保存在流中或从流中加载,是集合和IO流的结合产物

(2)HashMap:底层数据结构是哈希表;允许使用null键和null值,不同步,效率高

TreeMap:

底层数据结构时二叉树,不同步,可排序

与Set很像,Set底层就是使用了Map集合

方法:

V put(K key, V value) ;  void putAll(Map m)

void clear();  V remove(Object key)

boolean containsKey(Object key);  containsValue(Object key);  isEmpty()

V get(Object key); int size(); Collection<V> values()

Set<K> keySet();  Set<Map.Entry<K,V>> entrySet()

2.3、Map集合两种取出方式:

第一种:Set<K> keySet()

取出Map集合中的所有键放于Set集合中,然后再通过键取出对应的值

Set<String> keySet = map.keySet();

Iterator<String> it = keySet.iterator();

while(it.hasNext()){

String key = it.next();

String value = map.get(key);

//…..

}

第二种:Set<Map.Entry<K,V>> entrySet()

取出Map集合中键值对的映射放于Set集合中,然后通过Map集合中的内部接口,然后通过其中的方法取出

Set<Map.Entry<String,String>> entrySet = map.entrySet();

Iterator<Map.Entry<String,String>> it = entrySet.iterator();

While(it.hasNext()){

Map.Entry<String,String> entry = it.next();

String key = entry.getKey();

String value = entry.getValue();

//……

}

2.4、Collection和Map的区别:

Collection:单列集合,一次存一个元素

Map:双列集合,一次存一对集合,两个元素(对象)存在着映射关系

2.5、集合工具类:

Collections:操作集合(一般是list集合)的工具类。方法全为静态的

sort(List list);对list集合进行排序; sort(List list, Comparator c) 按指定比较器排序

fill(List list, T obj);将集合元素替换为指定对象;

swap(List list, int I, int j)交换集合指定位置的元素

shuffle(List list); 随机对集合元素排序

reverseOrder() :返回比较器,强行逆转实现Comparable接口的对象自然顺序

reverseOrder(Comparator c):返回比较器,强行逆转指定比较器的顺序

2.6、Collection和Collections的区别:

Collections:java.util下的工具类,实现对集合的查找、排序、替换、线程安全化等操作。

Collection:是java.util下的接口,是各种单列集合的父接口,实现此接口的有List和Set集合,存储对象并对其进行操作。

3、Arrays:

用于操作数组对象的工具类,全为静态方法

asList():将数组转为list集合

好处:可通过list集合的方法操作数组中的元素:

isEmpty()、contains()、indexOf()、set()

弊端:数组长度固定,不可使用集合的增删操作。

如果数组中存储的是基本数据类型,asList会将数组整体作为一个元素存入集合

集合转为数组:Collection.toArray();

好处:限定了对集合中的元素进行增删操作,只需获取元素

时间: 2024-11-19 21:36:12

HashSet的算法的相关文章

hashSet的底层是数组,其查询效率非常高

如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率. 我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的).例子: public int hashCode(){ return name.hashcode()+age; } 这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的. 使用has

list,set,map总结

学习了集合,脑子里list,set,map之间的关系有混乱,在这里整理一下.有兴趣的朋友可以看下. 先看下 list,set,map各自的特点 List:     索引数组:在内存空间上是连续的,计数也是连续的,总体就是有序的.下标是从0开始的,挨个递增的数组,可以通过数字下标找到相应的元素   关联数组:在内存空间上是连续的,计数不是连续的,就是无序的.下标是字符串的数组,可以通过下标这个字符串去找相对应的元素    ArrayList():        List接口的大小可变数组的实现.实

Java:集合类的区别详解

Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可变 List: 有顺序的,元素可以重复 遍历:for .迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的Lis

JAVA的面向对象编程--------课堂笔记

JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.   为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参

JAVA的面向对象编程

面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象. 为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参数,也可能有返回值. 注意区分:对象(本身).对象的实现者.

[转]Java五个最常用的集合类之间的区别和联系

常用的集合类有一下几种: List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类 Map结构的集合类:HashMap类,Hashtable类 Set结构的集合类:HashSet类,TreeSet类 Queue结构的集合:Queue接口 HashMap和Hashtable的区别: HashMap和Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点 以下是他们的区别: 1.历史原因: Hashtable是基于陈旧的Dicti

夯实Java基础(十九)——集合

1.前言 集合在Java中的地位想必大家都知道,不用多BB了.无论是在我们现在的学习中还是在今后的工作中,集合这样一个大家族都无处不在,无处不用.在前面讲到的数组也是一个小的容器,但是数组不是面向对象对象的,它存在明显的缺陷,而集合恰好弥补了数组带来的缺陷.集合比数组更加灵活.更加实用.而且不同的集合框架可用于不同的场景. 我们简单来比较一下数组和集合区别: 1.数组能存放基本数据类型和对象,而集合类中只能存放对象. 2.数组容量固定无法动态改变,集合类容量可以动态改变. 3.数组无法判断其中实

202. Happy Number【leetcode】java,hashSet,算法

202. Happy Number Write an algorithm to determine if a number is "happy". A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the

记一次诡异的bug调试——————关于JDK1.7和JDK1.8中HashSet的hash(key)算法的区别

现象: 测试提了一个bug,我完全复现不了,但是最吊诡的是在其他人的机器上都可以复现.起初以为是SVN合并后出现的冲突,后来经过对比法排查: step 1: 我本地开两个jetty,一个跑合并之前的版本,一个跑合并之后的版本,数据库.redis配置都一样的,结果一致,由此可以推测应该不是代码的问题. step 2: 我电脑和别人电脑同样的配置.连的一个数据库,同样的代码.同样的数据,得到了两个结果,我这里是正常的,而且除了我其它人都可以复现,我喵了狗.... 我还一度以为是灵异现象....o(╯