問題1:String的split函數用法:
下面程序,將會輸出什麼:
public class A
{
public static void main(String[] args) throws ClassNotFoundException
{
String[] str1 = ";;;".split(";");
System.out.println("str1長度:" + str1.length);
String[] str2 = ";a;;".split(";");
System.out.println("str2長度:" + str2.length);
String[] str3 = "a;;;a;".split(";");
System.out.println("str3長度:" + str3.length);
String[] str4 = "b;;and;a;;".split(";");
System.out.println("str4長度:" + str4.length);
for (String str : str4)
{
System.out.println(str);
}
}
}
輸出結果:
str1長度:0
str2長度:2
str3長度:4
str4長度:4
b
and
a
原因:不包括結尾的空字符串,但包括開頭的空字符串;可以分別打印一下這幾個數組;
總結:
public String[] split(String regex) 根據給定正則表達式的匹配拆分此字符串
數組中不包括結尾空字符串;
例如,字符串 "boo:and:foo" 使用這些表達式可生成以下結果:
Regex 結果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }
返回字符串數組,它是根據給定正則表達式的匹配拆分此字符串確定的;
注:spilt()需要注意的事項,就是當分隔符爲 . 的話,處理起來不一樣,必須寫成\\. 因爲.是正則表達式裏的一個特殊符號,必須進行轉義;
String[] str5 = ".zhan.li.wu.".split(".");
System.out.println("str5長度:" + str5.length);
這樣的話,程序不會輸出你想要的結果;問題2:下面程序能否編譯通過,若能通過,會輸出什麼:
public class Test
{
public static void main(String[] args)
{
int i = 1;
int j = 1;
i = i + +j;
System.out.println(i);
i = 1;
j = 1;
i = i + + +j;
System.out.println(i);
i = 1;
j = 1;
i = i + + + +j;
System.out.println(i);
System.out.println("----------");
i = 1;
j = 1;
i = i++ + j;
System.out.println(i);
i = 1;
j = 1;
i = i++ + +j;
System.out.println(i);
i = 1;
j = 1;
i = i++ + + +j;
System.out.println(i);
System.out.println("--------");
i = 1;
j = 1;
i = i + ++j;
System.out.println(i);
i = 1;
j = 1;
i = i + + ++j;
System.out.println(i);
}
}
雖然這樣寫沒什麼意義;
原因:
public class Test2
{
public static void main(String[] args)
{
int i = 1;
int j = 1;
// 單個的+是可以編譯的;
i = i + +j;
System.out.println(i);
i = 1;
j = 1;
i = i + + +j;
System.out.println(i);
i = 1;
j = 1;
i = i + + + +j;
System.out.println(i);
System.out.println("----------");
// 通俗點講:++只能是緊跟着i,或緊挨着j,或兩者都可,且必須要有加號,否則的++就編譯不過;
// ++緊跟着i;
i = 1;
j = 1;
i = i++ + j;
System.out.println(i);
i = 1;
j = 1;
i = i++ + +j;
System.out.println(i);
i = 1;
j = 1;
i = i++ + + +j;
System.out.println(i);
System.out.println("--------");
// ++緊跟着j;
i = 1;
j = 1;
i = i + ++j;
System.out.println(i);
i = 1;
j = 1;
i = i + + ++j;
System.out.println(i);
//不能通過編譯的情況:
/*
i = 1;
j = 1;
i = i + ++ + j;
i = i ++ ++ j;
i = i ++ ++ + j;
System.out.println(i);
*/
}
}
所以,剛纔的結果:
2
2
2
----------
2
2
2
--------
3
3
問題3:下面程序輸出什麼:
public class Test
{
public static void main(String[] args)
{
Integer a = 10;
Integer b = 10;
Integer c = 300;
Integer d = 300;
System.out.println(a == b);
System.out.println(c == d);
System.out.println("------");
int aa = 10;
Integer bb = 10;
Integer cc = new Integer(10);
System.out.println(aa == bb);
System.out.println(bb == cc);
System.out.println(aa == cc);
System.out.println("------");
Float f1 = 10f;
Float f2 = 10f;
Float f3 = 300f;
Float f4 = 300f;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
輸出結果:
true
false
------
true
false
true
------
false
false
原因:
JDK1.5版本後,有了自動拆箱,自動封箱操作;
包裝類和String類相似,也是不可變的,編譯階段,將String常量放入字符串常量池中,下次使用時就可以直接從字符串常量池中提取;
而對於包裝類而言,同樣,對於頻繁使用的值,系統提供了包裝類的緩存,當需要時直接從緩衝中提取,而不是再創建一個新的包裝類對象,這些緩存的包裝類的值如下:
boolean的true和false,byte類型,short類型,int類型,long類型的值(-128~127), char值的0~127;
在對以上的數值進行封箱的時候,並不是創建一個新的對象,而是使用緩存中的對象,這樣當重複使用的時候就可以避免重複創建對象造成的浪費;
所以:
a == b和c == d 的結果不同;
而對於浮點類型float和double,包裝類沒有緩存;
而對於 aa == cc而言,則是包裝類的自動拆箱操作,可以用javap操作看一下這個類編譯後的字節碼文件;
javap -verbose Test.class
System.out.println(aa == cc);//這裏實際上是:aa == cc.intValue()
問題4:Java Web項目中 bulid path裏的包和WEB-INF/lib下的包有什麼區別;
區別:
(1)對於Java web項目而言,這是編譯器跟tomcat相關的問題,因爲最終項目不是通過本地的JRE去運行,而是部署到web服務器,如tomcat,weblogic等,這些服務器都實現了自身的類加載器;
(2)build path只不過把路徑寫入到classPath下面 不會把包拷到WEB-INF/lib目錄下,這種方法放到本機沒問題, 但是移到別的機子上就會出現缺少jar包的情況;
(3)eclipse編譯項目裏面的Java文件的時候是根據build path的,而tomcat運行項目首先是在它自己的公共lib裏找jar,如果找不到的話就會去項目的WEB-INFO/lib目錄找,如果找不到就報錯;
(4)軟件的發佈過程是通過服務器的,並不是編譯過程引用到的jar包在發佈階段一定會用到,所以現階段web開發部署到服務器當中需要手動將包加到web-inf/lib文件夾下;有時直接把jar複製到項目的WEB-INF/lib文件夾中,然後刷新項目,eclipse都會自動把jar在build path中引用;
(5)說白了就是用eclipse開發web的時候,如果是編譯java代碼用到的jar可以作爲library引用,如果是需要運行發佈部分(或者框架非java代碼部分)用到的jar就必須放在lib下面;
(6)所以,這兩種情況一起使用纔是最好的;
參考自:WEB-INF/lib和build path區別 和
build path和WEB-INF/LIB的區別