2009年1月20日 星期二

The difference of "==" and "equals" in Java language

Here is an example of == and equals

在Java裡,equals和==常令程式設計師困惑,這裡簡單說明如下:
1. ==

測試物件參考時,唯有當兩個參考指向同一物件時,==運算子的結果才為true,同樣的,唯有當兩個參考指向不同物件時,!=運算子的結果才為true,這兩個運算子的處理與物件的內容無關。需要特別注意的是,在String中使用==,因為Java為節省記憶體,會在某一輪調區中維護唯一的String物件,所以如果在類別裡使用同一字串,Java只會建立一個唯一的字串而已。

2. equals

另一種測試的做法是equals,equals在類別為Java原先就存在時,是比較兩個物件是否為相同類型的類別後再比較其內容值是否相同,是就傳回true,否就傳回false。當要測試的類別是自定類別時,要依自定類別所提供的equals來決定如何比較,如果自定類別沒有覆蓋Object的equals類別的話,就以Object的equals來比較,Object的equals的比較方式如同==。

public class myEquals {

public myEquals() {

//字串型別

String sA = "ABC";

String sB = "ABC";

String sC = new String("ABC");



//==的比較

if (sA == sB)

System.out.println("sA == sB");

else

System.out.println("sA != sB");



if (sA == sC)

System.out.println("sA == sC");

else

System.out.println("sA != sC");



//equals的比較

if (sA.equals(sB))

System.out.println("sA.equals(sB) = true");

else

System.out.println("sA.equals(sB) = false");



if (sA.equals(sC))

System.out.println("sA.equals(sC) = true");

else

System.out.println("sA.equals(sC) = false");



//Java原有的型別

Long lngA = new Long(100);

Long lngB = new Long(100);

Long lngC = new Long("100");



//==的比較

if (lngA == lngB)

System.out.println("lngA == lngB");

else

System.out.println("lngA != lngB");



if (lngA == lngC)

System.out.println("lngA == lngC");

else

System.out.println("lngA != lngC");



//equals的比較

if (lngA.equals(lngB))

System.out.println("lngA.equals(lngB) = true");

else

System.out.println("lngA.equals(lngB) = false");



if (lngA.equals(lngC))

System.out.println("lngA.equals(lngC) = true");

else

System.out.println("lngA.equals(lngC) = false");



//自定型別

myObject1 m1A = new myObject1();

myObject1 m1B = new myObject1();

myObject2 m2A = new myObject2();

myObject2 m2B = new myObject2();



//==的比較

if (m1A == m1B)

System.out.println("m1A == m1B");

else

System.out.println("m1A != m1B");



if (m2A == m2B)

System.out.println("m2A == m2B");

else

System.out.println("m2A != m2B");



//equals的比較

if (m1A.equals(m1B))

System.out.println("m1A.equals(m1B) = true");

else

System.out.println("m1A.equals(m1B) = false");



if (m2A.equals(m2B))

System.out.println("m2A.equals(m2B) = true");

else

System.out.println("m2A.equals(m2B) = false");

}

public static void main(String[] args) {

myEquals myEquals1 = new myEquals();

}

}



執行結果

sA == sB

sA != sC

sA.equals(sB) = true

sA.equals(sC) = true

lngA != lngB

lngA != lngC

lngA.equals(lngB) = true

lngA.equals(lngC) = true

m1A != m1B

m2A != m2B

m1A.equals(m1B) = false

m2A.equals(m2B) = true

2009年1月7日 星期三

What is qemu?

http://en.wikipedia.org/wiki/QEMU
Today I can't use my embedded board, because I don't have serial console line on hand today. So I try to find a simulator tool to run my ARM based software without HW.
Here is the qemu download url -
http://www.jk2410.org/release/host/qemu/qemu-jk2410-20080809.tar.bz2

Installation step is very easy, I did the follows
$tar jxvf qemu-jk2410-20080809.tar.bz2
$sudo apt-get install gcc-3.4
$sudo apt-get install libsdl-dev
$cd qemu-jk2410-20080809
$./configure --cc=/usr/bin/gcc-3.4 --target-list=arm-softmmu
$make
$sudo make install


2009年1月5日 星期一

How to check CPU endian on Embedded Linux


Sometimes you don't know what type of CPU endian on your ARM platform. Here you can write a very simple program to test

/* Test CPU Endian */
#include
#include

int main() {
if (htons(1) == 1) puts("big endian");
else puts("little endian");
return 0;
}
/* End */