泛型和容器--2--容器
一、数据集合(粗浅)
栈、队列、链表、数组、红黑树
1.栈(stack)
- 先进后出,(子弹弹夹)
- 栈的出入口都在栈的最顶端
- 压栈:存元素。把元素储存到栈的顶端位置,栈中已有元素以此向栈底方向移动一个位置。
- 弹栈:取元素。栈的顶端元素取出,向上移一个位置。
2.队列(queue)
- 先进后出
- 出入口不同侧
3.数组
- 增删慢,查询快。因为有索引,所以查询快,但是增删的话,需要创建一个新数组,再复制。
4.链表
- 多个节点之间,通过地址进行连接。
- 查找慢,增删快。
5.红黑树
- 二叉树:binary tree ,是每个结点不超过2的有序树(tree) 。二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。
- 红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然
是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
红黑树的约束:
- 节点可以是红色的或者黑色的
- 根节点是黑色的
- 叶子节点(特指空节点)是黑色的
- 每个红色节点的子节点都是黑色的
- 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
红黑树的特点:
速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍
二、集合collection
1、集合概述
1、1集合和数组(Array)的区别
数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
1、2集合的分类
集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection
和双列集合java.util.Map
Collection:单列集合的跟接口,两个重要的子接口java.util.List
和java.util.Set
List
的特点是元素有序、元素可重复。Set
的特点是元素无序,而且不可重复。
————————————————————————————————————
List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,
Set
接口的主要实现类有java.util.HashSet
和java.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.HashSet
、java.util.LinkedHashSet
这两个集合。
HashSet
- HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于:
hashCode
与equals
方法。 - 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中存放自定义类型元素时,需要重写对象中的hashCode
和equals
方法,建立自己的比较方式,才能保 证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--容器相关推荐
- java 有序容器_Java 容器集合框架概览
Java Collections Framework 集合的概念 集合collection,有时叫做容器container,把多个元素组成一个单元. 早期的Java (pre-1.2) 中包含了Vec ...
- C++中的容器(STL容器)container
1.容器 容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在STL中都被实现为容器.使用容器时,即将容器类模板实例化为容器类时,会指明容器中存放的元素是什么类型的 ...
- Docker 容器技术 — 容器存储
目录 文章目录 目录 容器存储 数据卷管理 挂载时创建卷 创建卷后挂载 数据容器管理 容器存储 数据卷管理 核心选项: -v 宿主机目录:指定挂载到容器内的目录. 映射多个宿主机目录,只需要多写几个 ...
- Docker 容器技术 — 容器网络
目录 文章目录 目录 CNM CNM 驱动接口 网络驱动 IPAM 驱动 Docker 原生网络驱动 Bridge 模式(默认) 用户自定义 Bridge 网络 Host 模式 外部访问容器(容器的端 ...
- Web服务器 Web容器 Servlet容器
WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是 ...
- docker 僵尸进程解决方案 Baseimage-docker,胖容器和“容器也是虚拟机”
Baseimage-docker 是针对 Docker 优化地 Ubuntu 最小化基础镜像.我们可以从 Docker 仓库中拉取回来作为基础镜像用在自己的镜像中. 笔者也算是 Docker 的早期使 ...
- 《Docker——容器与容器云》:第一章 从容器到容器云
2013年初,一个名字从云计算领域横空出世,并在整个IT行业激起千层浪.这就是Docker--一个孕育着新思想的"容器".Docker选择容器作为核心和基础,依靠容器技术支撑的Do ...
- Docker(二)容器操作容器
Docker架构(二)容器操作 容器是Docker的令一个可行概念,容器就是镜像的运行实例,是独立运行的一个或一组应用 (1)Docker容器的创建和启动 容器创建就是镜像加载过程 命令格式:dock ...
- 容器和容器镜像的区别,您真的了解吗
很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和Docker这几个词的区别和联系. 我们首先来看容器和容器镜像.举个例子,执行命令行docker search nginx,搜索结果的一条条记录 ...
- C++STL总结笔记(一)—— 容器和容器适配器
文章目录 前言 一.概念 1.1 顺序容器 1.2 容器适配器 1.3 关联容器 二.程序示例 1. vector和Set自定义数据类型的访问 2.vector容器嵌套 3.list容器排序 4.pa ...
最新文章
- 使用yum快速搭建LAMP和配置phpMyAdmin
- C语言中%c与%s的区别与划分
- Python: PyCharm中导入matplotlib时报错:“Backend Qt5Agg is interactive backend”的解决方案...
- linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
- 掌握 Linux 调试技术
- Linkerd2安装和使用
- 常用数据库连接方式url
- iOS端Mock GPS定位 —— 测试、开发、玩游戏、发朋友圈等等,你都用得上(转)
- listView的最简单的使用方法
- Maya API编程快速入门
- java推荐算法_Java编程实现基于用户的协同过滤推荐算法代码示例
- 计算机网络上级操作题,计算机网络上机操作试题答案.pdf
- 程序猿生存指南-2 抽奖事件
- Bootstrap插件(一)——模态框(modal.js)
- unity 多台 显示器 控制_设计专业显示器,哪些参数重要?明基PD2700U显示器给你答案...
- 整理所学|单片机原理及应用-第三版-张毅刚(一:考试要点)
- Delphi XE10 给地图层上面添加Android原生控件
- 追爱系列电影电视剧书籍
- HarmonyOS:实现Button按下后颜色加深的效果
- android 刻度,Android 绘制刻度表盘
热门文章
- 对实际电流源中内阻变化的简单分析
- 安全加密与证书签发工具--openssl
- Unity最新版打包AssetBundle和加载的方法
- ArcGIS 实验理论基础十五 空间查询
- 昨天学会2件事,一件是multisim 添加自定义模型或导入模型文件,包括opa695和9013等三极管
- axure转化成代码_​教大家如何查看Axure页面的代码
- RS-485电路设计及接口防护
- Python数据类型转换(str、float、int)
- php立方体相册源码,纯CSS实现3D的代码(正方体、动态立体图片册、平面的星空)...
- 【Lingo】分段函数