Java小問題集合2


問題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的區別



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章