3.List、Set、哈希

List集合

java.util.List是Collection接口的子接口

特点

  1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

 

常用的实现类有:

1. ArrayList:底层使用的是数组。空间连续,查找快,增删慢。

2. LinkedList:底层使用的是链表。空间不连续,增删快,查找慢。

3. Vector:底层使用的也是数组,和ArrayList基本一样,不过线程安全。
 

Collection接口的方法,我都有。但是我还有自己特有的方法:

list增删改查

根据索引值,添加:

根据索引值,删除:

根据索引值,修改:

根据索引值,查询:

 

LinkedList当中特有的方法:

添加:

第一个索引值添加:

最后一个索引出添加:

删除第一个索引值处的元素以及删除最后一个:

LinkedHashSet是HashSet的子类。

底层其实也有哈希表,速度也比较快,但是额外还添加了一层双向链表,用来专门维护顺序。

 

LinkedList当中有两个与栈相关的方法:
相当于addFirst方法
相当于removeFirst方法
 

 

常见的数据结构

      1. 栈

      2. 队列

      3. 数组

      4. 链表

      5. 红黑树

      6. 哈希表

 

数组结构特点

      内存连续,所以查找快,增删慢。

 

单向链表结构特点

      内存不连续,所以增删快,查找慢。

      单向链表:一个方向,只知道下一个,不知道上一个

      双向链表:前后两个方向都行,既知道下一个,又知道上一个

     

栈结构特点

      先进后出(压箱底)

队列结构特点

      先进先出(排队)

红黑树

Set集合的特点

java.util.Set是Collection的子接口

特点:

      1. 不能重复

      2. 不保证先后顺序

      3. 没有索引值

 

常用子类:

1. HashSet:速度特别快,不保证顺序。

2. LinkedHashSet:速度也很快,但是还能额外保证顺序。

3. TreeSet:有大小排序功能。
 
 
HashSet集合是最常使用的Set集合,特点:

因为底层使用了一种名叫“哈希表”的数据结构,所以查找元素的速度嗷嗷快。底层原理其实是在复用HashMap。
 
 

 

哈希表

来自java.lang.Object当中的方法:

public int hashCode():根据当前对象,产生一个“哈希值”(对象的特征码)

    如果没有覆盖重写hashCode方法,那么Object当中的hashCode将会在JVM当中:

    默认使用对象的内存地址值参与运算,然后得到一个与地址相关的int数字:哈希值。

    只要内存够用,可以创建很多个对象,无数个不同的地址值。

    默认的哈希值只是使用了地址值参与运算而已,并不直接等于地址值。



无数种地址 --> 哈希运算hashCode() --> 42亿种int哈希值

意味着:可能有不一样的对象,哈希值是相同的。

 

特点:快

原因:先分类,再查找。

详细:   1. 哈希表本身是一个长度为16的数组

                 2. 每一个小格都是一个桶

                 3. 哈希冲突:不一样的对象被放在了一个桶当中

                 4. 加载因子:是一个百分比,是桶被占用的百分比

                 5. 再哈希:是重新再更加细致地分类。

 

- 使用HashSet集合存储自定义元素

      如果存储自定义的类,那么这个类必须要覆盖重写equals和hashCode方法。

hashCode方法的三条原则:

1. 运行期一致性。

2. 对象相同,那么哈希值必须相同。

3. 对象不同,那么哈希值不一定相同。

HashSet去除重复元素的原理。

  1. 调用被添加元素的hashCode(),和HashSet中已有元素的hashCode比较是否相同
  2. 如果不相同,直接存储
  3. 如果相同,调用equals方法比较是否相同
  4. 不相同,直接存储元素
  5. 相同,认为是同一元素.不存储

 

可变参数的格式

      修饰符 返回值类型 方法名称(参数类型... 可变参数的名称)

      本质上其实就是一个数组,语法糖。

集合工具类

      java.util.Collections

打乱顺序:shuffle

添加所有:addAll(有可变参数)

排序:   sort(List)

sort(List, Comparator)

Comparator比较器进行排序

      Comparable需要排序的类自己去implements实现它,然后口诀是:升序就是我减他。public int compareTo(T o)

   Comparator需要排序的类自己不用实现它,而是通过第二个参数外部指定,可以使用匿名内部类。口诀:升序就是一减二。public int compare(T o1, To2)

Comparable和Comparator两个接口的区别:

  1. Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
  2. Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

 

猜你喜欢

转载自blog.csdn.net/qq_40406929/article/details/81435358