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:如何理解String
的intern
方法?
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