Java核心技术 卷1-总结-15

news2024/11/15 11:40:44

自己实现的hashCode方法应该与equals方法兼容

Java核心技术 卷1-总结-15

  • 视图与包装器
    • 子范围
    • 不可修改的视图
    • 同步视图
    • 受查视图
  • 并发
    • 线程状态
      • 新创建线程
      • 可运行线程
      • 被阻塞线程和等待线程
      • 被终止的线程

视图与包装器

子范围

可以为很多集合建立子范围(subrange)视图。 例如,假设有一个列表staff,想从中取出第10个~第19个元素。可以使用subList方法来获得一个列表的子范围视图。

List group2 = staff.subList(10,20);

第一个索引包含在内,第二个索引则不包含在内。与String类的substring操作中的参数情况相同。

可以将任何操作应用于子范围,并且能够自动地反映整个列表的情况。例如,可以删除整个子范围:

group2.clear();// staff reduction

现在,元素自动地从staff列表中清除了,并且group2为空。

对于有序集和映射,可以使用排序顺序而不是元素位置建立子范围。SortedSet接口声明了3个方法:

SortedSet<E> subSet(E from,E to)
SortedSet<E> headSet(E to)
SortedSet<E> tailSet(E from)

这些方法将返回大于等于from且小于to的所有元素子集。有序映射也有类似的方法:

SortedMap<K,V> subMap(K from,K to)
SortedMap<K,V> headMap(K to)
SortedMap<K,V> tailMap(K from)

返回映射视图,该映射包含键落在指定范围内的所有元素。

不可修改的视图

Collections中的方法还可以产生集合的不可修改视图(unmodifiable views)。这些视图对现有集合增加了一个运行时的检查。如果发现试图对集合进行修改,就抛出一个异常,同时这个集合将保持未修改的状态。
可以使用下面8种方法获得不可修改视图:

Collections.unmodifiableCollection 
Collections.unmodifiablelist 
Collections.unmodifiableSet 
Collections.unmodifiableSortedSet
Collections.unmodi fiableNavigableSet 
Collections.unmodi fiableMap 
Collections.unmodifiableSortedMap Collections.unmodifiableNavigableMap

每个方法都定义于一个接口。例如,Collections.unmodifiableList与ArrayList、LinkedList 或者任何实现了List接口的其他类一起协同工作。
例如,假设想要查看某部分代码,但又不触及某个集合的内容,就可以进行下列操作:

List<String> staff = new LinkedList<>();
lookAt(Collections.unmodifiableList(staff));

Collections.unmodifiableList方法将返回一个实现List接口的类对象。其访问器方法将从staff集合中获取值。lookAt方法可以调用List接口中的所有方法,而不只是访问器。但是所有的更改器方法(例如,add)已经被重新定义为抛出一个UnsupportedOperationException异常,而不是将调用传递给底层集合。

不可修改视图并不是集合本身不可修改。仍然可以通过集合的原始引用(在这里是staff)对集合进行修改。并且仍然可以让集合的元素调用更改器方法。

视图只是包装了接口而不是实际的集合对象,所以只能访问接口中定义的方法。例如,LinkedList类的方法addFirstaddLast,都不是List接口的方法,不能通过不可修改视图进行访问。
●注意:unmodifiableCollection方法(与synchronizedCollectioncheckedCollection方法一样)将返回一个集合,它的equals方法不调用底层集合的 equals方法。而是继承了Object类的equals方法,这个方法只是检测两个对象是否是同一个对象。如果将集或列表转换成集合,就再也无法检测其内容是否相同了。视图就是以这种方式运行的,因为内容是否相等的检测在分层结构的这一层上没有定义妥当。视图将以同样的方式处理hashCode方法。但是,unmodifiableSet类和unmodifiableList类却使用底层集合的equals方法和hashCode方法。

同步视图

如果由多个线程访问集合,就必须确保集不会被意外地破坏。 例如,如果一个线程试图将元素添加到散列表中,同时另一个线程正在对散列表进行再散列,其结果将是灾难性的。

类库的设计者使用视图机制来确保常规集合的线程安全,而不是实现线程安全的集合类。 例如,Collections类的静态synchronizedMap方法可以将任何一个映射表转换成具有同步访问方法的Map:

Map<String, Employee> map = Collections.synchronizedMap(new HashMap<String,Employee>());

现在,就可以由多线程访问map对象了。像getput这类方法都是同步操作的,即在另一个线程调用另一个方法之前,刚才的方法调用必须彻底完成。

受查视图

“受查”视图用来对泛型类型发生问题时提供调试支持。实际中将错误类型的元素混入泛型集合中的问题极有可能发生。例如:

ArrayList<String> strings = new ArrayList<>();
ArrayList rawList = strings; // warning only,not an error,for compatibility with legacy code 
rawList.add(new Date()); // now strings contains a Date object!

这个错误的add命令在运行时检测不到。相反,只有在稍后的另一部分代码中调用get方法,并将结果转化为String时,这个类才会抛出异常。受查视图可以探测到这类问题。下面定义了一个安全列表:

List<String> safeStrings = Collections.checkedList(strings, String.class);

视图的add方法将检测插入的对象是否属于给定的类。如果不属于给定的类,就立即抛出一个ClassCastException 这样做的好处是错误可以在正确的位置得以报告:

ArrayList rawList = safeStrings;
rawList.add(new Date());// checked list throws a ClassCastException

注意:受查视图受限于虚拟机可以运行的运行时检查。例如,对于ArrayList<Pair <String>>,由于虚拟机有一个单独的"原始"Pair类,所以,无法阻止插入Pair。

并发

线程状态

线程可以有如下6种状态:

  • New(新建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(终止)

要确定一个线程的当前状态,可调用getState方法。

新创建线程

当用new操作符创建一个新线程时,如 new Thread(r),该线程还没有开始运行。它的状态是new 当一个线程处于新建状态时,程序还没有开始运行线程中的代码。在线程运行之前还有一些基础工作要做。

可运行线程

一旦调用start方法,线程处于runnable状态。 一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。(Java的规范说明没有将它作为一个单独状态。一个正在运行中的线程仍然处于可运行状态。)

一旦一个线程开始运行,它不必始终保持运行。 运行中的线程被中断,目的是为了让其他线程获得运行机会。线程调度的细节依赖于操作系统提供的服务。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。在具有多个处理器的机器上,每一个处理器运行一个线程,可以有多个线程并行运行。当然,如果线程的数目多于处理器的数目,调度器依然采用时间片机制。

在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(这就是为什么将这个状态称为可运行而不是运行)。

被阻塞线程和等待线程

当线程处于被阻塞或等待状态时,它暂时不活动。它不运行任何代码且消耗最少的资源。直到线程调度器重新激活它。 细节取决于它是怎样达到非活动状态的。

  • 当一个线程试图获取一个内部的对象锁(而不是java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。
  • 当线程等待另一个线程通知调度器一个条件时,该线程自己进入等待状态。在调用Object.wait方法或Thread.join方法,或者是等待java. util.concurrent库中的LockCondition时,就会出现这种情况。被阻塞状态与等待状态有很大不同。
  • 有几个方法有一个超时参数。调用它们导致线程进入计时等待(timed
    waiting)状态。这一状态将一直保持到超时期满或者接收到适当的通知。带有超时参数的方法有Thread.sleepObject.waitThread.joinLock.tryLock
    以及Condition.await的计时版。
    在这里插入图片描述

上图展示了线程可以具有的状态以及从一个状态到另一个状态可能的转换。当一个线程被阻塞或等待时(或终止时),另一个线程被调度为运行状态。当一个线程被重新激活(例如,因为超时期满或成功地获得了一个锁),调度器检查它是否具有比当前运行线程更高的优先级。如果是这样,调度器从当前运行线程中挑选一个,剥夺其运行权,选择一个新的线程运行。

被终止的线程

线程因如下两个原因之一而被终止:

  • 因run方法正常退出而自然死亡。
  • 因一个没有捕获的异常终止了run方法而意外死亡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——朴素贝叶斯

目录 一、贝叶斯 1.什么是贝叶斯 3.贝叶斯下的朴素贝叶斯 二、朴素贝叶斯 1.高斯朴素贝叶斯 2.伯努利朴素贝叶斯 3.多项式朴素贝叶斯 前言 在所有的机器学习分类算法中&#xff0c;朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法&#xff0c;比如决策…

【业务数据分析】—— 用户留存分析(以挖掘Aha时刻为例)

目录 一、用户留存是什么 二、为什么要考虑用户留存 1、为什么要考虑用户留存&#xff1f; 2、影响用户留存的可能因素 3、用户留存的3个阶段 三、怎么进行用户留存分析(挖掘Aha时刻) 1、Aha时刻 2、Aha时刻的作用 3、挖掘Aha时刻 一、用户留存是什么 在互联网行业中…

Three——二、加强对三维空间的认识

Three——二、加强对三维空间的认识 接上个例子我们接着往下看 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 使用方法&#xff1a; // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THRE…

Jetson nano B01学习笔记 -- 系统环境配置以及ROS安装

文章目录 一、Jetson nano 简介二、 系统环境配置1、系统镜像烧录2、CUDA环境配置 三、 ROS安装和环境配置总结 一、Jetson nano 简介 Jetson Nano是一款体积小巧、功能强大的人工智能嵌入式开发板&#xff0c;于2019年3月由英伟达推出。它预装Ubuntu 18.04LTS系统&#xff0c;…

有什么好用的远程工具吗

沟通在任何类型的工作中都扮演着重要的角色。但当谈到远程工作时&#xff0c;这一点就更为重要。因此&#xff0c;您的组织必须找到可以让您的团队保持一致的工具。 在某些方面&#xff0c;项目管理扮演着类似的角色。 您会注意到&#xff0c;下面的大多数工具都会直接影响您的…

Android进阶宝典—Koin使用和原理分析

一、理解设计模式 控制反转 是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。 实现控制反转最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&#xff0c;依赖注入(Dependency Injection)和控制反…

提高硬件设计能力的学习路线

不懂硬件的人&#xff0c;会觉得硬件高深莫测&#xff0c;“为什么他改几个电阻、电容就调出来&#xff0c;我弄个半天没搞定&#xff1f;”&#xff0c;“噢&#xff0c;靠的是经验”&#xff0c;但是经验又是什么呢&#xff1f;不能形容&#xff0c;反正就是不明觉厉。 就是…

Git(版本控制:前端git使用全流程)

1.版本控制&#xff08;简单理解&#xff1a;就是软件对每次操作之后提交的记录&#xff09; 文件版本 版本控制软件 版本控制的好处 版本控制的分类 本地版本控制系统 集中化版本控制系统 分布式版本控制系统 2. Git基础概念与工作流程 什么是Git&#xff1f; 开源的…

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机&#xff1f;&#xff1f;&#xff1f; 单片机编程中的裸机系统和多任务系统.1 裸机系统1.1轮询系统1.2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统&#xff1f;&#xff1f;4 怎么学习Free…

诊断CAPL自动化(6) —— 诊断自动化测试,实战演示

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 下图是UDS协议测试的部分测试用例,该表格在文章末尾网盘自己获取经过前面几…

Cesium实践(4)——空间数据加载

文章目录 前言几何形体点线面体 标签文字图标 几何文件GeoJsonKMLCZML 三维模型总结 前言 本文介绍Cesium如何加载空间数据&#xff0c;空间数据即明确定义在三维空间中的数据&#xff0c;空间数据包括以下几类&#xff1a;1、几何形体&#xff08;点、线、面、体&#xff09;…

“支付+SaaS”赋能传统产业数字化转型

易观&#xff1a;传统支付业务利润空间在政策监管和市场竞争下不断被压缩&#xff0c;多家上市支付机构逐步将业务经营重点转移切入到企业交易环节&#xff0c;为企业提供包括SaaS服务、行业解决方案、营销服务及金融科技服务等在内的企业服务收入成为新的增长点。 伴随着“十四…

OSCP-AuthBy(Server 2008提权)

目录 扫描 FTP WEB 提权 扫描 nmap -sV -sC -p- 192.168.73.46 FTP 检查端口21上的匿名登录 导航到accounts目录,可以观察ftp服务上的帐户 Offsec, anonymous, admin

Java8函数式编程(Lambda表达式,Stream流,Optional)

一.函数式编程思想 面向对象思想主要是关注对象能完成什么事情&#xff0c;函数式编程思想就像函数式&#xff0c;主要是针对数据操作&#xff1b;代码简洁容易理解&#xff0c;方便于并发编程&#xff0c;不需要过分关注线程安全问题 二.lambda表达式 1.概念 lambda表达式…

提升金融写作效率:金融校对软件的优势与应用

金融行业的写作任务繁重且要求高度专业&#xff0c;涉及财务报告、研究报告、合同、政策文件等各类文档。金融校对软件应运而生&#xff0c;为金融专业人士提供有效的支持&#xff0c;帮助他们提高写作效率和质量。本文将探讨金融校对软件的优势与应用。 一、金融校对软件的优势…

【NFS共享存储服务】

目录 一、NFS (Network File System&#xff09;网络文件系统1.1、NFS工作原理1.2、举例1.2.1、共享文件总结 一、NFS (Network File System&#xff09;网络文件系统 依赖于RPC (远端过程调用) 需安装nfs-utils、rpcbind软件包 系统服务: nfs、rpcbind 共享配置文件: /etc/ex…

跳表的实现

目录 简介跳表的实现 简介 skiplist本质也是一种查找结构&#xff0c;和搜索树、哈希表一样可以作为key或者key/value模型的查找结构&#xff0c;从命名可以看出它也是一个链表结构&#xff0c;链表的查找效率是O(n),作为在链表基础上优化的一种查找结构&#xff0c;跳表的查找…

app拉新充场代理

我认为您可能是想了解APP充值拉新软件的功能吧。通常&#xff0c;APP充值拉新软件会具有以下功能&#xff1a; 充值服务&#xff1a;提供多种支付方式&#xff0c;让用户方便快捷地进行充值操作。 活动推广&#xff1a;通过不同的方式&#xff0c;如折扣、优惠码等&…

Tomcat的部署和优化

Tomcat的组件构成 &#xff08;1&#xff09;Web 容器&#xff1a;完成 Web 服务器的功能。 &#xff08;2&#xff09;Servlet 容器&#xff1a;名字为 catalina&#xff0c;用于处理 Servlet 代码。 &#xff08;3&#xff09;JSP 容器&#xff1a;用于将 JSP 动态网页翻译成…

centos系统安装mysql8.0

centos系统安装mysql8.0 环境说明开始1、查看centos7中是否有MariaDB&#xff0c;MariaDB与MySQL关系请自行查阅2、如果有MariaDB&#xff0c;需要将 步骤1 中查询到的mairadb全部卸载&#xff0c;否则MySQL安装会出现问题3、查看本机是否已经安装过MySQL4、如果安装过MySQL&am…