一、数据集合(粗浅)

栈、队列、链表、数组、红黑树

1.栈(stack)


  • 先进后出,(子弹弹夹)
  • 栈的出入口都在栈的最顶端
  • 压栈:存元素。把元素储存到栈的顶端位置,栈中已有元素以此向栈底方向移动一个位置。
  • 弹栈:取元素。栈的顶端元素取出,向上移一个位置。

2.队列(queue)


  • 先进后出
  • 出入口不同侧

3.数组


  • 增删慢,查询快。因为有索引,所以查询快,但是增删的话,需要创建一个新数组,再复制。

4.链表


  • 多个节点之间,通过地址进行连接。
  • 查找慢,增删快。

5.红黑树


  • 二叉树:binary tree ,是每个结点不超过2的有序树(tree) 。二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。
  • 红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然
    是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
    红黑树的约束:
  1. 节点可以是红色的或者黑色的
  2. 根节点是黑色的
  3. 叶子节点(特指空节点)是黑色的
  4. 每个红色节点的子节点都是黑色的
  5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
    红黑树的特点:
    速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍

二、集合collection

1、集合概述

1、1集合和数组(Array)的区别

数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

1、2集合的分类
集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

Collection:单列集合的跟接口,两个重要的子接口java.util.Listjava.util.Set

List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。
————————————————————————————————————
List接口的主要实现类有java.util.ArrayListjava.util.LinkedList
Set接口的主要实现类有java.util.HashSetjava.util.TreeSet

1、3 Collection的常用方法

  • public boolean add(E e): 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把给定的对象在当前集合中删除。
  • public boolean contains(E e): 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 返回集合中元素的个数。
  • public Object[] toArray(): 把集合中的元素,存储到数组中。

2、集合的访问

2、1迭代器
迭代:先要判断集合中有无元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

迭代器常用方法

  • public Iterator iterator():返回集合对应的迭代器对象,用来遍历集合中的元素的。
  • public E next():返回迭代的下一个元素。
  • public boolean hasNext():如果仍有元素可以迭代,则返回 true。
        // 使用多态方式 创建对象Collection<String> hulu = new ArrayList<String>();// 添加元素到集合coll.add("爷爷");coll.add("大娃");coll.add("二娃");//使用迭代器 遍历   每个集合对象都有自己的迭代器Iterator<String> it = hulu.iterator();//  泛型指的是 迭代出 元素的数据类型while(it.hasNext()){ //判断是否有迭代元素String s = it.next();//获取迭代出的元素System.out.println(s);

如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。
增强for循环

for(type  elements : Collection集合or数组){ //代码块
}

三、集合的子接口

3.1List接口

3.1.1特性

  • 有序的存储集合。
  • 带索引的集合
  • 可以有重复的元素,通过元素的equals的方法来比较是否为重复元素

3.1.2常用方法

  • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index):返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

3.1.3子类

  • 原则:若要通过下标随机访问元素,但只在末尾处增删元素,应选用ArrayList类;需要在线性表任意位置进行增删,应选用LinkedList类。

  • ArrayList:增删慢,查找快。底层是数组

public ArrayList():创建初始容量是10的空数组列表
public ArrayList(int initialCapacity):创建初始容量为initialCapacity的空数组列表
public ArrayList(Collection<? extends E> c):创建包含容器c所有元素的数组列表,元素次序与c同。

  • LinkedList:底层是链表

public LinkedList():创建空的链表
public LinkedList(Collection<? extends E> c):创建包含容器c所有元素的链表。

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) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。

3.2Set接口

3.2.1特性

  • 无序
  • 不可重复

3.2.2哈希表

  • 在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低.JDK1.8中,哈 希表存储采用数组+链表+红黑树实现,当链表长度超过**阈值(8)**时,将链表转换为红黑树,这样大大减少了查找 时间。
  • 哈希集合是在元素的储存位置和元素的K之间和建立一个特定的对应关系f,使每一个元素与唯一的一个储存位置相对应。因而在查找时,只要根据元素的值K,计算f(K)即可,如果此元素在集合内,则一定在储存位置f(K)(即内存地址)上,因而不需要与集合其它元素进行比较便可获得所查元素。称这个对应关系为哈希(hash)函数,按这种关系建立的表称为哈希表,或者散列表。(图片来自黑马程序员教程)

3.2.3子类
Set 集合有多个子类,常用的是java.util.HashSetjava.util.LinkedHashSet这两个集合。


HashSet

  • HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于:hashCodeequals方法。
  • HashSet类无序,允许元素值为null
  • 判断两个加入哈希集合的元素是否相同时,先比较hashcode()返回值是否相同,如果相同,还要在比较equals()(内存地址),因为不同的元素哈希值可能相同,如果两者都相同,则视为相同元素。

⭐注意方法名的大小写

public HashSet(): 0创建初始值为16,默认上座率为0.75的空哈希表集合
public HashSet(int a):创建初始值为a,默认上座率为0.75的空哈希表集合
public HashSet(int a,float f):创建初始值为a,默认上座率为f的空哈希表集合
public HashSet(Collection<? extends E> c):创建包含容器c中所有元素,默认上座率为0.75的空哈希表集合

⭐*给HashSet中存放自定义类型元素时,需要重写对象中的hashCodeequals方法,建立自己的比较方式,才能保 证HashSet集合中的对象唯一。(示例来自黑马程序员)

 public class Student {     private String name;     private int age;  public Student() {}       public Student(String name, int age) {         this.name = name;         this.age = age;    }       public String getName() {         return name;    }       public void setName(String name) {         this.name = name;    }       public int getAge() {        return age;     }       public void setAge(int age) {        this.age = age;     }       @Override   //这次重写似乎着重的比较是在年龄  ⭐   public boolean equals(Object o) {         if (this == o)             ⭐              return true;         if (o == null || getClass() != o.getClass())             return false;         ⭐   Student student = (Student) o;         return age == student.age && Objects.equals(name, student.name);    ⭐     }      @Override    public int hashCode() {         return Objects.hash(name, age);     } }
public class HashSetDemo2 {
public static void main(String[] args) {        //创建集合对象   该集合中存储 Student类型对象         HashSet<Student> stuSet = new HashSet<Student>();         //存储          Student stu = new Student("于谦", 43);         stuSet.add(stu);         stuSet.add(new Student("郭德纲", 44));         stuSet.add(new Student("于谦", 43));         stuSet.add(new Student("郭麒麟", 23));         stuSet.add(stu);           for (Student stu2 : stuSet) {System.out.println(stu2);        }     } } 执行结果:Student [name=郭德纲, age=44] Student [name=于谦, age=43]Student [name=郭麒麟, age=23]

LinkedHashSet

  • 在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。
  • 有序

TreeSet

3.3Map(映射接口)

四、可变参数

  • 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格 式:

修饰符 返回值类型 方法名(参数类型… 形参名){ }

  • 其实这个书写完全等价与

修饰符 返回值类型 方法名(参数类型[] 形参名){ }

  • 只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。
    JDK1.5以后。出现了简化操作。 用在参数上,称之为可变参数。
public class KeBianCanShu {     public static void main(String[] args) {         int[] arr = { 1,2,3,4,5 };         int sum = qiuhe(arr);         System.out.println(sum);        // 求 这几个元素和 1 2 3 4 5        int sum2 = qiuhe(1,2,3,4,5);         System.out.println(sum2);   }       //可变参数写法     public static int qiuhe(int... arr) {         int sum = 0;         for (int a : arr) {             sum += a;         }         return sum;     } }

五、集合的常用功能

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。

  • public static void shuffle(List<?> list)打乱顺序 :打乱集合顺序。

  • public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。

  • public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排 序。

集合的排序

Comparable


这里是引用

Comparator


这里是引用

泛型和容器--2--容器相关推荐

  1. java 有序容器_Java 容器集合框架概览

    Java Collections Framework 集合的概念 集合collection,有时叫做容器container,把多个元素组成一个单元. 早期的Java (pre-1.2) 中包含了Vec ...

  2. C++中的容器(STL容器)container

    1.容器 容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在STL中都被实现为容器.使用容器时,即将容器类模板实例化为容器类时,会指明容器中存放的元素是什么类型的 ...

  3. Docker 容器技术 — 容器存储

    目录 文章目录 目录 容器存储 数据卷管理 挂载时创建卷 创建卷后挂载 数据容器管理 容器存储 数据卷管理 核心选项: -v 宿主机目录:指定挂载到容器内的目录. 映射多个宿主机目录,只需要多写几个 ...

  4. Docker 容器技术 — 容器网络

    目录 文章目录 目录 CNM CNM 驱动接口 网络驱动 IPAM 驱动 Docker 原生网络驱动 Bridge 模式(默认) 用户自定义 Bridge 网络 Host 模式 外部访问容器(容器的端 ...

  5. Web服务器 Web容器 Servlet容器

    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是 ...

  6. docker 僵尸进程解决方案 Baseimage-docker,胖容器和“容器也是虚拟机”

    Baseimage-docker 是针对 Docker 优化地 Ubuntu 最小化基础镜像.我们可以从 Docker 仓库中拉取回来作为基础镜像用在自己的镜像中. 笔者也算是 Docker 的早期使 ...

  7. 《Docker——容器与容器云》:第一章 从容器到容器云

    2013年初,一个名字从云计算领域横空出世,并在整个IT行业激起千层浪.这就是Docker--一个孕育着新思想的"容器".Docker选择容器作为核心和基础,依靠容器技术支撑的Do ...

  8. Docker(二)容器操作容器

    Docker架构(二)容器操作 容器是Docker的令一个可行概念,容器就是镜像的运行实例,是独立运行的一个或一组应用 (1)Docker容器的创建和启动 容器创建就是镜像加载过程 命令格式:dock ...

  9. 容器和容器镜像的区别,您真的了解吗

    很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和Docker这几个词的区别和联系. 我们首先来看容器和容器镜像.举个例子,执行命令行docker search nginx,搜索结果的一条条记录 ...

  10. C++STL总结笔记(一)—— 容器和容器适配器

    文章目录 前言 一.概念 1.1 顺序容器 1.2 容器适配器 1.3 关联容器 二.程序示例 1. vector和Set自定义数据类型的访问 2.vector容器嵌套 3.list容器排序 4.pa ...

最新文章

  1. 使用yum快速搭建LAMP和配置phpMyAdmin
  2. C语言中%c与%s的区别与划分
  3. Python: PyCharm中导入matplotlib时报错:“Backend Qt5Agg is interactive backend”的解决方案...
  4. linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
  5. 掌握 Linux 调试技术
  6. Linkerd2安装和使用
  7. 常用数据库连接方式url
  8. iOS端Mock GPS定位 —— 测试、开发、玩游戏、发朋友圈等等,你都用得上(转)
  9. listView的最简单的使用方法
  10. Maya API编程快速入门
  11. java推荐算法_Java编程实现基于用户的协同过滤推荐算法代码示例
  12. 计算机网络上级操作题,计算机网络上机操作试题答案.pdf
  13. 程序猿生存指南-2 抽奖事件
  14. Bootstrap插件(一)——模态框(modal.js)
  15. unity 多台 显示器 控制_设计专业显示器,哪些参数重要?明基PD2700U显示器给你答案...
  16. 整理所学|单片机原理及应用-第三版-张毅刚(一:考试要点)
  17. Delphi XE10 给地图层上面添加Android原生控件
  18. 追爱系列电影电视剧书籍
  19. HarmonyOS:实现Button按下后颜色加深的效果
  20. android 刻度,Android 绘制刻度表盘

热门文章

  1. 对实际电流源中内阻变化的简单分析
  2. 安全加密与证书签发工具--openssl
  3. Unity最新版打包AssetBundle和加载的方法
  4. ArcGIS 实验理论基础十五 空间查询
  5. 昨天学会2件事,一件是multisim 添加自定义模型或导入模型文件,包括opa695和9013等三极管
  6. axure转化成代码_​教大家如何查看Axure页面的代码
  7. RS-485电路设计及接口防护
  8. Python数据类型转换(str、float、int)
  9. php立方体相册源码,纯CSS实现3D的代码(正方体、动态立体图片册、平面的星空)...
  10. 【Lingo】分段函数