首页 > 编程语言 > 详细

Java核心技术36讲笔记

时间:2019-09-11 19:22:04      阅读:109      评论:0      收藏:0      [点我收藏+]

一共43讲,大约需要10h

开篇词 1讲

java基础 14讲

java进阶 16讲

java安全基础 2讲

java性能基础 3讲

java应用开发扩展 4讲

周末福利 2讲

结束语 1讲

 

开篇词 (1讲)

初级、中级 Java 工程师要求:扎实的java和计算机科学基础,掌握主流开源框架的使用

高级java工程师或技术专家:全面考察java IO/NIO,并发,虚拟机,要求掌握底层源码、分布式、安全、性能等能力

注重面试者的计算机科学基础和编程语言的理解深度

面试失败的原因:

1、知其然不知其所以然,开发了很多业务应用,却没思考各种技术选型背后的逻辑。

导致:1、成长潜力有限,2无法达到高质量的设计实现

2、知识碎片化,不成系统。知识无法形成网络,无法完整、清晰的描述自己所开发的系统,或者使用的技术。

导致:1、面向搜索的编程方式,无法高效解决复杂问题,缺乏设计复杂系统的能力

比如:有并发编程经验,但对并发类库掌握不扎实。

 

模块一 Java基础 (14讲)

java的两个显著特性:跨平台,垃圾收集
详细回答的话,分五部分
java语言基本特性,Java类库,java生态,java虚拟机,Java工具
 
技术分享图片

 

 

技术分享图片

 

不要用Exception捕获,不要生吞异常,不要直接打印而是要打印到日志

try-catch会影响JVM对代码进行优化,所以建议仅捕获必要的代码段。

每实例化一个Exception,都会对当时的栈进行快照,这是一个比较重的操作,如果频繁发生,性能问题不可忽略

技术分享图片
 
不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响。
强引用:普通对象引用,GC一般不会动该对象
强可达:当有线程可以不通过引用访问该对象时。比如,我们创建一个新对象,创建它的线程对它就是强可达。
软引用:jvm认为内存不足时,才会去试图回收软引用对象
软可达:就是只能通过软引用才能访问到的对象状态
弱引用:构建没有特定约束的关系,试图获取对象时,如果对象还在,就用它,否则重新实例化
弱可达:只能通过弱引用访问到的状态
幻象引用:也叫虚引用,仅仅提供了一种确保对象被finalize以后,做某些事的机制。
幻象可达:没有强、软、弱引用关联,并且finalize过了,只有幻象引用指向这个对象的时候。
技术分享图片

 

 利用软引用和弱引用,可以将访问到的对象重新指向强引用,人为的改变可达性状态。

在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。

1 强引用

特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,具体回收时机还是要看垃圾收集策略。

2 软引用

特点:软引用通过SoftReference类实现。 软引用的生命周期比强引用短一些。只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。

应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。

3 弱引用

弱引用通过WeakReference类实现。 弱引用的生命周期比软引用短。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

应用场景:弱应用同样可用于内存敏感的缓存。

4 虚引用

特点:虚引用也叫幻象引用,通过PhantomReference类来实现。无法通过虚引用访问对象的任何属性或函数。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取一些程序行动。

应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。
 

过早优化是万恶之源,考虑可靠性、正确性和代码可读性才是大多数应用开发最重要的因素

在日常编程中,保证程序的可读性、可维护性,往往比所谓的最优性能更重要

静态类型:编译期检查
动态类型:运行期检查
public class MyDynamicProxy {
    public static  void main (String[] args) {
        HelloImpl hello = new HelloImpl();
        MyInvocationHandler handler = new MyInvocationHandler(hello);
        // 构造代码实例
        Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler);
        // 调用代理方法
        proxyHello.sayHello();
    }
}
interface Hello {
    void sayHello();
}
class HelloImpl implements  Hello {
    @Override
    public void sayHello() {
        System.out.println("Hello World");
    }
}
 class MyInvocationHandler implements InvocationHandler {
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("Invoking sayHello");
        Object result = method.invoke(target, args);
        return result;
    }
}

 

 
 
 
 
 
 
 
 
 
 
 
 

结束语 (1讲)

 

 

 

Java核心技术36讲笔记

原文:https://www.cnblogs.com/lakeslove/p/11508077.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!