欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java面試題目集錦

 更新時間:2016年09月23日 09:09:32   作者:dian張  
本文是小編日常收集整理的java面試題目,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

1.equals方法用于比較對象的內(nèi)容是否相等(覆蓋以后)

2.hashcode方法只有在集合中用到

3.當(dāng)覆蓋了equals方法時,比較對象是否相等將通過覆蓋后的equals方法進(jìn)行比較(判斷對象的內(nèi)容是否相等)。

4.將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該對象放入集合中。如果hashcode值相等,然后再通過equals方法判斷要放入對象與集合中的任意一個對象是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。

5.沒有覆蓋equals方法 采用對象內(nèi)存地址是否相等來判斷對象是否相等。

因為是兩個新對象所以對象的內(nèi)存地址不相等,所以stu1.equals(stu2) 是false。

6.線程A和B都要獲取對象O的鎖定,假設(shè)A獲取了對象O鎖,B將等待A釋放對O的鎖定,如果使用 synchronized ,如果A不釋放,B將一直等下去,不能被中斷如果使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以后,中斷等待,而干別的事情

ReentrantLock獲取鎖定與三種方式:

a) lock(), 如果獲取了鎖立即返回,如果別的線程持有鎖,當(dāng)前線程則一直處于休眠狀態(tài),直到獲取鎖

b) tryLock(), 如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;

c)tryLock(long timeout,TimeUnit unit), 如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數(shù)給定的時間,
在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;

d) lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當(dāng)前線程處于休眠狀態(tài),直到或者鎖定,
或者當(dāng)前線程被別的線程中斷

synchronized是在JVM層面上實現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時出現(xiàn)異常,
JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現(xiàn)的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中

在資源競爭不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常態(tài);

在 JDK 中,主要由以下類來實現(xiàn) Java 反射機(jī)制,這些類都位于 java.lang.reflect 包中:

Class 類:代表一個類。

Field 類:代表類的成員變量(成員變量也稱為類的屬性)。

Method 類:代表類的方法。

Constructor 類:代表類的構(gòu)造方法。

Array 類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法。

下面給出幾個例子看看 Reflection API 的實際運(yùn)用:

一、通過 Class 類獲取成員變量、成員方法、接口、超類、構(gòu)造方法等

在 java.lang.Object 類中定義了 getClass() 方法,因此對于任意一個 Java 對象,都可以通過此方法獲得對象的類型。 Class 類是 Reflection API 中的核心類,它有以下方法

getName() :獲得類的完整名字。

getFields() :獲得類的 public 類型的屬性。

getDeclaredFields() :獲得類的所有屬性。

getMethods() :獲得類的 public 類型的方法。

getDeclaredMethods() :獲得類的所有方法。

getMethod(String name, Class[] parameterTypes) :獲得類的特定方法, name 參數(shù)指定方法的名字, parameterTypes 參數(shù)指定方法的參數(shù)類型。

getConstructors() :獲得類的 public 類型的構(gòu)造方法。

getConstructor(Class[] parameterTypes) :獲得類的特定構(gòu)造方法, parameterTypes 參數(shù)指定構(gòu)造方法的參數(shù)類型。

newInstance() :通過類的不帶參數(shù)的構(gòu)造方法創(chuàng)建這個類的一個對象。

編寫Java反射程序的步驟:

1)必須首先獲取一個類的Class對象

例如:

Class c1 = Test.class;
  Class c2 = Class.forName(“com.reflection.Test”);
  Class c3 = new Test().getClass();

  2)然后分別調(diào)用Class對象中的方法來獲取一個類的屬性/方法/構(gòu)造方法的結(jié)構(gòu)

  注意:如果要能夠正常的獲取類中方法/屬性/構(gòu)造方法應(yīng)該重點掌握如下的反射類

  Field

  Constructor

  Method

<servlet-mapping> 
<servlet-name></servlet-name>
<url-pattern></url-pattern> 
</servlet-mapping> 
for (String elementA:str ) { 
System.out.print(elementA + " "); 
} 
List<String> list = new ArrayList<String>(); 
for (int i=0; i<str.length; i++) { 
if(!list.contains(str[i])) { 
list.add(str[i]); 
} 
}
Set<String> set = new HashSet<String>(); 
for (int i=0; i<str.length; i++) { 
set.add(str[i]); 
}

spring有六種事務(wù)五種隔離級別

第一類:整型 byte short int long

第二類:浮點型 float double

第三類:邏輯型 boolean(它只有兩個值可取true false)

第四類:字符型 char

final修飾類中的方法

作用:可以被繼承,但繼承后不能被重寫。

final修飾類

作用:類不可以被繼承。

final修飾基本類型時候值不變,引用類型表示地址不變,就是new的時候那個是地址不能重新賦值

final修飾屬性你懂的

prepareStatement是預(yù)編譯的,先把這個SQL提交到數(shù)據(jù)庫中進(jìn)行預(yù)處理,然后將其放到緩存里面,下次發(fā)現(xiàn)有相同的就不用編譯了,執(zhí)行效率高,有語法提示方便檢查,參數(shù)是動態(tài)的,防止sql注入因為語法檢查

select * from tbName = ‘zck' and passwd = ” or ‘1' = ‘1'; 

statement就不是預(yù)編譯,而且需要手動檢查語法錯誤,屬于硬編碼

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

put方法

HashMap會對null值key進(jìn)行特殊處理,總是放到table[0]位置put過程是先計算hash然后通過hash與table.length取摸計算index值,然后將key放到table[index]位置,當(dāng)table[index]已存在其它元素時,會在table[index]位置形成一個鏈表,將新添加的元素放在table[index],原來的元素通過Entry的next進(jìn)行鏈接,這樣以鏈表形式解決hash沖突問題,當(dāng)元素數(shù)量達(dá)到臨界值(capactiy*factor)時,則進(jìn)行擴(kuò)容,是table數(shù)組長度變?yōu)閠able.length*2

get方法

同樣當(dāng)key為null時會進(jìn)行特殊處理,在table[0]的鏈表上查找key為null的元素

get的過程是先計算hash然后通過hash與table.length取摸計算index值,然后遍歷table[index]上的鏈表,直到找到key,然后返回HashMap和Hashtable的底層實現(xiàn)都是數(shù)組+鏈表結(jié)構(gòu)實現(xiàn)的添加、刪除、獲取元素時都是先計算hash,根據(jù)hash和table.length計算index也就是table數(shù)組的下標(biāo),然后進(jìn)行相應(yīng)操作

索引大多數(shù)基于B樹

Servlet線程安全問題主要是由實例變量造成的,因此在Servlet中應(yīng)避免使用實例變量。
如果應(yīng)用程序設(shè)計無法避免使用實例變量,那么使用同步來保護(hù)要使用的實例變量,但為保證系統(tǒng)的最佳性能,應(yīng)該同步可用性最小的代碼路徑。

寫一個單例模式

public static long recursive(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
return recursive(n - 1) + recursive(n - 2);
}
public static long loop(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
long fib1 = 0;
long fib2 = 1;
long sum = 0;
for (int i = 2; i <= n; i++) {
sum = fib1 + fib2;
fib1 = fib2;
fib2 = sum;
}
return sum;
}

HashTable是一個線程安全的類,它使用synchronized來鎖住整張Hash表來實現(xiàn)線程安全,即每次鎖住整張表讓線程獨(dú)占。ConcurrentHashMap允許多個修改操作并發(fā)進(jìn)行,其關(guān)鍵在于使用了鎖分離技術(shù)。它使用了多個鎖來控制對hash表的不同部分進(jìn)行的修改。

ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的Hashtable,它們有自己的鎖。只要多個修改操作發(fā)生在不同的段上,它們就可以并發(fā)進(jìn)行。

有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢后,又按順序釋放所有段的鎖。這里“按順序”是很重要的,否則極有可能出現(xiàn)死鎖,在ConcurrentHashMap內(nèi)部,段數(shù)組是final的,并且其成員變量實際上也是final的,但是,僅僅是將數(shù)組聲明為final的并不保證數(shù)組成員也是final的,這需要實現(xiàn)上的保證。

這可以確保不會出現(xiàn)死鎖,因為獲得鎖的順序是固定的

① ThreadLocal ② synchronized( ) ③ wait() 與 notify() ④ volatile

ThreadLocal

ThreadLocal 保證不同線程擁有不同實例,相同線程一定擁有相同的實例,即為每一個使用該變量的線程提供一個該變量值的副本,每一個線程都可以獨(dú)立改變自己的副本,而不是與其它線程的副本沖突。

優(yōu)勢:提供了線程安全的共享對象

與其它同步機(jī)制的區(qū)別:同步機(jī)制是為了同步多個線程對相同資源的并發(fā)訪問,是為了多個線程之間進(jìn)行通信;
而 ThreadLocal 是隔離多個線程的數(shù)據(jù)共享,從根本上就不在多個線程之間共享資源,這樣當(dāng)然不需要多個線程進(jìn)行同步了。

volatile

volatile 修飾的成員變量在每次被線程訪問時,都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,

當(dāng)成員變量發(fā)生變化時,強(qiáng)迫線程將變化值回寫到共享內(nèi)存。

優(yōu)勢:這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。

緣由:Java 語言規(guī)范中指出,為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,

而且只當(dāng)線程進(jìn)入或者離開同步代碼塊時才與共享成員變量的原始值對比。

這樣當(dāng)多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。

而 volatile 關(guān)鍵字就是提示 VM :對于這個成員變量不能保存它的私有拷貝,而應(yīng)直接與共享成員變量交互。

使用技巧:在兩個或者更多的線程訪問的成員變量上使用 volatile 。

當(dāng)要訪問的變量已在 synchronized 代碼塊中,或者為常量時,不必使用。

線程為了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實訪問的是B。只在某些動作時才進(jìn)行A和B的同步,因此存在A和B不一致的情況。volatile就是用來避免這種情況的。

volatile告訴jvm,它所修飾的變量不保留拷貝,直接訪問主內(nèi)存中的(讀操作多時使用較好;線程間需要通信,本條做不到)

Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。

這就是說線程能夠自動發(fā)現(xiàn) volatile 變量的最新值。Volatile 變量可用于提供線程安全,但是只能應(yīng)用于非常有限的一組用例:多個變量之間或者某個變量的當(dāng)前值與修改后值之間沒有約束。

您只能在有限的一些情形下使用 volatile 變量替代鎖。要使 volatile 變量提供理想的線程安全,必須同時滿足下面兩個條件:
對變量的寫操作不依賴于當(dāng)前值;該變量沒有包含在具有其他變量的不變式中。

sleep() vs wait()

sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,把執(zhí)行機(jī)會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。

wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。 (如果變量被聲明為volatile,在每次訪問時都會和主存一致;如果變量在同步方法或者同步塊中被訪問,當(dāng)在方法或者塊的入口處獲得鎖以及方法或者塊退出時釋放鎖時變量被同步。)

http://www.yjbys.com/news/202750.html

客戶程序要先得到具體容器角色,然后再通過具體容器角色得到具體迭代器角色

Iterator it=new ArrayList.iterator();

1) 訪問一個容器對象的內(nèi)容而無需暴露它的內(nèi)部表示。

2) 支持對容器對象的多種遍歷。

3) 為遍歷不同的容器結(jié)構(gòu)提供一個統(tǒng)一的接口(多態(tài)迭代)。

使用new關(guān)鍵字 } → 調(diào)用了構(gòu)造函數(shù)

使用Class類的newInstance方法 } → 調(diào)用了構(gòu)造函數(shù)

使用Constructor類的newInstance方法 } → 調(diào)用了構(gòu)造函數(shù)

使用clone方法 } → 沒有調(diào)用構(gòu)造函數(shù)

使用反序列化 } → 沒有調(diào)用構(gòu)造函數(shù)

Employee emp2 = (Employee) Class.forName(“com.Employee”).newInstance(); 

或者

Employee emp2 = Employee.class.newInstance();
Constructor constructor = Employee.class.getConstructor(); 
Employee emp3 = constructor.newInstance();

使用clone方法,我們需要先實現(xiàn)Cloneable接口并實現(xiàn)其定義的clone方法

Employee emp4 = (Employee) emp3.clone();

程序在啟動的時候,并不會一次性加載程序所要用的所有class文件,而是根據(jù)程序的需要,通過Java的類加載機(jī)制(ClassLoader)來動態(tài)加載某個class文件到內(nèi)存當(dāng)中的,從而只有class文件被載入到了內(nèi)存之后,才能被其它class所引用。所以ClassLoader就是用來動態(tài)加載class文件到內(nèi)存當(dāng)中用的。

Bootstrap ClassLoader:稱為啟動類加載器,是Java類加載層次中最頂層的類加載器,負(fù)責(zé)加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等Extension ClassLoader:稱為擴(kuò)展類加載器,負(fù)責(zé)加載Java的擴(kuò)展類庫, 默認(rèn)加載JAVA_HOME/jre/lib/ext/目下的所有jar。

App ClassLoader:稱為系統(tǒng)類加載器,負(fù)責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文件。

因為這樣可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時候,就沒有必要子ClassLoader再加載一次。

考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態(tài)替代java核心api中定義的類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經(jīng)在啟動時就被引導(dǎo)類加載器(Bootstrcp ClassLoader)加載,所以用戶自定義的ClassLoader永遠(yuǎn)也無法加載一個自己寫的String,除非你改變JDK中ClassLoader搜索類的默認(rèn)算法。

1、request對象 客戶端請求,此請求會包含來自GET/POST請求的參數(shù)通過它才能了 解到客戶的需求,然后做出響應(yīng)。

2、response對象 響應(yīng)客戶請求的有關(guān)信息

3、session對象 它指的是客戶端與服務(wù)器的一次會話,從客戶端連到服務(wù)器的一個 WebApplication開始,直到客戶端與服務(wù) 器斷開連接為止。

4、out對象 它是JspWriter類的實例,是向客戶端輸出內(nèi)容常用的對象

5、page對象 它是指向當(dāng)前JSP頁面本身,有點象類中的this指針,它是 java.lang.Object類的實例

6、application對象 它實現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量。它開始于服務(wù)器的啟動,直到服務(wù)器的關(guān)閉

7、exception對象 它是一個例外對象,當(dāng)一個頁面在運(yùn)行過程中發(fā)生了例外,就產(chǎn)生這個對象。

8、pageContext對象 它提供了對JSP頁面內(nèi)所有的對象及名字空間的訪問

9、config對象 它是在一個Servlet初始化時,JSP引擎向它傳遞信息用的

js有個函數(shù) isNaN(val)//如果是數(shù)字則返回 false

有XMLDOM解析、SAX解析、StAX解析

XMLDOM:(XMLDocumentObjectModel)處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合對XML的隨機(jī)訪問;

SAX:(SimpleAPIforXML)不同于DOM,SAX是事件驅(qū)動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當(dāng)遇到像文件開頭,文檔結(jié)束,或者標(biāo)簽開頭與標(biāo)簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問;

StAX:(StreamingAPIforXML)與其他方法的區(qū)別就在于應(yīng)用程序能夠把XML作為一個事件流來處理,無論從性能還是可用性上都優(yōu)于其他方法;

thread.getState()

以上是小編給大家整理的有關(guān)java面試題,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • Java語言Lang包下常用的工具類介紹

    Java語言Lang包下常用的工具類介紹

    這篇文章主要介紹了Java語言Lang包下常用的工具類介紹,次奧變覺得挺不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • Java Lambda表達(dá)式和函數(shù)式接口實例分析

    Java Lambda表達(dá)式和函數(shù)式接口實例分析

    這篇文章主要介紹了Java Lambda表達(dá)式和函數(shù)式接口,結(jié)合實例形式分析了Java8 Lambda表達(dá)式和函數(shù)式接口相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下
    2019-09-09
  • Java_Spring之基于注解的 AOP 配置

    Java_Spring之基于注解的 AOP 配置

    這篇文章主要介紹了Java_Spring中基于注解的AOP配置,我們要先進(jìn)行環(huán)境的搭建,在進(jìn)行注解配置,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 使用spring-cache一行代碼解決緩存擊穿問題

    使用spring-cache一行代碼解決緩存擊穿問題

    本文主要介紹了使用spring-cache一行代碼解決緩存擊穿問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • drools規(guī)則動態(tài)化實踐解析

    drools規(guī)則動態(tài)化實踐解析

    這篇文章主要為大家介紹了drools規(guī)則動態(tài)化實踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 基于JavaSwing+mysql開發(fā)一個學(xué)生社團(tuán)管理系統(tǒng)設(shè)計和實現(xiàn)

    基于JavaSwing+mysql開發(fā)一個學(xué)生社團(tuán)管理系統(tǒng)設(shè)計和實現(xiàn)

    項目使用Java swing+mysql開發(fā),可實現(xiàn)基礎(chǔ)數(shù)據(jù)維護(hù)、用戶登錄注冊、社團(tuán)信息列表查看、社團(tuán)信息添加、社團(tuán)信息修改、社團(tuán)信息刪除以及退出注銷等功能、界面設(shè)計比較簡單易學(xué)、適合作為Java課設(shè)設(shè)計以及學(xué)習(xí)技術(shù)使用,需要的朋友參考下吧
    2021-08-08
  • SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java枚舉抽象方法實例解析

    Java枚舉抽象方法實例解析

    這篇文章主要介紹了Java枚舉抽象方法實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的方法

    Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的方法

    這篇文章主要給大家介紹了關(guān)于Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • java實現(xiàn)波雷費(fèi)密碼算法示例代碼

    java實現(xiàn)波雷費(fèi)密碼算法示例代碼

    這篇文章主要介紹了java實現(xiàn)波雷費(fèi)密碼算法示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論