zoukankan      html  css  js  c++  java
  • Java 容易疑惑的一些杂记录

    1 final、finally和finalize

      final 是一个关键字 ,final 修饰 对象不能被修改,final 修饰的方法不能被重写,final 修饰的 类 不能被继承。

      finally 是 异常处理的最后一步,finally 一定会被执行,一般用于资源释放。

          问题:

            1 如果 在 try 或者 catch 种有 return ,那么 finally  会执行吗?

              答:finally  一定会执行

            2 在什么时候执行?

              答:finally   会在return的 过程中执行,比return 语句执行晚

            3 finally 修改 返回值对象 的返回值有影响吗?

              答:finally 修改返回值变量 是可以修改的,但是finally 执行比 return 晚, 如果这个变量是引用类型, finally 的修改返回值变量影响返回值,如果是 值传递 的类型那么是复制 一份返回值,这时候不影响返回值

            4 finally  直接return 对返回值有影响吗?

              答:在finally   里面直接返回可以覆盖 前面 try 或者catch 的 返回值。

      finalize 是object 的一个方法和 垃圾回收有关,finalize()方法是在GC释放对象时被自动调用,常用于释放一些GC无法释放的资源

    2 构造方法 和 代码块谁先执行

        

        
        public User(){
            System.out.println( "User" );
        }
        
        {
            System.out.println( "{}" );
        }
        
        {
            System.out.println( "{}2 " );
        }
        
        
        static {
            System.out.println( "init" );
        }

    如果上图, 如果 new  一个 User  ,打印的结果是 init  {} {}2  User ,所以 动态代码块先执行。但是静态代码块比动态代码块更早执行。多个动态代码块按顺序执行。

    3 wait 和 sleep 的区别

      1 wait 是 Object 的 普通方法,sleep 是Thread 类的 静态方法。

      2 调用 wait 需要先 synchronized(  这个对象 ),也就是当前线程需要获取到这个对象的 锁,才能调用,否者活抛出 非法异常。 sleep 可以直接调用。

      3 wait 以后,当前线程会 释放 这个 obj 对象 的锁。 如果是 sleep 的话不会释放锁。wait 以后需要 notify(随机唤醒一个等待 这个 obj 对象的 线程) 或者 notifyAll(唤醒所有需要 等待这个 obj 的线程,让他们抢锁 ) 来唤醒,sleep 指定了时间的,时间到了就会自己醒过来。因为 sleep  指定了时间,所以它才能 不释放锁。

    4 HashMap HashTable  ConcurrentHashMap 的 区别和原理。

      小说说不通 HashMap  吧u支持并发。 HashTable ,都支持并发。但是 HashTable   支持并发的方式 方法全面加 synchronized 效率很低,ConcurrentHashMap  是 在代码区域加入 synchronized  效率比 HashTable  高。

      

      在说说存储原理。 他们的 存储结构都 用数组实现的。通过key 算出一个hash 值,然后 取这个 hash 值后面的数组  长度-1的二进制位个数 为。然后通过这个 值作为数组下标放到数组里面去。数组里面男的 value 是 一个 单链表的地址。如果两个 哈希值的 后面 几位完全 相同,就都放到这个数组的 同样位置,并且 放在链表的开头。查找的时候是怎么查找的呢?首先 通过hash值 算出 位置,然后如果数组的这个位置只有一个 链表元素就直接返回,如果有多个,那么久开始比较 hash 值。 另外说一句,这个单向链表里面放的不只是 value ,还有key 。

    5 GC的 等级

        1 Minor GC  青年区满了,触发,清理青年区

        2 Full GC 

          (1)调用System.gc时,系统建议执行Full GC,但是不必然执行
          (2)老年代空间不足
          (3)方法区空间不足
          (4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
          (5)由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

        2 Major GC 是清理永久代 ,JVM 规范没有明确指出。

    6 synchronized 修饰的  的 同一个类的2个方法方法可以同时执行吗?

       1 sync 修饰静态方法。 这时候锁的是 这个类。要拿到这类的锁才可以进入这个方法。所以这时候  同一个类的 两个 sync 修饰的静态方法不能同时执行。

      

       2 sync 修饰 普通方法。 这时候锁的对象是这个当前对象。 但是 如果是 wait 方式 等线程等待会释放锁,这时候另一个线程可以获取锁,所以可以竟然,如果是 sleep 方式的 线程等待 那么久不会。

       3 一个方法是 静态,一个是普通。锁的都不是一个对象。肯定不影响了。

  • 相关阅读:
    中国大概能用的NTPserver地址
    在asp.net mvc中使用PartialView返回部分HTML段
    我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
    素数推断算法(高效率)
    No matching code signing identity found
    Android Bundle类
    D3D 练习小框架
    Python标准库:内置函数dict(iterable, **kwarg)
    微凉大大,教你一步一步在linux中正确的安装Xcache加速php。
    背景图片定位
  • 原文地址:https://www.cnblogs.com/cxygg/p/11161154.html
Copyright © 2011-2022 走看看