List集合
java.util.List是Collection接口的子接口
特点
- 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的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去除重复元素的原理。
- 调用被添加元素的hashCode(),和HashSet中已有元素的hashCode比较是否相同
- 如果不相同,直接存储
- 如果相同,调用equals方法比较是否相同
- 不相同,直接存储元素
- 相同,认为是同一元素.不存储
可变参数的格式
修饰符 返回值类型 方法名称(参数类型... 可变参数的名称)
本质上其实就是一个数组,语法糖。
集合工具类
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两个接口的区别:
- Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
- Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。