1. 程式人生 > >Java 程式設計基礎之易錯題

Java 程式設計基礎之易錯題

Spring 七大模組

七大模組,如下:

  1. Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中分離出依賴關係和配置。

2.Spring Context: 構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的物件訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支援(例如資源繫結),事件傳播,資源裝載的方式和Context的透明建立,比如說通過Servlet容器。

3.Spring DAO: DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤程式碼。 並且,JDBC封裝包還提供了一種比程式設計性更好的宣告性事務管理方法,不僅僅是實現了特定介面,而且對所有的POJOs(plain old Java objects)都適用。

4.Spring ORM: ORM 封裝包提供了常用的“物件/關係”對映APIs的整合層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“物件/關係”對映,如前邊提到的簡單宣告性事務管理。

5.Spring AOP: Spring的 AOP 封裝包提供了符合AOP Alliance規範的面向方面的程式設計實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱程式碼的功能耦合,清晰的被分離開。而且,利用source-level的元資料功能,還可以將各種行為資訊合併到你的程式碼中。

6.Spring Web: Spring中的 Web 包提供了基礎的針對Web開發的整合特性,例如多方檔案上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。

7.Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型程式碼和Web Form之間。並且,還可以藉助Spring框架的其他特性。

抽象類和介面

1、一個子類只能繼承一個抽象類(虛類),但能實現多個介面;
2、一個抽象類可以有構造方法,介面沒有構造方法;
3、一個抽象類中的方法不一定是抽象方法,即其中的方法可以有實現(有方法體),介面中的方法都是抽象方法,不能有方法體,只有宣告;
4、一個抽象類可以是public、private、protected、default,
介面只有public;
5、一個抽象類中的方法可以是public、private、protected、default,
介面中的方法只能是public和default

floor和ceil

這裡主要是有一點:

Math.ceil(d1) 

ceil 方法上有這麼一段註釋:If the argument value is less than zero but greater than -1.0, then the result is negative zero
如果引數小於0且大於-1.0,結果為 -0

Math.floor(d1)

ceil 和 floor 方法 上都有一句話:If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument,意思為:如果引數是 NaN、無窮、正 0、負 0,那麼結果與引數相同,
如果是 -0.0,那麼其結果是 -0.0

Object類中的方法

java object預設的基本方法中沒有copy(),
含有如下方法:
getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()

併發

CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景裡,比如快取。
ReadWriteLock 當寫操作時,其他執行緒無法讀取或寫入資料,而當讀操作時,其它執行緒無法寫入資料,但卻可以讀取資料 。適用於 讀取遠遠大於寫入的操作。
ConcurrentHashMap是一個執行緒安全的Hash Table,它的主要功能是提供了一組和HashTable功能相同但是執行緒安全的方法。ConcurrentHashMap可以做到讀取資料不加鎖,並且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持地儘量地小,不用對整個ConcurrentHashMap加鎖。

保留字、關鍵字 和顯式常量值

java中true ,false , null在java中不是關鍵字,也不是保留字,它們只是顯式常量值,但是你在程式中不能使用它們作為識別符號。

其中const和goto是java的保留字。java中所有的關鍵字都是小寫的,還有要注意true,false,null, friendly,sizeof不是java的關鍵字,但是你不能把它們作為java識別符號用。

垃圾收集器

兩個最基本的java回收演算法:複製演算法和標記清理演算法
複製演算法:兩個區域A和B,初始物件在A,繼續存活的物件被轉移到B。此為新生代最常用的演算法
標記清理:一塊區域,標記可達物件(可達性分析),然後回收不可達物件,會出現碎片,那麼引出
標記-整理演算法:多了碎片整理,整理出更大的記憶體放更大的物件
兩個概念:新生代和年老代
新生代:初始物件,生命週期短的
永久代:長時間存在的物件
整個java的垃圾回收是新生代和年老代的協作,這種叫做分代回收。
P.S:Serial New收集器是針對新生代的收集器,採用的是複製演算法
Parallel New(並行)收集器,新生代採用複製演算法,老年代採用標記整理
Parallel Scavenge(並行)收集器,針對新生代,採用複製收集演算法
Serial Old(序列)收集器,新生代採用複製,老年代採用標記整理
Parallel Old(並行)收集器,針對老年代,標記整理
CMS收集器,基於標記清理
G1收集器:整體上是基於標記 整理 ,區域性採用複製

綜上:新生代基本採用複製演算法,老年代採用標記整理演算法。cms採用標記清理。

String StringBuffer StringBuilder

效率:StringString(大姐,出生於JDK1.0時代) 不可變字元序列 <StringBuffer(二姐,出生於JDK1.0時代) 執行緒安全的可變字元序列 <StringBuilder(小妹,出生於JDK1.5時代) 非執行緒安全的可變字元序列 。Java中的String是一個類,而並非基本資料型別。string是值傳入,不是引用傳入。 StringBuffer和StringBuilder可以算是雙胞胎了,這兩者的方法沒有很大區別。但線上程安全性方面,StringBuffer允許多執行緒進行字元操作。 這是因為在原始碼中StringBuffer的很多方法都被關鍵字 synchronized 修飾了,而StringBuilder沒有。 StringBuilder的效率比StringBuffer稍高,如果不考慮執行緒安全,StringBuilder應該是首選。另外,JVM執行程式主要的時間耗費是在建立物件和回收物件上。

StringBuffer:StringBuffer每次結果都會對 StringBuffer 物件本身進行操作,而不是生成新的物件,再改變物件引用。

Collection 和 Map 介面

在這裡插入圖片描述

類繼承

子類不可以繼承父類的構造方法,只可以呼叫父類的構造方法。

執行緒啟動

一 、定義執行緒: 1、擴充套件java.lang.Thread類。 2、實現java.lang.Runnable介面。
二、例項化執行緒: 1、如果是擴充套件java.lang.Thread類的執行緒,則直接new即可。
2、如果是實現了java.lang.Runnable介面的類,則用Thread的構造方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
三、啟動執行緒: 線上程的Thread物件上呼叫start()方法,而不是run()或者別的方法。

Socket程式設計

執行緒停止和暫停執行

題目:什麼操作會使得當前執行緒停止。

A:一個InterruptedException 異常被捕獲

大家都知道的嘛 (一般通過interrupt方法 中斷執行緒) 如果抓到一個執行緒 都會關緊catch裡面 然後中斷當前操作,A正確。

B:執行緒執行了wait()方法。

執行緒使用了wait方法,會強行打斷當前操作,(暫停狀態,不會中斷執行緒) 進入阻塞(暫停)狀態,然後需要notify方法或notifyAll方法才能進入就緒狀態。 B 正確。

C:當前執行緒建立了一個新的執行緒。
新建立的執行緒不會搶佔時間片,只有等當前執行緒把時間片用完,其他執行緒才有資格拿到時間片去執行。

D:一個高優先級別的執行緒就緒。

如C相同,你優先級別再高 也待等我現在弄完才會給你。(就像我們玩遊戲,會員雖然有排隊優先權,但是還是要等正在登陸的使用者進去遊戲之後才能搶到他原來那個位置,不能說我在過關卡的過程中你一腳把我踢開,然後霸佔我的位置吧,我原來的那些資料咋辦!!!)

E:執行緒在MediaTracker上執行了waitforID()呼叫。

這個應該大家也不太熟悉。這個類是awt裡面的,我查API才知道。
然後他的功能是載入影象,直到完成之前,該方法一直等待!這個方法是必須要丟擲A選項的InterruptedException 異常的 說明這玩意會讓其他執行緒 wait他完成! 所以會暫停當前執行緒~~大概是這樣吧哈哈哈! E選項我沒選對! 這還是真的!。!

Vector 和 ArrayList

Vector & ArrayList 的主要區別
1) 同步性:Vector是執行緒安全的,也就是說是同步的 ,而ArrayList 是執行緒序不安全的,不是同步的 數2。
2)資料增長:當需要增長時,Vector預設增長為原來一倍 ,而ArrayList卻是原來的50% ,這樣,ArrayList就有利於節約記憶體空間。
如果涉及到堆疊,佇列等操作,應該考慮用Vector,如果需要快速隨機訪問元素,應該使用ArrayList 。

擴充套件知識:

  1. Hashtable & HashMap
    Hashtable和HashMap它們的效能方面的比較類似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。

  2. ArrayList & LinkedList

ArrayList的內部實現是基於內部陣列Object[],所以從概念上講,它更象陣列,但LinkedList的內部實現是基於一組連線的記錄,所以,它更象一個連結串列結構,所以,它們在效能上有很大的差別:
從上面的分析可知,在ArrayList的前面或中間插入資料時,你必須將其後的所有資料相應的後移,這樣必然要花費較多時間,所以,當你的操作是在一列資料的後面新增資料而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的效能; 而訪問連結串列中的某個元素時,就必須從連結串列的一端開始沿著連線方向一個一個元素地去查詢,直到找到所需的元素為止,所以,當你的操作是在一列資料的前面或中間新增或刪除資料,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

final

/**
 * @author shankai
 * 
 * final作為物件成員存在時,必須初始化;但是,如果不初始化,也可以在類的建構函式中初始
 * 因為java允許將資料成員宣告為final,卻不賦初值。但是,blank finals必須在使用之前初始化,且必須在建構函式中初始化  
 */
class Foo 
{
	//	The blank final field i may not have been initialized
    final int i;
    int j;
    public void doSomething() {
        System.out.println(++j + i);
    }
}

Forward 和 redirect

1.從位址列顯示來說
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.
redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.

2.從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.
redirect:不能共享資料.

3.從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組.
redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.

4.從效率來說
forward:高.
redirect:低.

執行緒

class Solution 
{
	public static void main(String args[]) {
	    Thread t = new Thread() {
	        public void run() {
	            pong();
	        }
	    };
	    t.run();
	    System.out.print("ping");
	}
	static void pong() {
	    System.out.print("pong");
	}

}
pongping

這裡需要注意Thread的start和run方法
用start方法才能真正啟動執行緒,此時執行緒會處於就緒狀態,一旦得到時間片,則會呼叫執行緒的run方法進入執行狀態。
而run方法只是普通方法,如果直接呼叫run方法,程式只會按照順序執行主執行緒這一個執行緒。

字串和+

class Solution 
{
	public static void main(String[] args) 
	{
	    //先出現字串,後面的內容自動強制轉換為string進行拼接
		System.out.println("is "+ 100 + 5);
		System.out.println(100 + 5 +" is");
		System.out.println("is "+ (100 + 5));
	}
}
is 1005
105 is
is 105

類中的static關鍵字

1、abstract不能與final並列修飾同一個類 對的。
2、abstract類中不應該有private的成員 對的 :abstract類中可以有private 但是不應該有。
3、abstract方法必須在abstract類或介面中 對的 : 若類中方法有abstract修飾的,該類必須abstract修改。介面方法預設public abstract。
4、static方法中能處理非static的屬性 錯誤 :在JVM中static方法在靜態區,靜態區無法呼叫非靜態區屬性。

class Solution 
{
	int sk;
	
	public static void main(String[] args) 
	{
		//		Cannot make a static reference to the non-static field sk
		sk = 1;
		System.out.println(new Two().x);
	}
}

HashMap和HashTable

HashTable中有contains方法

//以下是Hashtable的方法
public synchronized boolean contains(Object value)
public synchronized boolean containsKey(Object key)
public boolean containsValue(Object value)
 
//以下是HashMap中的方法,注意,沒有contains方法,所以,D錯誤
public boolean containsKey(Object key)
public boolean containsValue(Object value)

HashTable中的null不可以作key。HashMap可以

//Hashtable的put方法有以下語句塊,大夥看了都知道
// Make sure the value is not null
if (value == null) {
    throw new NullPointerException();
}
 
//那麼,我們再來看下HashMap的put方法中,有如下語句
//呼叫某個方法直接把key為null,值為value的鍵值對插入進去。
if (key == null)
    return putForNullKey(value);

HashTable加了同步機制

public V put(K key, V value) //HashMap的put方法,沒有同步
 
public synchronized V put(K key, V value) //Hashtable的put方法
//當然,Hashtable的其他方法,如get,size,remove等方法,
//都加了synchronized關鍵詞同步操作
//HashMap的原始碼
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
-----------------------------------
//Hashtable的原始碼
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
----------------------------------
很明顯,都實現了Map介面

巢狀類

為什麼一個負責任的Java程式設計師想使用巢狀類?

A.為了讓非常專門的類的程式碼與和它一起工作的類聯絡起來
B.為了支援產生特定事件的新的使用者介面。
C.為了用Java知識給打動老闆,到處使用巢狀類

AB

使用巢狀類,其中有幾個令人信服的理由:

加強封裝—考慮兩個頂級類,A和B,如果B需要訪問A的private成員,通過在A類隱藏B類,那麼即使A的成員宣告為private,那麼B也可以訪問它們。更多的是,B本身也可以隱藏於外部。

更可讀性,可維護性的程式碼—在頂級類裡巢狀小類,讓程式碼更靠近使用的地方。

Byte的初始值

class Two
{
	Byte x;
}

class Solution 
{
	public static void main(String[] args) 
	{
		System.out.println(new Two().x);
	}

null

抽象類和final

在Java中下面Class的宣告哪些是錯誤的?

A.
public abstract final class Test {
	abstract void method();
}

B.
public abstract class Test {
	abstract final void method();
}

C.
public abstract class Test {
	abstract void method() {
}
}

D.
public class Test {
	final void method() {

}
}

A、final修飾的類為終態類,不能被繼承,而 抽象類是必須被繼承的才有其意義的,因此,final是不能用來修飾抽象類的。
B、 final修飾的方法為終態方法,不能被重寫。而繼承抽象類,必須重寫其方法。
C、抽象方法是僅宣告,並不做實現的方法。

重寫和過載

在Java中,以下關於方法過載和方法重寫描述正確的是?
A方法過載和方法的重寫實現的功能相同
B方法重載出現在父子關係中,方法重寫是在同一類中
C方法過載的返回值型別必須一致,引數項必須不同
D方法重寫的返回值型別必須相同或相容。
D

方法重寫要注意的事項:
1.方法重寫時, 方法名與形參列表必須一致。
2.方法重寫時,子類的許可權修飾符必須要大於或者等於父類的許可權修飾符。
3.方法重寫時,子類的返回值型別必須要小於或者 等於父類的返回值型別。
4.方法重寫時, 子類丟擲的異常型別要小於或者等於父類丟擲的異常型別。
Exception(最壞)
RuntimeException(小壞)

方法的過載:在一個類中 存在兩個或者兩個 以上的同名函式,稱作為方法過載。

方法過載的要求
1. 函式名要一致。
2. 形參列表不一致(形參的個數或形參 的型別不一致)
3. 與返回值型別無關。

訪問許可權

在類設計中,類的成員變數要求僅僅能夠被同一package下的類訪問,請問應該使用下列哪個修飾詞(無修飾)

在這裡插入圖片描述

相關推薦

Java 程式設計基礎

Spring 七大模組 七大模組,如下: Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中

Java五道輸出解析(避免小錯誤)

收集了幾個易錯的或好玩的Java輸出題,分享給大家,以後在程式設計學習中稍微注意下就OK了。 1. 看不見的空格? 下面的輸出會正常嗎? package basic; public class IntegerTest { public static void main(Strin

Java(1)

輸出 col 順序執行 執行 AR new rgs oid hello 檢查程序,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。 public class HelloB extends HelloA { public HelloB() { } {

python基礎

pytho per efault 回來 derived 魔術方法 .get bject init 1.以下代碼輸入什麽: class Person: a = 1 def __init__(self): pass def getAge

noi庫1.8程式設計基礎多維陣列:題解大禮包20180918

題目傳送門 以下是對noi題庫1.8的全部題解,有需要的同學請自行學習。 有任何錯漏或者疑問,請留言。謝謝~~~ 1、題目分析 2、程式碼截圖 1.8程式設計基礎之多為陣列 編號 題目 相對難度1-5 知識點 1 矩陣交換行 2

JAVASE java程式設計基礎

1.關鍵字 定義:被Java語言賦予了特殊含義,用做專門用途的字串(單詞) 特點:關鍵字中所有字母都為小寫 (通俗的說就是在JAVA中有特殊含義的單詞) 例如:int,byte,short,enum,switch,return… 2.識別符號 凡是可以起名的地方

java 筆試(二 )

接著之前總結的java筆試易錯題,後續會有好多,所以新起一篇。 後續會持續更新。。。 1、下面有關JVM記憶體,說法錯誤的是? A   程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執

java 筆試面試

最近收集了幾個java中易錯的問題,後續還會繼續更新。 1、存在使i + 1 < i的數嗎? 答案:存在。 分析:如果i為int型,那麼當i為int能表示的最大整數時,i+1就溢位變成負數了,

Openjudge NOI庫1.7程式設計基礎字串 34:迴文子串

 總時間限制: 1000ms 記憶體限制: 65536kB 描述 給定一個字串,輸出所有長度至少為2的迴文子串。 迴文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如:abba,cccdeedccc都是迴文字串。 輸入一個字串,由字母或數字組成。長度500以內。

週末聯絡——>Java

package test; import java.util.Date; public class Test extends Date{ private static final long serialVersionUID = 1L; private void test(){ System.out.prin

Java SE

一、初始JAVA1、Java虛擬機器就是一個虛擬的用於執行  位元組碼檔案         的計算機。它是Java最核心的技術,是Java跨平臺的基礎。2、一個Java源程式是由若干個類組成。如果原始檔中有多個類時,則只能有一個類是  Public        類,並且這個

NOI庫答案(1.3 程式設計基礎算術表示式與順序執行)

01:A+B問題 總時間限制: 1000ms        記憶體限制: 65536kB 描述 在大部分的線上題庫中,都會將A+B問題作為第一題,以幫助新手熟悉平臺的使用方法。 A+B問題的題目描述如下:給定兩個整數A和B,輸出A+B的值。保證A、B及結果均在

Openjudge NOI庫1.11程式設計基礎二分查詢04 網線管理

仙境的居民們決定舉辦一場程式設計區域賽。裁判委員會完全由自願組成,他們承諾要組織一次史上最公正的比賽。他們決定將選手的電腦用星形拓撲結構連線在一起,即將它們全部連到一個單一的中心伺服器。為了組織這個完全公正的比賽,裁判委員會主席提出要將所有選手的電腦等距離地圍繞在伺服器周圍放置。 為購買網線,裁判委員會

NOI庫答案(1.5 程式設計基礎迴圈控制)(1—20

01:求平均年齡 總時間限制: 1000ms        記憶體限制: 65536kB 描述 班上有學生若干名,給出每名學生的年齡(整數),求班上所有學生的平均年齡,保留到小數點後兩位。 輸入 第一行有一個整數n(1<= n <= 100),表

java(2)

問: 第一,談談final, finally, finalize的區別。 最常被問到。 第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

NOI庫1.11程式設計基礎二分查詢 矩形分割

03:矩形分割 總時間限制: 1000ms 記憶體限制: 65536kB 描述 平面上有一個大矩形,其左下角座標(0,0),右上角座標(R,R)。大矩形內部包含一些小矩形,小矩形都平行於座標

Java EE基礎JSP

元素 ram 查看源 部分 fortran log 默認頁 head keyword 軟件152唐偉 一、JSP的基本原理以及和servlet的關系 在沒有出現 JSP之前,我們訪問網站都是訪問的Servlet,通過它返回html代碼。就像下面這樣:

java語言基礎面向對象變量

bsp 代碼塊 基礎 空間 tab width 必須 需要 程序 ---恢復內容開始--- 定義變量的語法: 數據類型 變量名=值 ----------------------------------------------------------- 變量根據在類中定義位置

Java語言基礎方法的設計

work tro str AD 如何 main方法 單元 結束 重載方法 開發遵循原則之一: DRY原則:Don‘t Repeat Yourself(不要重復你自己的代碼) 原因:重復意味著維護成本的增大 public static void main(

Java逆向基礎常量入棧指令

java入棧指令本文參考:http://www.vuln.cn/7115 常量入棧指令有iconst、bipush、sipush、ldc、ldc2_w分別對應不同的使用場景以下兩個表簡單總結了使用場景八大基本類型場景表常量類型常量範圍指令×××int-1~5iconst_0~ iconst_5iconst_m