• java知识整理


    整理一下Java知识点。

     一、final finally finalize区别

    1、final

    修饰符(关键字)。被final修饰的类,不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,不能重载。

    2、finally

    异常处理的最终执行操作。不管有没有异常被抛出、捕获,finally块都会被执行。在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。一般,如文件读取的流(Stream)的关闭操作,db连接的connection关闭等等,close()方法一般都是放在finally中执行的。
    3、finalize

    Object的方法。Java8 API中如下描述。

    Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

    在垃圾回收器发现没有引用指向对象时(意思就是说准备回收这个对象),会调用这个方法。

    二、java创建对象

    创建对象的四种方法。乍一听,四种,这么多?其实大家只是不归纳整理,我们都用过这四种。
    (1)new关键字。
    (2)newInstance()
    Class.forName("XXX").newInstance():只能调用无参的构造方法。
    Constructor.newInstance():无论参数个数多少,它都能调用。
    官方有个例子,讲解的很好:
    https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
    (3)colne
    例子写的太详细了,我没必要再写一遍了:
    https://dzone.com/articles/java-cloning-copy-constructor-vs-cloning
    (4)反实例化
    从数据流到对象。

    三、Thread类里如何判断这个线程持有锁

    Thread类里有个方法public static boolean holdsLock(Object obj)

    Returns true if and only if the current thread holds the monitor lock on the specified object.

    仅当在指定对象上持有监视器锁的时候返回true。

    四、线程池 达到最大线程数时,再有任务请求时会怎么办

    ThreadPoolExecutor方法中有一个参数RejectedExecutionHandler,它来控制线程数量超出时的处理。

    它的实现由四种,默认的是RejectedExecutionException抛出异常;

    其他分别是不做任何处理,直接忽略掉这个任务;提交任务的线程自己执行任务;把队列头部的任务直接扔掉,然后提交这个任务到队列中。

    当然了,自己去实现这个RejectedExecutionHandler也可以,但一般情况下,不需要。

    为什么wait,notify,notifyAll方法在Object队象中

    一个经典问题,整理一下,说一下自己的看法。

    1.wait和notfiy它不并不是普通的方法,也不是像synchronized那样的关键字,它是线程间通讯的一种机制。放在Object class中是种好的选择。

       此外,当进入临界的代码时,线程需要被锁,它们也在等待锁的到来,但是它们不知道哪个线程正在持有锁,相反,它们只知道锁正在被某个线程占用,以及它们应该等待锁,

       而不是知道哪个线程在synchronized块中,让它们释放锁。

    2.锁面向于每个对象,这也是放在Object Class中的一个重要原因。

    六、谈谈String

    String a = new String("123");

    首先我们猜猜这里创建了几个对象?

    不是1个,也不是2个。常量池里有“123”,那么就创建一个对象(new String),如果常量池里没有“123”,那么就会创建2个对象。

    有篇文章写的很好,说得很明白,里面还有几个例子:

    http://www.java67.com/2014/08/difference-between-string-literal-and-new-String-object-Java.html

  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/lihao007/p/8576797.html
Copyright © 2020-2023  润新知