Java后端
·07-24 10:45Day 105(昨天的打卡)
✅ 今天做了:
1. 背单词√
2. 面试题:√
总结:
单词复习:
认识:75,模糊:27,忘记:23,顽固:3
问题:
受检测异常:Java编译器检查这类异常,需要在方法签名中使用throws或者使用try-cath捕获,比如IOException
非受检测异常:主要是程序逻辑上的问题,比如类型转换失败。
finally:无论是否发生异常,都保证会被执行。 但存在问题:异常覆盖:catch 块中已经抛出了一个异常,而 finally 块在执行清理时又抛出了一个新的异常,JVM 会丢弃原始的异常,只向上抛出 finally 中的异常。破坏正常的返回逻辑:finally 块中使用了 return 语句,它会直接导致方法结束,并覆盖掉 try 或 catch 块中原本要返回的值或要抛出的异常。并非绝对可靠。
throw:代码中主动抛出异常对象,通常是自己定义的业务逻辑
throws:用于方法签名上,主要是告诉调用者这个方法会抛出的异常,调用者可以try-catch或者继续向上抛。
只捕获你能处理的异常,不要“吞掉”异常,使用 finally 或 try-with-resources 释放资源,为异常提供有意义的信息在抛出异常时,附带清晰的描述性消息,异常链当捕获一个底层异常并抛出一个新的高层异常时,应将原始异常(cause)包装进去。这保留了完整的堆栈跟踪信息,便于排查问题。优先使用非受检异常处理编程错误,不要用异常来控制程序流程
Java的反射机制,就是程序在运行期间,可以像照镜子一样,动态地获取任何一个类的信息(它的属性、方法、构造函数等),并且能够动态地创建对象、调用方法、修改属性。它赋予了Java一种“自我剖析”和“自我操作”的能力。
获取Class对象有三种主要方式:
通过对象获取:anyObject.getClass()
通过类名获取:ClassName.class
通过类的全限定名获取:Class.forName("com.example.MyClass")
反射的优点:
框架设计的灵魂:Spring/SprintBoot的IoC控制反转(不需要自己去new对象由容器去创建对象)
动态代理:在运行时创建一个实现了指定接口的代理类,用来增强原始类的功能(比如添加日志、事务管理),这是AOP(面向切面编程)的基础。
工具和IDE:比如你用的Eclipse/IntelliJ IDEA,它的代码提示、自动补全、调试器等功能,都需要通过反射来分析你写的类。
注解处理器:需要在运行时被读取和处理,这也要靠反射。
缺点:性能开销大,破坏封装、类型不安全、代码可读性差,维护困难。
阻塞队列:生产者生产数据时,没有地方放了会阻塞,消费者拿数据时没有数据会阻塞。BlockingQueue 自动地协调了生产者和消费者之间的速度差异
ArrayBlockingQueue:
- 由数组支持的有界阻塞队列。创建时必须指定容量,且容量不可变。
- 公平/非公平:可以通过构造函数 new ArrayBlockingQueue(capacity, fair) 设置公平性。公平模式下,等待的线程按 FIFO 顺序访问队列;非公平模式下,可能存在插队,吞吐量通常更高。
- 性能:内部使用一个锁(ReentrantLock)来控制生产者和消费者的访问,意味着两者不能同时操作。
LinkedBlockingQueue:
- 底层结构:由链表支持的阻塞队列。
- 特点:
- 可选有界:可以指定容量,也可以不指定。如果不指定,默认容量是 Integer.MAX_VALUE,相当于一个无界队列。
- 无界时的风险:如果生产者速度远快于消费者,可能导致内存耗尽(OOM)。
- 性能:内部使用两个锁(putLock 和 takeLock),一个用于入队,一个用于出队。这种“读写分离”的设计使得生产者和消费者可以并行操作,在高并发场景下吞吐量通常高于 ArrayBlockingQueue。
PriorityBlockingQueue:
- 底层结构:一个支持优先级的无界阻塞队列。
- 特点:
- 无界 (Unbounded):队列容量没有限制。
- 优先级排序:存入的元素必须实现 Comparable 接口,或者在构造时传入 Comparator。队列会根据元素的优先级进行排序,优先级高的元素先出队。
- 它不保证 FIFO,而是保证每次 take 出来的都是当前队列中优先级最高的元素。
SynchronousQueue:
- 底层结构:一个不存储元素的阻塞队列,容量为 0。
- 特点:
- 容量为零:它没有任何内部容量来缓存数据。
- 直接传递 (Hand-off):每个 put 操作必须等待一个对应的 take 操作,反之亦然。它更像一个“一手交钱,一手交货”的交易场所,而不是一个仓库。
- 高吞吐量:非常适合传递性场景,因为避免了数据在队列中的存储和管理开销。Java 的 Executors.newCachedThreadPool() 线程池就使用了它。
DelayQueue:
- 底层结构:一个支持延时获取元素的无界阻塞队列。
- 特点:
- 延时:队列中的元素只有在其指定的延迟时间到了之后,才能被消费者 take 出来。
- 元素类型:存入的元素必须实现 Delayed 接口(该接口又继承了 Comparable)。
- 应用场景:非常适合实现定时任务、缓存过期等功能。
应用场景:线程池,消息中间件,系统日志,消费者生产者
3
1
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
