1. StringBuffer和StringBuilder
StringBuffer 执行效率低,线程安全
StringBuilder效率高,但是非线程安全
2.Math
Math.floor(f) 向下取整
Math.round(f) 四舍五入,实现:加上0.5后向下取整
3.hashCode 和 31
String的hashCode源码:
Java
public int hashCode() {
int h = hash;
if (h == 0 && value. length > 0) {
char val[] = value;
for ( int i = 0; i < value. length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
其实等价于 ```s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]```
使用31的原因是它是素数。31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有将该乘法换成位移计算的相关优化。
##4.反射
在**运行时**状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
获取Class对象的三种方式:
1. 通过实例对象的getClass方法获取
2. 通过Class.forName载入类
3. 通过类名的.class属性获取
##5. 数组初始化
```Java```
int[] a = new int[length];
int[] a = {1,3,6};
6. obj.equals() 方法
如果我们的类没有覆盖 equals方法,那么该类实例调用.equals的效果和“==”操作符相同,因为源码如此
Java
//Object类的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
如果想要比较两个对象的内容,要重写equals()方法才可。Java jdk中的容器类和String都已经覆盖了equals方法。
##7.obj.clone()方法
深拷贝与浅拷贝的区别:
![Paste_Image.png](https://img.haomeiwen.com/i1713176/c9ca35587dbef1b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Object的clone方法是“浅拷贝”。如果我们要彻底实现深拷贝,必须覆盖clone方法,在其中为我们的新对象的所有引用类型的属性层层赋值,一直到非引用类型为止。
网友评论