《Java核心技术 卷1》

2023-05-16

目录

第4章 对象和类

<1>静态字段和静态方法

<2>初始化块

<3>定义抽象类的对象变量

<4>hashCode方法得到散列码

<5>虚拟机中的泛型类型信息

第五章 继承

第6章.接口、Lambda表达式与内部类

第7章 异常、断言和日志 

<1>捕获多个异常

<2> try-with-resource机制

第9章 集合

第12章 并发

中断线程

重入锁

条件对象

同步块

并行数组算法

任务和线程池

进程 Process


第4章 对象和类

<1>静态字段和静态方法

class Employee{
    private static int nextId= 1;
    private int id;
    ....

}

每一个Employee对象都有一个自己的id字段,但是这个类的所有实例将共享一个nextId字段,换句话说,如果有1000个Employee类对象,则有1000个实例字段id,分别对应一个对象,但是只有一个静态字段nextId,即使没有Employee对象,静态字段nextId也存在,它属于类,而不属于任何单个的对象。

<2>初始化块

class Employee{
    private static int nextId;
    private int id;
    //对象初始化块
    {
        id = nextId;
        nextId++;
    }

}

<3>定义抽象类的对象变量

但是这样一个变量只能引用非抽象对象

//p是一个抽象类型Person的变量
Person  p = new Student("wang wu","zhao si");

<4>hashCode方法得到散列码

散列码是由对象导出的一个整型值,散列码是没有规律的,如果x和y是两个不同的对象,x.hashCode()和y.hashCode基本上不会相同

由于hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值由对象存储地址得出

var s = "OK";
var sb = new StringBuilder(s);
System.out.println(s.hashCode()+" "+sb.hashCode());

var t = new String("OK");
var tb = new StringBuilder(t);
System.out.println(t.hashCode()+" "+tb.hashCode());

//输出
对象  散列码
s     2556
sb    20526976
t     2556
tb    20527114

注意:1、重写equals方法时一定要重写hashCode方法

          2、重写toString()方法是也需要重写hasCode方法

<5>虚拟机中的泛型类型信息

Java泛型的突出特征之一是在虚拟机中擦除泛型类型

第五章 继承

1、Class类

在程序运行期间,Java运行时系统始终为所有对象维护一个运行时类型。

Object类中的getClass()方法将会返回一个Class类型的实例

​
Employee e;

Class cl = e.getClass();
//获取类的名称,输出 (包路径).Employee
e.getClass().getName();
//对象的名称,输出 Employee类中字段为name的值
e.getName();

​

使用静态方法forName获得类名对应的Class对象

String className = "java.util.Random";
Class cl = Class.forName(className);

虚拟机位每一个类型管理一个唯一的Class对象。因此,可以利用 == 运算符实现两个对象的比较

if(e.getClass() == Employee.class)....

结果是相等的

getComponentType方法的使用

List<String> list = new ArrayList();
Class cl = list.getClass();
//获取数组的泛型类型,String
Class componentType  = cl.getComponentType();
//创建新的数组
Object newArray = Array.newInstance(componentType,10);

建议:

不要滥用反射

反射机制使人们可以在运行时查看字段和方法,从而能编写出更具通用性代码程序。这种功能对于编写系统程序极其有用,但是同程不适于编写应用程序。反射是很脆弱的,如果使用反射,编译器将无法帮助你查找错误,因为只有运行时才会返现错误并导致异常。

第6章.接口、Lambda表达式与内部类

代理是一种非常专业的构造工具,可以用来构建系统系统的工具

Arrays类中的sort方法承诺可以对对象数组进行排序,但要求满足下面这个条件,对象所属的类必须实现Compare接口

假设希望使用Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现Compare接口。

public compareTo(Object otherObject){
    Employee other  =(Employee)otherObject;
    return Double.compare(salary,other.salary);
}

第7章 异常、断言和日志 

<1>捕获多个异常

try{

    //....
}
catch(FileNotFoundException | UnknownHostException e){
    //....
}
catch(IOException e){
    //....
}
//只有当捕获的异常类型彼此之间不存在子类关系时才需要这个特性

<2> try-with-resource机制

首先被自动关闭的资源需要实现Closeable或者AutoCloseable接口,因为只有实现了这两个接口才可以自动调用close()方法去自动关闭资源。写法为try(){}catch(){},将要关闭的外部资源在try()中创建,catch()捕获处理异常。其实try-with-resource机制是一种语法糖,其底层实现原理仍然是try{}catch(){}finally{}写法

public  static void main(String[] args){

    try(FileInputStream inputStream = new FileInputStream(new File("test"))){
         System.out.println(inputStream.read());    
    }
    catch(IOException e){
        throw new RuntimeExption(e.getMessage(),e)
    }
}

第9章 集合

<1> 集合接口和实现分离

队里通常有两种实现方式,一种使用循环数组,另一种是使用链表

循环数组是一个有界集合,即容量有限。如果程序中收集的对象数量没有上限,就最好使用链表实现

如果需要一个循环数组队列,可以使用ArrayDeque类,如果需要一个链表队列,就直接使用LinkedList类,这个类实现了Queue接口

<2> 迭代器

用foreach循环可以更加简练地表示同样的循环操作

  List<String> list = new ArrayList<>();
  list.add("A");
  list.add("B");
  Iterator<String> iterator = list.iterator();
  while (iterator.hasNext()) {
      String value = iterator.next();
  }

<3>集Set

Set接口等同于Collection接口,Set的add方法不允许添加重复的元素

<4>链表

数组和数组列表所有一个重大的缺陷,就是从数组中删除一个元素开销很大,其原因是数组中位于被删除元素之后的所有元素都要向数组的前端移动。在数组中间插入一个元素也是如此。

<5>队列与双端队列

队列允许你搞笑地在尾部添加元素,并在头部删除元素。双端队列允许在头部和尾部高效的添加和删除元素。

boolean offerFirst(E elemnt);

boolean offerLast(E element);

将给定的对象添加到双端队列的对头和队尾,如果队列满了,不会报异常

E pollFirst();

E pollLast();

删除并返回双端队列的元素,如果队列为空,不会报异常

E peekFirst();

E peekLast();

返回双端队列对头的元素,但不删除

<6>优先队列

优先队列(priority queue) 中的元素可以按照任意的顺序插入,但会按照有序的顺序进行检索。也就是说,无论何时调用remove方法,总会获得当前队列中最小的元素,不过,优先队列并没有对所有元素进行排序。

<7>堆

堆是一个可以自己组织的二叉树,其添加和删除操作可以让最小的元素移动到根,而不必花费时间对元素进行排序。

<8>Map

orgListMap.forEach((k,v)->{

    //....

});
替换成
for (Map.Entry<Integer, List<String>> mapItem : orgListMap.entrySet()) { 
    ///....
 }

<9>枚举集合映射

EnumSet

<10>Collections.synchronizedMap

Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理)

可以多线程访问这个map对象。类似get和put等方法都是同步的,另一个线程才能调用一个方法。

<11>简单算法

Collections.replace(words,"C++","java");

将word列表中为“C++”的值替换成“Java”

<12>批操作

coll1.retainAll(coll2);//从coll1中删除所有未在coll2中出现的元素,求交集

<13>将列表转换为数组

String[] values = staff.toArray(new String[0]);

<14>栈

java.util.Stack

E push (E item);//将item压入栈并返回item

E pop(); //弹出并返回栈顶的item,如果栈为空,不要调用这个方法

E peek();//返回栈顶元素,但不弹出,如果栈为空,不要调用这个方法

<15>属性映射

property map是一个特殊类型的映射结构,

  • 键和值都是字符串
  • 这个映射可以容易地保存到文件以及文件加载
  • 有一个二级表存放默认值

第12章 并发

void join(long mills);

等待指定的线程终止或者等待经过的毫秒数

中断线程

当线程的run方法执行方法中的最后一条语句再执行return语句返回时,或者出现了方法中没有捕获的异常时,线程将终止。

重入锁

ReentrantLock()//构建一个重入锁,可以用来保护临界区

ReentrabtLock( boolean fair);//构造一个采用公平策略的锁。一个公平锁倾向于等待时间最长的线程。不过,这种公平锁保证可能严重影响性能,所以,默认情况下,不要求是公平的。

条件对象

Condition condition;//创建条件对象

condition.await();//当前线程暂停,并放弃锁,这就允许了另一个线程执行。

condition.signalAll();//这个调用会重新激活等待这个条件的所有线程,当这些线程从等待集中移出时,他们再次成为可运行的线程,调度器最终再次将他们激活。

注意:

signalAll调用不会立即激活一个等待的线程。它只会解除等待线程的阻塞,使这些线程可以在当前线程释放之后再竞争访问对象。signal方法只是随机地选择等待集合的一个线程,并解除这个线程的阻塞。

同步块

每个Java对象都有一个锁,线程可以通过同步方法获得锁,还有另一种机制可以获得锁,即进入一个同步块。

synchronized(obj){
  //....
}

并行数组算法

Arrays.paralleSort(words,Comparator.comparing(String::length));

任务和线程池

当run方法退出时,这个线程不会死亡,而是留在线程池中准备下一个请求提供服务

Executor中的BlockingQueue的作用:

如果提交的任务数多余空闲线程数,就把未得到的服务的任务放到队列中,当其他任务完成后再提交运行这些排队的任务。

进程 Process

Process process = new ProcessBuilder("/bin/ls","-l")
                    .directory(Path.of("/tmp").toFile())
                    .start();
try(var in = new Scanner(process.getInputStream()){
while(in.hasNextLine()){
  System.out.println(in.nrxtLine());
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Java核心技术 卷1》 的相关文章

  • 如何编写 Hibernate HQL 查询来删除所有“孙子”元素?

    我有学校 里面有团体 里面有学生 我想删除特定学校的所有学生 在 SQL 中我可以编写以下查询 DELETE FROM students1 WHERE students1 group id IN SELECT id FROM group1
  • 如何从 WifiP2pDeviceList 获取 wifi direct 设备名称

    我想在执行请求对等点时获取 wi fi direct 名称 这是我的代码 if WifiP2pManager WIFI P2P PEERS CHANGED ACTION equals action Log d tag success dis
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • Java:高性能消息传递(单生产者/单消费者)

    我最初问这个问题here https stackoverflow com questions 3367192 java is while true loop in a thread bad whats the alternative 但我意
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb

随机推荐

  • 嵌入式 - 宏内核和微内核

    更新历史 20220315 首次创建 xff0c 对宏内核与微内核的概念做出简单的解释 xff1b 宏内核和微内核 引言内核结构宏内核结构特点操作系统举例 微内核结构特点典型操作系统举例 宏内核 V S 微内核参考资料 引言 与通用机操作系
  • SpringAOP的使用

    1 什么是AOP AOP Aspect Orient Programming xff0c 直译过来就是面向切面编程 AOP是一种编程思想 xff0c 是面向对象 xff08 OOP xff09 的一种补充和完善 对于面向对象来说是将程序抽象
  • strrstr函数的宽字符版实现

    strrstr函数用来从一个字符串尾部开始查找另一个字符串出现的第一个位置 xff0c 我却没有找到这个函数的宽字符版本 xff0c 因此自己写了一个实现的函数如下 const wchar t wcsrstr In z const wcha
  • 亚马逊,一个沉睡广告巨人的苏醒(虎嗅网)

    虽然拥有令无数广告主羡慕的高质量用户数据和巨大的网站流量 xff0c 但是在很长的一段时间内亚马逊还是将主要的精力集中在商品销售上 xff0c 广告只是作为自身业务的补充可有可无的存在 不过最近两年 xff0c 亚马逊对广告这种不屑的态度正
  • 大数据案例分析:电信业Hadoop应用分析 原文出自【比特网】,转载请保留原文链接:http://do.chinabyte.com/228/12410228.shtml

    电信业Hadoop应用分析 昨日 xff0c 联通研究院处长王志军在第七届 开源中国 开源世界 高峰论坛上分享了Hadoop在电信行业大数据应用的经验 随着国内3G网络的发展 xff0c 或者移动通信网络的发展 xff0c 中国联通 600
  • Vue富文本编辑器Tinymce内容导出Pdf、Word

    一 Tinymce导出Pdf 使用VueHtml2pdf插件 xff0c 安装插件 xff0c VueHtml2pdf详情见vue html2pdf npm npm i VueHtml2pdf 引入和注册 引入 import VueHtml
  • 大腕出手看门道,谈BAT的投资战略差异 三家战略投资的思考原点并不相同虎嗅网)

    中国互联网的收购之战 xff0c 比娱乐圈的明星离婚更一波三折和猜不透结局 当所有人以为搜狗被360牵回山寨只是早晚的事的时候 xff0c 搜狗和腾讯宣布好上了 眼瞅着今年第三季度即将结束 xff0c 中国互联网巨头们在2013年的 军备竞
  • JDK6的安装

    http www java net download jdk6 6u10 promoted b32 binaries jdk 6u10 rc2 bin b32 windows i586 p 12 sep 2008 exe XP 下 JDK6
  • 如何利用大数据进行价值兑现才是正经事(虎嗅网)

    如果有一天你可以预测未来 xff0c 你要做的第一件事情是什么 xff1f 买彩票 xff1f 第二件 第三件事情呢 xff1f 先卖个关子 xff0c 我们后面再说这件事情 大数据是个产业 xff0c 广义上指的是在这个信息过载时代围绕着
  • 多图震撼!数字的未来,2013报告(虎嗅网)

    新媒体 完爆 旧媒体 从市值上来看 xff0c 以苹果 谷歌 亚马逊 Facebook 雅虎等为首的新媒体公司市值已超过1万亿美元 xff0c 而以迪斯尼 Comcast 时代华纳 Viacom CBS 新闻集团 21世纪福克斯等为首的旧媒
  • 网页采集器-八爪鱼采集器

    八爪鱼采集器下载地址 xff1a http www bazhuayu cc download 八爪鱼采集器的注册地址 xff1a http www bazhuayu cc signup id 61 0e492e9c 6d80 4c2a a2
  • 考研书单与技巧

    书尽量在网上搞活动时买正版的 xff0c 这样也不贵 每科研究透一到两本书 xff0c 不要贪多 xff01 1 英语 xff1a xff08 积累的过程 xff0c 可以现在开始 xff0c 正好把六级过了 xff09 xff08 看好所
  • Ubuntu下程序进程堆栈信息——gstack

    前言 在Ubuntu下调试程序 xff0c 大部分是启动前使用gdb进行调试 xff0c 当然也有其他方法 xff0c 程序在运行中 xff0c 为了不打断程序正常运行 xff0c 也有一些工具进行调试 当前本文章旨在说明不安装其他额外程序
  • 9.针对Linux的8种最佳免费防病毒程序

    虽然Linux操作系统相当稳定和安全 xff0c 但它们可能不完全免疫威胁 所有计算机系统都可能遭受恶意软件和病毒攻击 xff0c 其中包括运行基于Linux的操作系统的系统 但是 xff0c 对于基于Linux的操作系统而言 xff0c
  • 有铅焊锡丝与无铅焊锡丝的性能差异大解析

    有铅焊锡丝与无铅焊锡丝是二大类差另外产物档次 xff0c 由于其金属成份差别造成熔点也差别 xff0c 一样通常有铅焊锡丝 的熔点在183度 xff0c 而无铅焊锡丝的熔点为217 227度 含铅量越少熔点将越高 由于焊锡丝的熔点温度进步之
  • linux中的系统调用

    前言 xff1a 本文只讨论linux中的系统调用 xff0c 不考虑windows等其他操作系统 两点 xff1a 1 系统调用时 xff0c 进程调用的是操作系统的内核函数 xff0c 不是进程 2 系统调用时 xff0c 会出现上下文
  • iView 日期选择器开始时间至结束时间限制

    需要考虑以下条件 开始时间和结束时间都不能大于当前时间开始时间不能大于结束时间 html lt FormItem label 61 34 起止时间 34 gt lt DatePicker type 61 34 date 34 v model
  • 树莓派3安装笔记(1)-安装操作系统Raspbian以及安装必要软件

    拿到了树莓派3后 xff0c 经过短暂的兴奋 xff0c 终于开始实战安装OS了 以下步骤基于官方的文章https www raspberrypi org learning software guide quickstart xff0c 选
  • C中需要检验其执行是否成功的函数(检验返回值)

    一 malloc xff08 xff09 因为当内存分配完了后 xff0c 就无法再分配空间了 xff0c 所以malloc失败也是有的是 xff0c 当malloc失败时返回NULL char s 61 void malloc SIZE
  • 《Java核心技术 卷1》

    目录 第4章 对象和类 lt 1 gt 静态字段和静态方法 lt 2 gt 初始化块 lt 3 gt 定义抽象类的对象变量 lt 4 gt hashCode方法得到散列码 lt 5 gt 虚拟机中的泛型类型信息 第五章 继承 第6章 接口