zoukankan      html  css  js  c++  java
  • Java 基础

    1、Java中什么是值传递,什么是引用传递

    • 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数就行修改,将不会影响到实际参数。(当为同一对象时操作的也是同一地址空间,不用对象操作的是不同的地址空间)
    • 引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。(直接传地址,操作相同地址空间)

      Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

     2、如果是JDK8应用操作时间时

    • 用Instant 代替 Date
    • LocalDateTime 代替 Calendar
    • DateTimeFormatter 代替 SimpleDateFormat

       原因:simple , beautiful ,strong , immutable , thread-safe

       我们把SimpleDateFormat定义为静态变量,那么多线程下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间(calendar.setTime(date)),就会出现时间差异和其它各种问题。SimpleDateFormat和它继承的DateFormat类也不是线程安全的。

       DateTimeFormatter 是被final修饰的类。

     参考链接:https://mp.weixin.qq.com/s/XeKdHWkdigrKsvmcOVe8Fg

    3、jdk7前版本String.substring(start,end)使用不当可能引起内存泄露

      jdk8源码:

      public String(char value[], int offset, int count) {
            / .... /this.value = Arrays.copyOfRange(value, offset, offset+count);
        }
    
      public String substring(int beginIndex, int endIndex) {
            / .... /return ((beginIndex == 0) && (endIndex == value.length)) ? this
                    : new String(value, beginIndex, subLen);
        }

      jdk6源码:

    //JDK 6
    String(int offset, int count, char value[]) {
        this.value = value;
        this.offset = offset;
        this.count = count;
    }
    
    public String substring(int beginIndex, int endIndex) {
        //check boundary
        return  new String(offset + beginIndex, endIndex - beginIndex, value);
    }

       在jdk6以上版本中都通过 this.value = Arrays.copyOfRange 方式重新生成值,因此在value过长时不会导致资源浪费,内存泄露。

     4、

      Q1:String s = new String("hollis");定义了几个对象。

      Q2:如何理解Stringintern方法?

      A1:若常量池中已经存在"hollis",则直接引用,也就是此时只会创建一个对象,如果常量池中不存在"hollis",则先创建后引用,也就是有两个。

      注:1、常量池是在Pool ,堆Heap ,栈Stack。stack中存放基本类型或指向heap的地址、heap存放运行时创建的对象。

        2、JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;JDK7.0以后版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。

      A2:当一个String实例调用intern()方法时,JVM会查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;

       

      参考链接:https://mp.weixin.qq.com/s/VBFDIHhPg0MJ-L9DpzbiWw

  • 相关阅读:
    19.2.15 [LeetCode 80] Remove Duplicates from Sorted Array II
    19.2.15 [LeetCode 79] Word Search
    19.2.15 [LeetCode 78] Subsets
    19.2.15 [LeetCode 77] Combinations
    19.2.15 [LeetCode 76] Minimum Window Substring
    19.2.13 [LeetCode 75] Sort Colors
    19.2.13 [LeetCode 74] Search a 2D Matrix
    19.2.13 [LeetCode 73] Set Matrix Zeroes
    19.2.13 [LeetCode 72] Edit Distance
    19.2.13 [LeetCode 71] Simplify Path
  • 原文地址:https://www.cnblogs.com/BestWishesZJ/p/10286395.html
Copyright © 2011-2022 走看看