那些年我们掉过的java的坑(四)
1.字符串的运算,从左往右,能计算便计算,否则输出
public class Test_1 {
public static void main(String[] args) {
System.out.println("hello"+'a'+1); //helloa1
System.out.println('a'+1+"hello"); //98hello
System.out.println("a"+1+"hello"); //a1hello
}
}
2."-0"代表的是最小值,
short a = 128;
byte b = (byte)a; //b为-128
short a = 0000 0000 1000 0000
byte b = 1000 0000(原码) = -0
b(反码) = 0111 1111
b(补码) = 1000 0000(就是-128的补码)
3.Math类中round()、ceil()、floor()
round():四舍五入
ceil():取最大
floor():取最小
4.假设int x=1,y=2,z=3;那么y+=z–/++x是1。注意int/int还是int,向下取整。y=y+((z–)/(++x)); (z–)/(++x)=3/2=1;
5.java中移位是a>>n,实际上是a>>(n%32)。防止超32位。>>带符号右移(移动的数为负数高位补1,正数补0)。>>>不带符号右移(高位补0)。移为的shor等类型会先转换为int类型再移位。
short -4 = 1111 1111 1111 1100(负数补码形式存)
转化为int = 1111 1111 1111 1111 1111 1111 1111 1100(高位补1)
6.String存中文时候
String st = "秃头";
st.length(); //为2
st.getBytes().length(); //为4
7.new String(“abc”);new String(“abc”);的过程
new String(“abc”);//先常量区存放一个abc,再堆里创建一个对象new String
new String(“abc”);//发现常量区有abc,直接堆里创建一个对象new String
8.==、equals(Object)、hashCode()
- ==:比较变量值是否相等
- equals(Object):继承于Object,默认是使用了==,比较的是引用(地址),需要用户覆盖
- hashCode():用于鉴定对象的内容是否相等。
9.String、StringBuffer、StringBuilder区别
- StringBuffer:线程安全
- StringBuilder:线程不安全
10.finally代码块声明时候执行
- 先执行finally,再回来执行return
- 如果先执行finally时候a++,再回来执行return a后,a的值是++之前的值。