Java陷阱

转Java一段时间了,发现Java里的有些习惯跟Win32下编程有点差别,初学者很容易上当
1.字符串比较

String a = "aa;
String b = "aa22222".substring(02); // b = "aa"
System.out.println(a == b);
输出为 false
为什么呢?因为实际上Java里除简单类型外,==比较的实际是实例的地址
String比较内容是否相同应该用 a.equals(b) / a.equalsIgnoreCase(b)

不过同时我也发现一个很有意思的问题
String a = "aa;
String b = "aa";
System.out.println(a 
== b);
输出的结果为true!
我想这应该是Java为了节省资源,给a/b分配的是同一个地址吧
未验证,高手指教

顺变说一下,Java里String内容是不可更改的
String a = "aa";
= "bb";
这种写法也不会报错,但实际上a已不再是原来的那个"a"了,a会被重新分配

因此如果一个String内容会被频繁修改,应该用StringBuffer替代
StringBuffer buf = new StringBuffer();
buf.append(
"aa");
buf.append(
"bb");

return buf.toString();


2. 数组做参数
数组做为参数时,在函数内可以修改其内容,但不可以改变其地址
public static void test1(byte[] args)
{
    args[
0= 12;
}

public static void test2(byte[] args)
{
    args 
= new byte[100];
    args[
0= 13;
}

public static void main(String[] args)
{
    
byte a[] = new byte[1];
    a[
0= 100;
    System.out.println(a[
0]);
    test1(a);
    System.out.println(a[
0]);
    test2(a);
    System.out.println(a[
0]);
}
输出: 100  12  12


3.  数组索引越界
byte z[] = new byte[1];
z[
100= 123;
System.out.println(z[
100]);
不会报错,输出为 100


4. ResultSet读取
如果某一列值为NULL,当用getString取此列值时返回的不是空字符串,而是字符串"NULL"  (JDK1.5已修正)
原文地址:https://www.cnblogs.com/sephil/p/403221.html