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

原文地址:https://www.cnblogs.com/BestWishesZJ/p/10286395.html