Java语法笔记

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](http://upload-images.jianshu.io/upload_images/1713176-c9ca35587dbef1b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Object的clone方法是“浅拷贝”。如果我们要彻底实现深拷贝,必须覆盖clone方法,在其中为我们的新对象的所有引用类型的属性层层赋值,一直到非引用类型为止。

你可能感兴趣的:(Java语法笔记)