JDK 和 JRE 有什麼區別?
JDK是java的開發工具包,包含各類類庫,而且包含了JRE,javac是在JDK中的;
JRE是java程序的運行環境,安裝過程當中自動添加PATHhtml
== 和 equals 的區別是什麼?前端
兩個對象的 hashCode()相同,則 equals()也必定爲 true,對嗎?
首先,兩個對象equals相等,hashcode必定相等;可是hashcode相等時,equals不必定相等.
其次,兩個不一樣的對象,由於可能存在哈希碰撞,因此hashcode多是相等的,可是顯然equals不爲true.
還有就是,在object類中,euqals方法仍是用的==來判斷的,==對於對象而言比較的是地址值,因此equals相等
hashcode必定同樣,反之就不必定了.java
final 在 java 中有什麼做用?
final關鍵字可做用於類,類屬性和方法;
做用於類上時,該類不能被繼承
做用於屬性時,該屬性不能被從新複製
做用於方法時,該方法不能被重寫node
java 中的 Math.round(-1.5) 等於多少?
Math的round方法是四捨五入,若是參數是負數,則往大的數如,Math.round(-1.5)=-1mysql
String 屬於基礎的數據類型嗎?
不是,String是一個類,是引用數據類型.web
java 中操做字符串都有哪些類?它們之間有什麼區別?
有String,StringBuilder,StringBuffer面試
String str="i"與 String str=new String(「i」)同樣嗎?
他們的值相等,用equals獲得true,可是他們是兩個對象,若是用==判斷返回false.
且str="i"是直接在常量池中引用字符串,而new String(「i」)是在堆中根據i再建立一個對象.正則表達式
如何將字符串反轉?redis
StringBuilder sb = new StringBuilder("abc");
sb.reverse().toString();
12複製代碼
public String reverseString(String str) {
if ((null == str) || str.length()<2) {
return str;
}
return reverseString(str.subString(1)) +str.charAt(0);
}
123456複製代碼
String 類的經常使用方法都有那些?
charAt(int index)返回指定索引處的字符
length()返回字符串長度
split()根據給定的正則表達式拆分字符串
toString()返回此對象自己算法
抽象類必需要有抽象方法嗎?
抽象類能夠沒有抽象方法,可是若是一個類已經聲明爲抽象類,那麼它也不能再實例化,不能直接構造該類對象.
普通類和抽象類有哪些區別?
抽象類能使用 final 修飾嗎?
不能,final修飾的類是不能被繼承的,若是抽象類不能繼承,就沒有意義了.
接口和抽象類有什麼區別?
java 中 IO 流分爲幾種?
大的方面來講有兩種:字節流和字符流
字節流繼承於InputStream、OutputStream
字符流繼承於Reader、Writer
BIO、NIO、AIO 有什麼區別?
Files的經常使用方法都有哪些?
String getName():返回File對象所表示的文件名或文件路徑
String getPath():返回File對象所對應的相對路徑
boolean exists():判斷File對象的文件或者目錄是否存在
boolean isDirectory():判斷File對象是不是目錄
並行和併發有什麼區別?
並行是多個事件同時進行,併發是多個事件在某一時間段內間隔發生.
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支持併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持並行。
線程和進程的區別?
進程是操做系統資源分配的基本單位,線程是任務調度和執行的基本單位.
進程有獨立的地址空間,一個進程崩潰後在保護模式下不會對其餘進程產生影響,而線程只是一個進程中的
不一樣執行路徑,線程有本身的堆棧和局部變量.在操做系統中能同時運行多個進程,而在同一個進程內有多個
線程同時執行.
守護線程是什麼?
守護線程是服務其餘線程的,在java中,線程有兩種:守護線程和用戶線程.
java中的jvm垃圾回收線程就是一個典型的守護線程.當用戶線程所有執行完,包括main線程也執行完畢,那麼
jvm會自動退出,此時守護線程也就中止了.
建立線程有哪幾種方式?
三種: 1. 繼承Thread類,重寫run方法,用子類實例調用start()方法;
2. 實現Runnable接口並重寫run方法,建立Thread實例並傳入Runnable實例,代用Thread的start()方法
3. 建立Callable接口的實現類,重寫call方法;
構造此實現類的實例,將其做爲參數構造一個FutureTask類的實例;
以FutureTask的實例爲參數構造一個Thread對象執行start()方法.
第三種方式能夠容許有返回值,也能夠聲明拋出異常類.
說一下 runnable 和 callable 有什麼區別?
runnable方式時,多個線程間能夠共享實例變量,callable方式則不行
runnable方式沒有返回值,callable有返回值
runnable方式run方法的異常只能在內部消化,callable的call()方法容許拋出異常
線程有哪些狀態?
sleep() 和 wait() 有什麼區別?
notify()和 notifyAll()有什麼區別?
notify()方法隨機喚醒一個wait線程到鎖池中去競爭鎖,而notifyAll方法喚醒全部wait線程到鎖池.
notity()方法可能產生死鎖,notifyAll則不會.
線程的 run()和 start()有什麼區別?
run()方法只是定義了線程的執行單元並不是直接開啓了線程資源,只有start()方法被調用,才能夠啓動一個線程.
若是直接調用run方法,會被當成普通方法在main線程執行,並不會建立線程.
44.建立線程池有哪幾種方式?
java中的Executors能夠爲咱們建立現成的線程池,有如下幾種:
線程池中 submit()和 execute()方法有什麼區別?
在 java 程序中怎麼保證多線程的運行安全?
多線程鎖的升級原理是什麼?
在java中,鎖有三種狀態,級別從低到高依次爲:偏向鎖、輕量級鎖、重量級鎖,這幾個狀態會隨着競爭狀況逐漸升級,可是不能降級.
先說爲何要有鎖升級:由於synchronized是重量級鎖,每次在進行鎖請求時,若是當前資源被其餘線程佔有,就要將當前線程阻塞,加入到阻塞隊列中而後
清空當前線程的緩存,等到鎖釋放時再經過notify或者notifyAll方法喚醒當前線程,讓其處於就緒狀態.在這個過程當中是很是消耗資源的,並且有時候線程剛掛起,鎖就釋放了.
而java的線程是映射到操做系統的原生線程之上的,每次線程的阻塞和喚醒都要在用戶態和核心態之間轉換,十分浪費資源.因此jvm對syncronized進行了優化,分爲三種鎖.
什麼是死鎖?
死鎖是指兩個或兩個以上的進程或線程在執行過程當中,因爭奪資源而形成的一種相互等待的過程,若是沒有外力做用,他們講沒法推動下去.
怎麼防止死鎖?
ThreadLocal 是什麼?有哪些使用場景?
也成爲線程本地變量,ThreadLocal在每一個線程中對一個變量建立了一個副本,且在線程內部任何地方均可以使用,線程間互不影響.
應用場景:spring的聲明式事物管理.
說一下 synchronized 底層實現原理?
首先,每一個對象都有一個監視器鎖(monitor),當monitor被佔用時就會處於鎖定狀態,線程執行monitorenter指令時嘗試獲取monitor的全部權,過程以下:
synchronized 和 volatile 的區別是什麼?
synchronized 和 Lock 有什麼區別?
synchronized 和 ReentrantLock 區別是什麼?
說一下 atomic 的原理?
atomic包用中的類能夠實現多線程環境下的變量操做,底層是調用CPU的CAS指令來進實現線程安全的.
CAS,比較並操做,每次在set前,對比一下當前值和預期值是否同樣,同樣則set,不然認爲失敗,循環對比直到成功.
throw 和 throws 的區別?
throws:用來聲明一個方法可能拋出的全部異常信息,不會處理異常,只是將異常向上傳,交給調用者
throw:拋出一個具體的異常類型.
throws出如今方法聲頭,而throw出如今函數體
throws表示出現異常的可能,並不必定會發生,throw則是拋出了一個存在的異常實例.
final、finally、finalize 有什麼區別?
final: 修飾類,表示該類不可繼承
修飾方法,表示該方法不可重寫
修飾變量,表示該變量不容許被修改
finally:是保證代碼必定要被執行的一種機制.經常使用來關閉鏈接資源或者解鎖等.
finalize:是Object的一個方法,它的目的是保證對象在被垃圾收集前完成特定資源的回收.1.9後已通過時.
try-catch-finally 中哪一個部分能夠省略?
catch能夠省略
無論有沒有捕獲到異常,finally中的代碼都會被執行;
finally是在return以後執行的,程序在執行完return以後,會將值保存起來,當執行完finally中的代碼以後再將return值返回
若是finally中存在return,會致使最後返回的是finally中的值.
try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?
會執行,return的值會暫時保存.等到運行完finally中的代碼塊時纔會返回return的值
常見的異常類有哪些?
空指針異常類型:NullPointerException
類型強制轉換類型:ClassCastException
數組下標越界異常:ArrayIndexOutOfBoundsException
輸入輸出異常:IOException
爲何要使用 hibernate?
1.對JDBC訪問數據庫的代碼作了大量的封裝,簡化開發
2.性能好,支持各類關係數據庫.
什麼是 ORM 框架?
ORM的意思是對象關係映射,它的做用是在關係型數據庫和業務實體對象之間作映射
這樣咱們在操做具體業務對象的時候,就不須要去和具體的SQL語句打交道,只須要操做對象的屬性和方法.
hibernate 中如何在控制檯查看打印的 sql 語句?
在hibernate配置文件中配置hibernate.show_sql屬性
hibernate 有幾種查詢方式?
三種:HQL查詢 QBC查詢(也叫Criteria查詢) 本地SQL查詢
hibernate 實體類能夠被定義爲 final 嗎?
不能,由於hibernate使用代理方式在延遲加載的狀況下提升性能,若是定義爲final
就不能繼承,也就沒法實現代理.
在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
1.若是數據庫返回字段值是null的話,int類型會報錯,Integer則不會
hibernate 是如何工做的?
經過Configuration config = new Configuration().configure();解析配置文件
由hibernate.cfg.xml中的讀取並解析映射信息
經過SessionFactory sf = config.buildSessionFactory();//建立SessionFactory
Session session = sf.openSession();//打開Sesssion
Transaction tx = session.beginTransaction();//建立並啓動事務Transation
persistent operate操做數據,持久化操做
tx.commit();//提交事務
關閉session和sessionFactory
get()和 load()的區別?
get方式會直接觸發sql語句查出對象,load方式會使用延遲加載的機制加載這個對象,此時是個代理對象
只保存實體對象的id值,只有用到其餘屬性的時候纔會調用sql查出來.
若是對象不存在,get方式會拋出空指針異常,load方式會拋出ObjectNotFoundException
說一下 hibernate 的緩存機制?
hibernate爲了下降對數據庫訪問的頻率,加入了緩存機制.緩存內的數據是對物理數據庫數據的複製,
應用程序在運行時,從緩存中讀寫數據.
Hibernate的緩存包括兩大類:session一級緩存和sessionFactory二級緩存.一級緩存不可卸載.
當根據ID查詢數據的時候,首先從session緩存中查,查不到,若是設置了二級緩存,那麼從二級緩存中查,
若是都查不到,再查數據庫.將查到的數據按照ID放入緩存中,在刪除,更新,增長數據的時候更新緩存.
hibernate 對象有哪些狀態?
Hibernate對象有三種狀態
Transient 瞬時態, 此時對象剛new出來,尚未save()
Persistent 持久態, 調用了save方法或者遊離態的對象調用了update方法後會變成持久態
若是對象是持久化對象時,那麼對該對象的任何修改,都會在提交事務時纔會與之進行比較
當調用了session.clear()方法,之後 對象就會變成遊離態
在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
採用getCurrentSession()得到的session會綁定到當前線程,而openSession則不會
getCurrentSession()得到的session在commit或者rollback後會自動關閉,而openSession必須手動關閉
hibernate 實體類必需要有無參構造函數嗎?爲何?
必需要有,覺得hibernate是經過反射的方式來得到對象實例的,此時會調用默認的無參構造.
mybatis 中 #{}和 ${}的區別是什麼?
前者會將傳入的數據當成字符串,在以前加入雙引號,後者是直接將數據顯示在sql中
前者會當作佔位符,防sql注入,後者不能
mybatis 有幾種分頁方式?
兩種,一種是內存分頁,一種是物理分頁
內存分頁: 一次性查詢出全部知足條件的數據,臨時保存在集合中,經過List的subList的方式獲取分頁數據.
物理分頁: 藉助sql進行分頁或者利用攔截器分頁
RowBounds 是一次性查詢所有結果嗎?爲何?
不是,由於mybatis是對JDBC的封裝,在JDBC的驅動中有一個Fetch Size的配置,它規定了每次最多從數據庫查詢多少條數據.這樣作能夠防止內存溢出.
mybatis 邏輯分頁和物理分頁的區別是什麼?
邏輯分頁一次性查詢不少數據,而後再結果中檢索分頁的數據,消耗內存.
物理分頁是從數據庫查詢指定條數的數據.
mybatis 是否支持延遲加載?延遲加載的原理是什麼?
支持,在配置文件的標籤中設置就能夠激活
原理: 在調用的時候出發加載,而不是在初始化的時候加載信息.如a.getB().getName(),若是a.getB()的值爲null,會觸發保存好的關聯B對象的sql語句查詢出B,而後再調用getName().
說一下 mybatis 的一級緩存和二級緩存?
一級緩存是SqlSession級別的,在一個sqlsession中,第一次查詢緩存中是否有數據,沒有就會查詢數據庫,並將數據保存在一級緩存中.第二次去查的時候會直接從緩存中查詢.若是這中間sqlsession進行了commit操做則會清空緩存.
二級緩存是Mapper級別的,多個sqlsession共享,默認關閉.它基於Mapper文件的namespace,若是兩個mapper的namespace相同,那麼會共享緩存的數據.使用二級緩存要在配置文件中開啓,而且序列化po類.
mybatis 和 hibernate 的區別有哪些?
mybatis靈活,能夠寫sql,hibernate學習困難
mybatis 有哪些執行器(Executor)?
SimpleExecutor:每執行一次 update 或 select 就開啓一個 Statement 對象,用完馬上關閉 Statement 對象
ReuseExecutor:執行update或select以SQL做爲key查找Statement對象,存在就使用,不存在就建立,用完後不關閉,能夠重複使用
BatchExecutor:執行update(沒有select,jdbc批處理不支持select)時,將全部SQL都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象.
mybatis 分頁插件的實現原理是什麼?
分頁插件的基本原理是使用 MyBatis 提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的SQL,而後重寫SQL,根據dialect方言,添加對應的物理分頁語句和參數
mybatis 如何編寫一個自定義插件?
只需實現Interceptor接口,並指定要攔截的方法簽名
@Intercepts({
@Signature(
type=Executor.class,method=「update」,args={ MappedStatement.class,Object.class })})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
//自定義實現
return invocation.proceed();
}
public Object plugin(Object target){
return Plugin.wrap(target,this)
}
public void setProperties(Properties properties){
//傳入配置項
String size = properties.getProperty(「size」);
}
}
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<!-- 這裏的配置項就傳入setProperties方法中 -->
<property name="size" value="100">
</plugin>
</plugins>
1234567複製代碼