《offer来了》第二章学习笔记

2024-06-24 13:48
文章标签 offer 第二章 笔记 学习

本文主要是介绍《offer来了》第二章学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.集合

Java四种集合:List、Queue、Set和Map

v2-488327163fe94274b32055d2e1fdaf4f_r
1.1.List:可重复

有序的Collection

ArrayList:

基于数组实现,增删慢,查询快,线程不安全

Vector:

基于数组实现,增删慢,查询快,线程安全

LinkedList:

基于双向链实现,增删快,查询慢,线程不安全

1.2.Queue:队列
ArrayBlockingQueue:

基于数组实现的有界阻塞队列

LinkedBlockingQueue:

基于链表实现的有界阻塞队列

PriorityBlockingQueue:

支持优先级排序的无阻塞队列

DelayQueue:

支持延迟操作的无界阻塞队列

SynchronousQueue:

用于线程同步的阻塞队列

LinkedTransferQueue:

基于链表实现的无界阻塞队列

LinkedBlockingDeque:

基于链表实现的双向阻塞队列

1.3.Set:不可重复

特性独一无二,适合存储无序且值不等的元素。

对象的相等性本质是对象内存地址计算出对象的HashCode值是否相同。

HashSet

HashMap实现,无序。

先判断对象散列值是否相等,相等再通过equals比较,也相等,就视作同一元素。

TreeSet

二叉树实现。

Interger和String基础对象类型可以根据TreeSet默认排序存储。

自定义类型必须实现Comparable接口和覆写compareTo函数。

LinkedHashSet

继承HashSet,HashMap实现数据结构,双向链表记录顺序。

底层使用LinkedHashMap。

1.4.Map
HashMap

数组+链表,线程不安全。

如果要线程安全,可以使用Collections的synchronizedMap方法或者用ConcurrentHashMap数据结构。

HashMap数据结构:

内部是数组,数组的每个元素都是一个单向链表。链表中每个元素都是Entry。Entry包含四个属性:key、value、hash值和指向下个链表的next。

v2-7ec7858332a7c91a093d4d574dc84ada_r

HashMap常用参数:

capacity:当前数组容量,默认16。每次扩容是之前两倍。

loadFactor:负载因子,默认0.75。

threhold:扩容阈值,值等于 capacity * loadFactor。

HashMap查找数据,根据Hash值可以快速定位到数组下标,但需要对链表顺序遍历才能找到,时间复杂度O(n)。

Java8对此进行了优化。当链表中的元素超过8个以后,会将链表转化为红黑树调高查询效率,时间复杂度为O(logN)。

v2-a5d095aa8d9a0c0376e4e636ea58e294_r
ConcurrentHashMap

分段锁实现,线程安全。

通过分段锁思想实现并发操作。

有多个Segment组成(Segment数量就是锁的并发度,默认16个),每个Segment继承自ReentrantLock并单独加锁。所以每次加锁操作锁住的是一个Segment,保证了每个Segment安全,就实现了整个ConcurrentHashMap的安全。

v2-64abd064a58d5adfee4c38512c34337f_r

每个Segment内部数据结构和HashMap相同。如上图。

Java8种ConcurrentHashMap引入了红黑树。如下图。

v2-1fcd7f3dacf78afc4d228aaf19d6fa89_r
HashTable

线程安全。

遗留类。

同一时刻只能一个线程写HashTable。

并发不如ConcurrentHashMap。

TreeMap

基于二叉树。

同时实现了SortedMap保障元素顺序存取,默认按照键值升序。也可以自定义排序比较器。

适用于实现排序的映射列表。键值必须实现Comparable接口或采用自定义比较器。

LinkedHashMap

HashMap子类,内部使用链表保存元素插入顺序,当通过Iterator遍历时,会按照元素插入顺序访问。

2.异常分类及处理

异常定义:

在方法正常执行时,通过抛异常退出方法。

在异常中封装了错误信息和原因。

调用方可以根据该异常选择处理或者继续往下抛。

异常分类:

Throwable是所有Error和Exception父类。

常见Error有AWTError、ThreadDeath。

Exception可以分为RuntimeException和CheckedExcption。

v2-5b8233e8f80917cdd50e0a365e9a82f1_r

Error

出现通常因为系统内部错误或者资源耗尽。

Java不能处理Error。

Excption

分为运行异常与检查异常

RuntimeException:指Java运行期间抛出的异常。可以被捕获并处理。常见的有空指针异常、类强转异常、数组越界异常。

CheckedException:指编译阶段对程序的检查。要求对程序可能出现的异常通过try catch捕获处理。常见的包括IO异常、SQL异常、ClassNotFound异常。

v2-c7127afd0bb7b5f124fa0358ca73e365_r

异常处理方式:

  • 抛出异常
    • throws用于方法定义上,可能抛出的异常
    • throw 作用在方法内,表示明确抛出一个异常
  • 捕获异常
    • 通过try catch捕获和处理异常

3.反射机制

动态语言的概念

动态语言指在运行时可以改变结构的语言,比如新的属性、方法的增加、删除。

  • JS、Ruby、Python属于动态语言。
  • C、C++属于非动态语言。
  • Java属于半动态。
反射机制的概念

在程序运行期间,能对一个类都能获取其属性和方法,并能任意调用。

反射的应用

Java对象分为编译时类型与运行时类型。

编译时指声明对象的类型。

运行类型指为对象赋值的类型。无法在编译时获取对象真实信息,只能通过反射获取。这是反射的核心。

Java反射API

常用API

  • Class类:用于获取类的属性、方法信息
  • Filed类:用于获取和设置类中属性值
  • Method类:用于获取方法的描述信息和执行某个方法
  • Constructor类:类的构造方法
反射步骤

1.获取想要操作类的Class对象

2.调用Class对象类中的定义方法

3.使用反射API获取并调用类属性和方法信息

创建对象的两个方法

使用Class对象的newInstance方法,要求对应类有无参构造方法

通过Class对象的Constructor对象的newInstance方法创建Class对应类实例

Method的invoke方法

动态调用类对象的方法。

步骤:获取对象的Method,并调用Method的invoke方法。

4.注解

注解的概念

一个接口,Java提供设置程序中元素的关联信息和元数据的方法。

标准元注解

@Target:

说明注解修饰对象的范围。可用于包、类、类成员、方法参数和本地变量。

target类型。

v2-c174d8014c7b118f7be63f0b5d1c23a1_r

@Retention:

定义注解保留级别,即被描述注解在什么级别有效。

SOURCE:源文件有效

CLASS:Class文件中有效

RUNTIME:运行时有效

@Documented:

表示这个注解应该被javadoc工具记录

@Inherited:

标记注解,表明被标注的类是被继承的。

一个被@Inherited修饰的注解修饰一个类,表明这个注解将对该类的子类生效。

5.内部类

静态内部类

定义在类内部的静态类。

静态内部类可以访问外部类的静态变量与方法。

静态内部类中可以定义静态变量、方法、构造方法。

静态内部类通过 “外部类.静态内部类” 方式调用。

成员内部类

定义在类内部的非静态类。

成员内部类中不能定义静态方法和变量(final修饰的)除外。因为成员内部类时非静态的。

局部内部类

定义在类方法中的类。

匿名内部类

匿名内部类指通过继承一个类或者实现一个接口定义的类。

匿名内部类没有class修饰,因为匿名内部类直接使用new 生成对象引用。

6.泛型

本质是参数化类型,提供了编译时的安全检测。

泛型标记E、T、K、V、N、?
v2-dd3068731eb96cb609342deb1df9394d_r

对泛型上限的限定 <? extends T>

对泛型下限的限定 <? super T>

泛型方法

指将方法参数类型定义为泛型,以便接收不同类型参数。比如常见的main方法。

public static void main(String args[]) {}
泛型类

指在类定义时在类定义了泛型,以便类使用时根据不同参数类型实例化。

public class Result<T> {public T data;
}

7.序列化

Java对象在内存中创建,如果想持久化Java对象到磁盘,需要使用序列化。

除了持久化对象,还用在RPC调用和网络传输中。

Java序列化API的使用

Java序列化API为对象序列化提供了标准机制,有一下注意事项:

  • 实现序列化,只要实现java.io.Serializable接口即可
  • 序列化与反序列化要保持序列化的ID一致
  • 序列化不保存静态变量
  • 需要序列化父类的变量,父类也要实现Serializable接口
  • 使用Transient关键字可以防止变量被序列化。
v2-6991fb1e1f4c167cf81d773c5411cf6c_r
序列化与反序列化

v2-5ac0216669ca088e03eca1fbde334cc1_r

8.总结

image-20200422001857406

这篇关于《offer来了》第二章学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090329

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux