Collection集合的遍历方法
1. 迭代器
- 先获取集合的迭代器对象
- 方法:Iterator<E> iterator() 得到当前集合的迭代器对象
- 代码:Iterator<String> it = names.iterator();
- 使用whils循环通过对it.hasNext()询问是否有下一个元素
- 有就返回true然后进入循环通过it.Next()取出下一个元素
- 没有就返回false,结束循环
- 注意: 迭代器不能通过Next()去访问超过了最大个数的元素!!!
2. foreach
for(被遍历集合或者数组中元素的类型 变量名称 : 被遍历集合或者数组){
}
小结: foreach遍历原理就是迭代器,写法是简化写法
3. JDK1.8之后新增技术
- 集合对象.forEach(System.out::println);
Java数据结构
1. 什么是数据结构
- 数据结构指的是数据以什么方法组织在一起
- 不同的数据结构,增删改查的性能是不一样的
- 不同的集合底层会采用不同的数据结构,我们要知道集合的底层是基于哪种数据结构存储和操作数据的.
2. 常见数据结构
- 队列(queue)
先进先出,后进后出
场景:各种排队,叫号系统 - 栈(stack)
后进先出,先进后出
压栈 == 入栈
弹栈 == 出栈
场景:弹夹的装弹射击步骤 - 线性表(数组)
线性表是内存中的连续存储区域
分成若干等分的小区域(每个区域大小是一样的)
元素存在索引
特点: 查询元素快(根据索引快速计算出元素的地址,然后立即去定位)
增删元素慢(创建新数组,迁移元素) - 链表
元素不是内存中的连续区域存储
元素是游离存储的,每个元素会记录下一个元素的地址
特点: 查询元素慢
增删元素快 - 红黑树
二叉树: binary tree 永远只有一个根节点,是每个结点不超过2个节点的树(tree)
排序二叉树:小的左边,大的右边,但是可能树很高,性能变差.为了做排序和搜索!
红黑树(就是自平衡的排序二叉树):树尽量的保证到了很矮小,但是又排好序了,性能最高的树.增删改查性能都好!
List系列集合的使用
1. ArrayList
public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
2. LinkedList
底层是基于链表的,增删比较快,查询慢!!
-
所以LinkedList多了很多操作首尾元素的特殊功能
public void addFirst(E e):将指定元素插入此列表的开头。 public void addLast(E e):将指定元素添加到此列表的结尾。 public E getFirst():返回此列表的第一个元素。 public E getLast():返回此列表的最后一个元素。 public E removeFirst():移除并返回此列表的第一个元素。 public E removeLast():移除并返回此列表的最后一个元素。 public E pop():从此列表所表示的堆栈处弹出一个元素。 public void push(E e):将元素推入此列表所表示的堆栈。
Set系列集合的使用
1. HashSet
- 添加的元素,是无序,不重复,无索引的。
2. LinkedHashSet
- 添加的元素,是有序,不重复,无索引的。
3. Set系列集合元素去重复的流程
对于基本数据类型的值,Set集合可以直接判断进行去重复。
-
对于引用数据类型的值,Set集合是按照如下流程进行是否重复的判断。
Set集合会让两两对象,先调用自己的hashCode()方法得到彼此的哈希值(所谓的内存地址)
然后比较两个对象的哈希值是否相同,如果不相同直接认为两个对象不重复。
如果相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为真的重复了
如果不相同认为不重复。
调用hashCode()方法获取两个对象的哈希值 / \ false true / \ 不重复 两个对象进行equals比较 / \ false true / \ 不重复 重复了
4. Set系列集合元素无序的根本原因
- Set系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素。
小结
- Set集合的增删改查性能都挺好的!
- 缺点是:无序不重复的,无索引的。
- 对于引用数据类型,如果希望Set集合识别是同一个对象。
- 可以重写对象的hashCode和equals方法