转Java一段时间了,发现Java里的有些习惯跟Win32下编程有点差别,初学者很容易上当
1.字符串比较
String a = "aa;
String b = "aa22222".substring(0, 2); // b = "aa"
System.out.println(a == b);
输出为 falseString b = "aa22222".substring(0, 2); // b = "aa"
System.out.println(a == b);
为什么呢?因为实际上Java里除简单类型外,==比较的实际是实例的地址
String比较内容是否相同应该用 a.equals(b) / a.equalsIgnoreCase(b)
不过同时我也发现一个很有意思的问题
String a = "aa;
String b = "aa";
System.out.println(a == b);
输出的结果为true!String b = "aa";
System.out.println(a == b);
我想这应该是Java为了节省资源,给a/b分配的是同一个地址吧
未验证,高手指教
顺变说一下,Java里String内容是不可更改的
String a = "aa";
a = "bb";
这种写法也不会报错,但实际上a已不再是原来的那个"a"了,a会被重新分配a = "bb";
因此如果一个String内容会被频繁修改,应该用StringBuffer替代
StringBuffer buf = new StringBuffer();
buf.append("aa");
buf.append("bb");
return buf.toString();
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{
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]);
}
3. 数组索引越界
byte z[] = new byte[1];
z[100] = 123;
System.out.println(z[100]);
不会报错,输出为 100z[100] = 123;
System.out.println(z[100]);
4. ResultSet读取
如果某一列值为NULL,当用getString取此列值时返回的不是空字符串,而是字符串"NULL" (JDK1.5已修正)