
Java核心技术卷1读书笔记
Java核心技术卷1读书笔记
曲大人的猫
常常因为不够抽象导致不能写出更好的代码而自卑。
展开
-
12.2 线程状态
线程有以下6种状态 :当使用操作符创建一个线程是,如,这个线程还没有运行。这意味着它的状态是。一旦调用方法,线程就处于。一旦一个线程开始运行,它不一定始终保持运行。运行中的线程有时需要运行,让其他线程有机会运行。抢占式调度系统给每一个可运行的线程提供一个时间片来执行任务。当时间片用完时,操作系统剥夺该线程的运行权,并给另一个线程一个机会来运行。当选择下一个线城时,操作系统会考虑线程的优先级。12.2.3 阻塞和等待线程当线程处于阻塞或等待状态时,他暂时是不活动的。要由线程调度器重新激活这个线程。终原创 2024-12-16 18:31:27 · 349 阅读 · 0 评论 -
12.1 什么是线程
【代码】12.1 什么是线程。原创 2024-12-15 19:18:54 · 265 阅读 · 0 评论 -
12.0 导论
多线程程序在更低一层扩展了多任务的概念 : 单个程序看起来在同时完成多个任务。多线程与多进程之间的区别?本质上每个进程都有自己的一套变量,而每个进程则共享数据。中执行,线程是控制线程的简称。如果一个程序能同时运行多个线程,则称该程序为。线程(thread)原创 2024-12-15 19:17:36 · 78 阅读 · 0 评论 -
9.7 遗留的集合
Java1.0时就已经实现了。是一个特殊类型的映射结构。设计的并不好,不建议使用。中的方法都是同步的。如果要并发访问请使用。原创 2024-12-14 12:11:24 · 278 阅读 · 0 评论 -
9.6 算法
泛型集合接口有一个很大的优点,即算法只需要实现一次。原创 2024-12-13 11:05:12 · 207 阅读 · 0 评论 -
9.5 视图与包装器
keySet方法返回了一个实现了Set接口的类对象,由这个类的方法操纵原映射,这种集合称为视图。原创 2024-12-12 13:35:11 · 151 阅读 · 0 评论 -
9.4 映射
通常,我们知道些关键信息需要查找与之关联的元素,映射(map)数据结构就是为此设计的,映射用来存放键值对。原创 2024-12-11 12:14:29 · 239 阅读 · 0 评论 -
9.3 具体集合
如果一个链表有两个迭代器,一个迭代器在后面另一个在前面。如果在后面的迭代器删除了一个元素,此时在前的迭代器发现它的迭代器被另一个迭代器修改了,会抛出一个。要想查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。中的元素可以按照任意的顺序插入,但会按照有序的顺序进行检查。散列表为每个对象计算一个整数,称为。在Java中,散列表用链表数组实现,每个列表被称为。接口的类对象,也可以保存构造器中提供的。封装了一个动态再分配的对象数组。在Java中所有的链表都是。原创 2024-12-10 15:05:04 · 249 阅读 · 0 评论 -
9.2 集合框架中的接口
接口会提供用于排序的比较器对象,这两个接口定义了可以得到集合子集视图的方法。元素会增加到容器中的特定位置。方法:只要两个集包含同样的元素就认为它们是相等的,方法要保证包含相同元素的两个集会得到同样的散列码。,来限制只有实现此接口类才能使用随机访问。接口,不过其方法的行为有更严谨的定义。方法不允许添加重复的元素。原创 2024-12-09 16:44:18 · 169 阅读 · 0 评论 -
9.1 Java集合框架
接口提供了统一的方法,如果想要更换具体的实现方式时,只需要在定义集合时更改即可,而无需更改其他地方的代码。,它保留了少量需要用户自己实现的方法,提供了大量实用方法。如队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并可以查找出在队列元素中的个数。开头的类,这些类是为类库的实现者而设计的,如果你想要实现自己的。接口,提供这些方法将变得异常麻烦,因此Java类库提供了。中声明了一些实用方法,每个类都必须要提供这些方法。接口的对象,这个接口只包含一个抽象方法。在Java类库中,集合类的基本接口是。原创 2024-12-09 16:43:20 · 134 阅读 · 0 评论 -
8.9 反射和泛型
匹配,编译器可以推断出这个方法将返回一个。参数的类型变量有时会很有用。原创 2024-12-08 14:20:54 · 136 阅读 · 0 评论 -
8.8 通配符匹配
带有超类型限定的通配符允许你写入一个泛型对象,而带有子类型限定的通配符允许你读取一个泛型对象。这就是引入有限定的通配符的关键之处。可以区分安全的访问器和不安全的更改器方法了。通配符限定与类型限定十分类似,但有一个附加能力,既可以指定一个。的超类型,可以为方法提供参数,但不能作为返回值。在通配符类型中,允许类型参数发生变化。还可以使用根本无限定的通配符,例如。说实话,不太理解,为什么用不了。这小节后面的没看懂,以后补吧。本质的不同在于: 可以用任意。方法不能被调用,甚至不能用。类型,它的类型参数是。原创 2024-12-08 14:20:20 · 297 阅读 · 0 评论 -
8.7 泛型类型的继承规则
【代码】8.7 泛型类型的继承规则。原创 2024-12-07 21:36:21 · 86 阅读 · 0 评论 -
8.6 限制与局限性
这里将讲解一些Java泛型使用时要考虑的限制,大多数限制是由类型擦除引起的。原创 2024-12-07 21:35:47 · 428 阅读 · 0 评论 -
8.5 泛型代码和虚拟机
虚拟机没有泛型类型对象 – 所有对象都属于普通类。原创 2024-12-06 16:44:32 · 602 阅读 · 0 评论 -
8.4 类型变量的限定
如果有一个类作为限定,它必须是限定列表中的第一个限定。T 和 限定类型可以是类,也可以是接口。方法类程序就会报错,可以对元素进行限制。有时,类或方法需要对类型变量加以约束。一个类型变量或通配符可以有多个限定,如。的代码中,如果用户传入了一个没有实现。的原因是它更接近子类型的概念。在这里要求元素必须实现。分隔,而类型变量使用。原创 2024-12-05 19:30:21 · 174 阅读 · 0 评论 -
8.3 泛型方法
方法会求出这组元素的最大值。这里有一个具有泛型方法的类。方法接受一组元素,然后。原创 2024-12-05 15:03:34 · 129 阅读 · 0 评论 -
8.2 定义简单泛型类
是一个简单的泛型类,它有两个类型参数。可以使用具体的类型替换类型变量来。就是有一个或多个类型变量的类。原创 2024-12-04 13:54:59 · 423 阅读 · 0 评论 -
8.1 为什么要使用泛型程序
意味着编写的代码可以对多种不同类型的对象重用。原创 2024-12-04 13:54:27 · 146 阅读 · 0 评论 -
7.5 日志
要生成简单的日志记录,可以使用全局日志记录器。看不懂,日后来补吧。原创 2024-12-03 15:36:25 · 248 阅读 · 0 评论 -
7.4 使用断言
断言是一种测试和调式阶段使用的战术性工具,与之不同,日志是一种在程序整个生命周期都可以使用的战略性工具。有些类不是类加载器加载的,而是由虚拟机来加载。可以使用这些开关有选择地启用或禁用那些类中的断言。断言机制允许在测试期间向代码插入一些检查,而在生产代码中会自动删除这些检查。不必重新编译程序来启用或禁用断言。在默认情况下,断言是禁用的,可以在运行程序时用。禁用断言时,类加载器会去除断言代码。部分的唯一目的是产生一个消息字符串。对象并不储存具体的表达式值。Java引入了关键字。什么时候使用断言呢?原创 2024-12-02 13:45:49 · 160 阅读 · 0 评论 -
7.3 使用异常的技巧
异常处理不能代替简单的测试。不要过分地细化异常。充分利用异常层次结构。不要压制异常。早抛出,晚捕获。原创 2024-12-01 11:23:45 · 123 阅读 · 0 评论 -
7.2 捕获异常
如果发生了某个异常,但没有在任何地方捕获这个异常,程序就会终止,并在控制台上打印一个消息,其中包括对这个异常的类型和一个堆栈轨迹。是程序执行过程中某个特定点上所有挂起的方法调用的一个列表。当Java程序因为一个未捕获的异常而终止时,就会显示堆栈列表。语句块种可以捕获多个异常处理类型,并对不同类型的异常做出不同的处理。有的时候我的异常是因为别的地方的错误所导致的,此时可以使用异常链。有时产生了一个异常,但你想在抛出去之前做一些操作,然后再抛出去。捕获你知道如何处理的异常,抛出你不知道处理的异常。原创 2024-11-30 13:23:31 · 572 阅读 · 0 评论 -
7.1 处理错误
在Java中,如果某个方法不能正常的途径完成他的任务,可以通过另一个途径退出方法。此时方法不需要返回值,而是抛出(throw)一个封装了错误消息的对象。这个方法将会立刻退出,并不返回任何值。也不会中调用这个方法的代码执行,取而代之的是,异常处理机制开始搜索能够处理这种异常的。原创 2024-11-30 13:21:49 · 381 阅读 · 0 评论 -
7.0 导论
如果因为程序的错误或外部环境的影响,导致用户在运行期间所做的工作全部丢失,用户可能就不会使用这个程序了。原创 2024-11-30 13:21:11 · 137 阅读 · 0 评论 -
6.5 代理
利用代理proxy可以在运行时创建实现了一组给定接口的新类。只有在编译时无法确定实现哪个接口时才会使用代理。原创 2024-11-29 09:27:54 · 270 阅读 · 0 评论 -
6.4 服务加载器
实现类可以放在任意的包中,而不一定是服务接口所在的包,每个实现类必须有一个无参构造器。有时会开发采用一个服务架构的应用,可以用于开发环境,应用服务器和其他复杂的应用。JDK提供了一个加载服务的简单机制,这种机制由Java平台模块系统提供支持。方法会返回一个迭代器来迭代处理所提供的所有服务实现。在完成准备工作后,程序可以如下初始化一个服务加载器。定义一个接口,其中包含各个实例应当提供的方法。类可以很容易地加载符合一个公共接口的服务。服务提供者可以提供一个或多个实现服务的类。现在把这些类的类名增加到。原创 2024-11-29 09:25:48 · 211 阅读 · 0 评论 -
6.3 内部类
内部类是定义在另一个类中的类。原创 2024-11-28 11:54:49 · 499 阅读 · 0 评论 -
6.2 lambda 表达式
来修饰注解这个接口,这表明该接口是一个函数式接口,如果你无意中又在接口中添加了一个抽象方法,编译器会报错。表达式可以捕获外围作用域中变量的值,但你不能更改这个值,也就是说被捕获的变量必须是实际最终变量。对要比较的对象应用这个函数,然后对返回的键完成比较。,它指示编译器生成一个函数式接口的实例,覆盖这个接口的抽象方法来调用给定方法。对于只有一个抽象方法的接口,需要用到这种接口的对象时,就可以提供一个。表达式是一个可传递的代码块,可以在以后执行一次或多次。方法引用不能独立存在,总是会转换为函数式接口的实例。原创 2024-11-27 09:24:08 · 493 阅读 · 0 评论 -
6.1 接口
默认的克隆操作是“浅拷贝”,并没有克隆对象中引用的其他对象,也就是说克隆的对象和被克隆的对象共享了同一个引用的对象。一书中提到使用抽象类主要的用途是提醒程序员,例如希望父类中的某一方法被子类重写,可以将方法定义为抽象方法,这样可以强制要求程序员重写此方法。通常的做法是将静态方法放在伴随类中。因为在Java中是单继承的,每个类都只能继承一个类,但每个类可以实现多个接口。可以看见最后一项的值是一样的,因为默认的方法是浅拷贝,会共享引用的对象。在java中,接口不是类,而是对希望符合这个接口的类的一组需求。原创 2024-11-26 18:50:50 · 1161 阅读 · 0 评论 -
6.0 导论
内部类定义在另一类的内部,它们的方法可以访问包含它们的外部类的字段。内部类技术在设计具有相互协作关系的类集合时很有用。, 这是一种实现任意接口的对象,代理是一种非常专业的构造工具,可以用来构建系统级的工具。, 接口用于描述类应该做什么,而不指定它们具体应该怎么做。原创 2024-11-26 18:50:13 · 99 阅读 · 0 评论 -
5.7 反射
反射库()提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵java代码的程序。原创 2024-11-26 18:49:07 · 1192 阅读 · 0 评论 -
5.6 枚举类
这个枚举类有四个实例,再也不能创建新的实例了。也可以为枚举类增加构造器,方法和字段。下面是一个枚举类的定义。下面两种写法都是错误的。原创 2024-11-26 18:46:10 · 175 阅读 · 0 评论 -
5.5 参数数量可变的方法
如上所述,可变参数必须放在参数列表的最后。如果有其他参数,必须在可变参数前面。:你可以在方法中定义多个参数,但只有最后一个参数可以是可变参数。:可变参数会被转换为数组,你可以像操作普通数组一样访问它们。会打印 “No numbers provided.”。可以提供参数数量可变的方法(有时这些方法被称为变参。作为方法的最后一个参数时,可以接受任意数量的。数组将是一个空数组。下面是一个使用可变参数的例子。:如果你不传递任何参数,原创 2024-11-26 18:45:36 · 140 阅读 · 0 评论 -
5.4 对象包装器与自动装箱
编译器在生成类的字节码时,会加入必要的方法,虚拟机只是执行这些字节码。通常这些类被称为包装类(Wrapper)这些类有显而易见的名字。前六个派生自公共超类。原创 2024-11-26 18:44:26 · 202 阅读 · 0 评论