java集合与底层实现(上)

集合的集成体系老大collection

java集合与底层实现(上)_第1张图片

常用方法

  • 添加:add(Object obj) ,addAll(collection c)
  • 删除:clear() ,remove(Object obj), removeAll(collection c)
  • 判断:contains(Object obj) ,containsAll(collection c) ,isEmpty()
  • 获取:iterator():迭代器:接口,遍历集合,具体实现是以内部类的方式实现的
Collection c = new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
   Object obj = it.next();
}
  • 长度:size()
  • 交集:retainAll(collection c)

List

有序(存储顺序和取出顺序一致),可重复

  • ArrayLIst 数据结构是数组,线程不安全
  • LinkedList 数据结构是链表(双向),线程不安全
  • Vector 数据结构是数组,线程安全(不常用)
  • copyOnWriteList 并发容器,线程安全(COW设计模式)
数据结构知识回顾
  • 单链表
    点中有指针域与数据域,指针域指向下一个节点
    java集合与底层实现(上)_第2张图片

    • 插入一个节点:insertNode.next = temp.next; temp.next = insertNode;
    • 删除一个节点:temp.next = temp.next.next;
    • 对链表进行排序,使用冒泡算法对其进行排序(确保)
    • 找到链表中倒数第k个节点,设置两个指针p1、p2,让p2比p1快k个节点,同时向后遍历,当p2为空,则p1为倒数第k个节点
    • 删除链表重复数据,操作跟冒泡排序差不多,只要它相等,就能删除了
    • 查询链表的中间节点,这个算法也挺有趣的:一个每次走1步,一个每次走两步,走两步的遍历完,然后走一步的指针,那就是中间节点
    • 递归从尾到头输出单链表,只要下面还有数据,那就往下找,递归是从最后往前翻。
  • 线性结构的应用—栈
    java集合与底层实现(上)_第3张图片

    • 进栈:newNode.next = stack.stackTop; // 栈顶本来指向的节点由新节点指向
      stack.stackTop = newNode; // 栈顶指针指向新节点
    • 遍历栈:while(stackTop != stack.stackBottom){
      stackTop = stackTop.next;
      }
    • 出栈:将栈顶的元素的指针(指向下一个节点)赋值给栈顶指针
      Stack.stackTop = stack.stackTop.next;
    • 清空栈:栈顶指向栈底,java自动释放内存资源
  • 线性结构的应用—队列
    java集合与底层实现(上)_第4张图片
    Front:指向第一个有效的元素 rear:最后一个有效数据的下一个
    算法:rear = (rear + 1)% 数组长度 (取rear节点的下一个节点的)
    判断队列是否满了:(queue.rear + 1)% 长度 = queue.front

    • 入队:queue.arrays[queue.rear] = value;
      Queue.rear = (queue.rear + 1) % 数组长度;
    • 遍历:只要front节点不指向rear节点,就可以一直输出
    • 出队:front指针往后移就是出队
      queue.front = (queue.front + 1) % 数组长度;
  • 二叉树
    java集合与底层实现(上)_第5张图片

  1. 静态创建二叉树:
    二叉树:每个节点最多两个儿子,树由节点组成
    节点:一个数据、两个指针(如果有儿子就指向儿子节点,没有节点就指向null)
    遍历:(通过中+先或中+后可以确定一颗二叉树)
    中序:根—左—右
    先序:左—根—右
    后序:左—右—根
 遍历树:方法preTraverseBTree(TreeNode node){
		输出(node.getValue);
		preTraverseBTree(node.getLeftTreeNode());
		preTraverseBTree(node.getRightTreeNode());}
		// 每个节点的遍历如果访问有孩子的节点,先处理孩子的—————递归思想
  1. 动态创建二叉树:(数组变为二叉树)
    二叉查找树创建:当前根节点的左边全部比根节点小,右边全部比根节点大
    java集合与底层实现(上)_第6张图片

Set

元素不可以重复,set集合的底层是map

  • HashSet:无序,允许为null,底层是HashMap(散列表+红黑树),线程不安全
  • TreeSet:有序,不允许为null,底层是TreeMap(红黑树),线程不安全
  • LinkedHashSet:迭代有序,允许为null,底层是HashMap+双向链表,线程不安全

你可能感兴趣的:(数据结构)