学习笔记:《Offer来了(原理篇)》第2章 Java基础

2.1 集合

2.1.1 List

  • ArrayList:基于数组;查询快、增删慢;线程不安全。
  • Vector:基于数组;查询快、增删慢;线程安全;拥有Stack(栈)子类。
  • LinkedList:基于双向链表;查询慢、增删快;线程不安全;实现Deque(双向队列)接口。

2.1.2 Queue

非阻塞队列(略)阻塞队列
ArrayDequeArrayBlockingQueue
LinkedListLinkedBlockingQueue
IdentityLinkedListLinkedBlockingDeque
ConcurrentLinkedQueueLinkedTransferQueue
ConcurrentLinkedDequeSynchronousQueue
PriorityQueuePriorityBlockingQueue
DelayQueue

阻塞队列的主要操作

失败抛异常/阻塞失败返回false/不阻塞
add(E e):添加一个元索,如果队列已满则抛出异常。offer(E e):添加一个元索并返回true,如果队列已满则返回false。
remove():移除并返问队列头部的元素,如果队列为空则抛出异常。poll():移除并返问队列头部的元素,如果队列为空则返回null。
element():返回队列头部的元素,如果队列为空则抛出异常。peek():返回队列头部的元素,如果队列为空则返回null。
put(E e):添加一个元素,如果队列满则阻塞。drainTo(Collection c):从该队列中删除所有可用的元素,并将它们添加到给定的集合中。
take():移除并返回队列头部的元素,如果队列为空则阻塞。drainTo(Collection c, int maxElements):最多从该队列中删除给定数量的可用元素,并将它们添加到给定的集合中。

Java中的阻塞队列实现

  • ArrayBlockingQueue:数组阻塞队列。
  • LinkedBlockingQueue:链表阻塞队列。
  • LinkedBlockingDeque:双向的链表阻塞队列。队头队尾都可以入队出队。
  • LinkedTransferQueue:提供transfer、tryTransfer方法的链表阻塞队列。transfer()、tryTransfer()、tryTransfer(E e, long timeout, TimeUnit unit)。
  • SynchronousQueue:没有容量的同步阻塞队列。
  • PriorityBlockingQueue:优先级阻塞队列。比较器。
  • DelayQueue:延时的优先级阻塞队列。比机器、延时时间。

2.1.3 Set

  • HashSet:基于HashMap;无序。
  • LinkedHashSet:基于LinkedHashMap;按存入先后有序。
  • TreeSet:基于TreeMap;按元素大小有序。

2.1.4 Map

MapEntry<K,V>
HashMap、HashTable、ConcurrentHashMapkey、value、hash、next
LinkedHashMapkey、value、hash、next、before、after
TreeMapkey、value、parent、left、right、color
能否存nullkeyvalue
HashMap、LinkedHashMap
HashTable、ConcurrentHashMap××
TreeMap×
  • HashMap:(底层结构、插入元素、查询元素、长度、扩容)基于数组+单向链表或红黑树(链表元素超过8个时,转换红黑树);线程不安全;默认容量16,负载因子0.75。
  • LinkedHashMap:按存入先后有序。
  • HashTable:基于HashMap+锁;线程安全。
  • ConcurrentHashMap:(底层结构、size())基于Segment(extends ReentrantLock)数组+HashMap;需要进行两次hash散列;线程安全;默认并发度16。
  • TreeMap:基于红黑树;按Key大小有序。

学习笔记:《程序员小灰》HashMap
学习笔记:《程序员小灰》ConcurrentHashMap

2.2 异常分类及处理

2.2.1 异常的概念

2.2.2 异常分类

在这里插入图片描述

  • Error:不能被异常处理机制处理。常见的有VirtualMachineError、StackOverflowError、OutOfMemoryError等。
  • Exception:可以被异常处理机制处理。
  • RuntimeException:运行阶段抛出的异常。常见的有NullPointerException、ClassCastException、ArrayIndexOutOfBundsException等。
  • CheckedException:编译阶段抛出的异常。常见的有IOException、SQLException、ClassNotFoundException等。

2.2.3 异常处理方式

  • 抛出异常:throw、throws。
  • 捕获并处理异常:try catch finally。

2.3 反射机制

2.3.1 动态语言的概念

动态语言指程序在运行时可以改变其结构的语言,比如属性或方法的添加、删除等结构上的变化。

  • 动态语言:Python、JavaScript、Ruby
  • 非动态语言:C、C++
  • 半动态语言:Java

2.3.2 反射机制的概念

在程序运行过程中,对任意一个类都能获取其对象、所有的属性、所有的方法。

2.3.3 反射的应用

核心功能:Java中对象的类型分为编译时类型(引用的类型)和运行时类型(对象的类型)。编译阶段无法预知该对象和类的真实信息;运行阶段通过反射机制获取该对象和类的真实信息。

2.3.4 Java的反射API

Class类、Constructor类、Field类、Method类、AccessibleObject类。

2.3.5 反射的步骤

  • 获取Class对象:对象.getClass()、类.class、Class.forname(类的完全限定名)。
  • 通过Class对象获取该类的实例对象、方法、属性。

2.4 注解

2.4.1 注解的概念

注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口。程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。

2.4.2 标准元注解:@Target、@Retention、@Documented、@Inherited

  • @Target
    在这里插入图片描述
  • @Retention:SOURCE、CLASS、RUNTIME。
  • @Documented:javadoc
  • @Inherited:子类会继承父类使用的被@Inherited修饰的注解。

2.4.3 注解处理器

通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。

2.5 内部类

静态内部类、成员内部类、局部内部类、匿名内部类(继承类或实现接口)。

2.6 泛型

泛型的本质是参数化类型。

  • 使用Object类型:强制显式数据类型转换。
  • 使用泛型:自动隐式数据类型转换。

2.6.1 泛型标记和泛型限定:E、T、K、V、N、?

在这里插入图片描述

  • 对泛型上限的限定:<? extends T>
  • 对泛型下限的限定:<? super T>

2.6.2 泛型方法

public static void generalMethod(T… inputArray) {}

2.6.3 泛型类

public class GeneralClass {}

2.6.4 泛型接口

public interface IGeneral {}

2.6.5 类型擦除

在编码阶段采用泛型时加上的类型参数,会被编译器在编译时去掉。

发生在编译阶段的类型擦除过程如下:

  • 查找类型参数的上界(无指定时为Object类型)用来替换类型参数;
  • 把代码中的类型参数都替换为具体的类。

2.7 序列化

2.7.1 Java序列化API的使用

  • 类要序列化,那么类需要实现java.io.Serializable接口。
  • 子类要序列化父类,那么父类也需要实现Serializable接口。
  • 静态变量不能序列化。
  • 使用transient关键字修饰的变量不能序列化。。
  • 序列化和反序列化必须保持序列化ID的一致性,一般使用private static final long serialVersionUID定义序列化ID。

2.7.2 序列化与反序列化

ObjectOutputStream和ObjectInputStream、fastjson、arvo、protobuf、thrift。

串联记忆

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值