java 面試題

數據庫 方面
一、Oracle 數據庫分爲:內鏈接和外鏈接。
內鏈接:通常就是等值連鏈接。
例如: select * from A a ,B b where A.c = B.c;
或者:
select * from A inner join B on A.c = B.c;
這兩種查詢方式我認爲是等效的。 內鏈接的特色就是:只查詢兩張表匹配的記錄,匹配不到的記錄是查不出來的。
外鏈接:分爲:左外鏈接 和 右外鏈接。特色就是:有一些關聯信息查詢不出來的時候,使用外鏈接。 主表能夠查詢出來。
左外鏈接 : 以 left outer join 前面的表爲主表。
left outer join
右外鏈接: 以 right outer join 前面的表爲主表。
right outer join

例如 :要進行部門表和員工表進行關聯查詢,而且查詢全部的部門信息。有可能一些部門沒有員工,這樣會有一些信息是
沒法匹配到的,這個時候能夠用左外鏈接或者右外鏈接。
select * from dept left outer join employment on dept.deptid = employment.deptid;html

全鏈接:
full join
全鏈接查詢:左外鏈接和右外鏈接 查詢的並集。
select * from dept full join employment where 1 = 1;

二、oracle 中經常使用的函數都有哪些?
日期處理函數:例如:month_between,add_month
轉換函數:to_number,to_data,to_char
字符處理函數:substr,replace,trim,concat,upper等
邏輯函數:nvl2(E1,E2,E3):若是E1 爲 null,返回E3,不然返回E2.
聚合函數:sum,avg,max,min


oracle 系統優化
1、sql 語句的優化:
一、不用(*)代替全部列名,
緣由:若是用*代替全部列名的話,oracle系統會出現動態解析的問題,好比須要到數據字典中來驗證表和列的定義等。java

二、在可以確保數據完整性的前提下,多使用commit來進行提交。
緣由:這樣能夠釋放:程序語句得到的鎖,以及回滾段上的數據操縱信息,還有oracle系統管理所須要的其餘開銷等git

三、用where 語句代替having 語句。
緣由:having是先進行分組,而後再對分組後的結果進行篩選,而where是直接對條件進行篩選。web

四、用truncate 語句代替delete語句。
緣由:delete 刪除數據的時候,oracle會使用撤銷表空間來存放刪除操做的信息,若是用戶回滾,能夠回到刪除以前的狀態,
而truncate不會這樣作,數據不能回到刪除以前的狀態。

五、用 錶鏈接 代替 嵌套查詢 (表的屢次查詢)。
緣由:若是用嵌套的查詢,每次oracle內部會進行一系列的操做,這樣會致使查詢效率變低。spring

六、用exists代替in
緣由:in 操做符 用於檢查值是否在一個列表中,所以須要進行全表掃描,而exists只是檢查行是否存在,

七、用exists代替distinct
緣由:exists是用來檢查子查詢返回的行是否存在,而distinct是用來禁止重複行的顯示。
可是distinct在禁止重複行顯示以前須要排序檢索到的行

八、用<=代替< 號
緣由:
例如 查詢emp.empno<=9901 的時候,oracle是直接把數據定位到9901。
而 emp.empno<9901 的時候,oracle會把數據定位到9901,而後查找比9901小的值。

九、多張表查詢的時候,有歧義的列要給表起一個別名,這樣能夠消除歧義,加快查詢效率。sql

2、錶鏈接的優化
一、from後面表的順序
從查詢的角度來看,表與表之間的前後順序沒有區別,可是從查詢效率上來看,是有區別的。
緣由:
oracle的解析器是按照從右到左 的樹勳處理from後面的表,因此,from後面指定的表中,最後面的表先被處理,做爲驅動表
,並對該表排序,再掃描倒數第二張表,將第二張表的數據和第一張表的數據進行合併。
因此,要把數據量最小的表放到最後,做爲驅動表,這樣能夠提升執行的效率

3、合理使用索引
索引:是一個和表或視圖有關的磁盤結構,能夠加快從表或者視圖中檢索行的速度,是提升檢索效率的有效手段。數據庫

條件:
表數據在5000條以上
一個表中能夠創建多個索引,可是不能太多,太多的話會加大系統維護的開銷。
頻繁修改的列不能做爲索引列
常常出如今where子句或鏈接條件中的列做爲索引關鍵字。

一、索引列是上應該儘可能不使用‘非’操做符,如not,!<,not exists,no in 和not like. 由於使用非操做符會致使oracle對全表掃描。express

二、惟一索引上不要使用null 值,
惟一索引是說列的值不能重複,可是多個null 值能夠同時存在,由於oracle認爲多個null 值不相等。
因此向惟一索引列上加null 值的時候,當where 子句 使用 is null 等非 操做符 對惟一索引列進行比較,oracle將會中止使用列上的惟一索引,oracle將會進行全表掃描。apache

四:如何在程序中調用存儲過程?
使用jdbc 的方式:
CallableStatement c = conn.prepareCall(「{call insertPro(?,?,?)}」);編程


java 方面
-------servlet 方面 ------------
一、servlet 生命週期
加載,實例化,初始化,服務,銷燬 五個階段。
初始化是:javax.servlet.Servlet.init 方法表達
服務: javax.servlet.Servlet.server
銷燬: javax.servlet.Servlet.destroy

二、servlet 的轉發和重定向 區別和定義?
轉發:是服務器端的跳轉,在瀏覽器上是看不到地址的變化。比較高效
重定向:是徹底跳轉,在瀏覽器中是能夠看到地址的變化。
轉發:
request.getRequestDispatcher("1.html").forward(request,response);
重定向:
response.Redirect("1.html");

三、request.getAttribute() 和 request.getParameter() 方法的區別?
request.getAttribute() 是 jsp 頁面經過request.setAttribute() 方法設定的值
request.getParameter() 是 獲取http請求 傳遞過來的參數。

四、jsp 的內置對象:
request 客戶端發送請求,包括 來自get/post 的請求參數,HttpServletRequest 對象
response 網頁傳遞給客戶端的迴應,響應 ,HttpServletResponse 對象
application 正在執行的內容,只要瀏覽器不關閉,均可以獲取到
page :jsp 頁面自己:表示從該頁面產生的一個servlet 實例
exception :針對錯誤的網頁,未捕捉的例外

session :會話,與請求相關的回話期,session 表示一個請求的javax.servlet.http.HttpSession 對象

pageContext :頁面屬性的配置在這裏配置
out : 用來傳送後臺傳送的輸出。
config :servlet 的構建部分。表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。

五、頁面間對象傳遞的方法?
request,session,cookie,application

六、jsp 和 servlet 的區別?
jsp 主要側重於 數據的展現,視圖。jsp 編譯後是’類servlet‘
servlet :主要是側重於邏輯的處理。

七、java的基本數據類型都有哪些?
int :
short
double
char
byte
float
boolean

八、java 中垃圾回收?
垃圾回收是:java中 長時間不使用的對象,是無用的對象,這些對象將會被丟棄回收。


九、靜態內部類 和靜態類的區別?
靜態內部是是 聲明 爲static 的內部類,不須要當 外部類實例 化之後才能實例化。
靜態類 :是須要外部類實例化後才能被實例化。

多線程方面的問題

一、如何實現多線程?
實現多線程有兩種方式。一種是:繼承Thread 類,另外一種是:實現Runnable 接口。
這兩種方式其實均可以,區別不大,可是:由於java中 類的繼承是單繼承的,可是類能夠實現多個接口。這一就說明,只要
繼承了Thread 類,就不能夠再繼承其餘類了。

啓動一個線程,start()方法
run()方法裏面寫 方法的實現之類的內容。

二、sleep() 和wait() 方法有什麼區別?
sleep 是 Thread 的方法,是讓線程暫停 指定時間,把線程執行的機會給其餘線程,到指定時間之後會繼續執行,調用sleep()不會釋放對象鎖。
wait(): 是Object 類的方法,調用wait()方法會致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有調用了notify()或者 notifyAll(),對象纔會進入對象鎖定池從新獲取對象鎖,進入運行狀態。


三、同步和異步 的區別?在什麼狀況下使用?
若是數據在線程間共享,好比:正在寫的數據 可能會被另外一個線程讀取,或者正在讀取的數據已經被另外一個線程寫過了,那麼這些數據是共享數據,必須同步存取。
異步:當應用程序調用一個須要比較長的時間才能返回值的方法,而且不想讓程序等待時間太長,就應該使用異步編程。

Ajax 方面
Json格式
[{"11","33"}]

數據結構方面
一、說出ArrayList ,Vector,LinkList 區別?
ArrayList 和Vector 都是用數組方式來儲存數據,數組元素數大於實際存儲的數據方便插入數據,都容許直接按序號索引元素,可是插入數據的時候
會涉及數組元素移動等內存操做,索引查詢快而插入,刪除數據比較慢。Vector是線程安全的,同步,實現了Synchronized方法,可是性能上沒有ArrayList 好。
LinkList 採用的雙向鏈表實現存儲,新增,刪除比較快,查詢慢。

二、Collection 與Collections 區別?
Collection 是集合類的上層接口。繼承Collection 接口的 主要有:List 和 Set
Collections 是一個 集合的幫助類。裏面有各類靜態的集合操做方法,例如:排序(Collections.sort()方法)



框架方面
Struts
在web.xml 須要配置
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

struts2 工做流程:
一、瀏覽器發送http 請求,
二、請求被web.xml 中的 filterDispatcher 攔截
三、根據struts.xml 找處處理請求的Action
四、Action 進行邏輯處理,處理完之後返回一個 結果集
五、根據Strut2.xml 中的result 找到相應的頁面
六、把處理結果返回到瀏覽器進行顯示。



事務 方面:

Spring 是如何實現事務控制的?
答: Spring 提供了對 事務 的支持。在spring 中有兩種方式實現:聲明式事務 和 編程式事務。

編程式事務:經過編寫代碼來達到對事務的控制。
步驟:
在spring 中須要 配置 數據源,事務管理器 DataSourceTransactionManager, 使用ref 引用 數據源 dataSource,有了事務管理對事務的控制仍是比較麻煩,Spring 提供了 事務管理器模板,transactionTemplate,配置事務管理器模板,引用事務管理器。
編碼:
spring 中的配置:
<!--配置 數據源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

<bean id="dao" class="co
<!--配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>

</bean>
<!--事務管理器模板 方便使用事務-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>

在 service 業務層實現類 中:
@Component
public class AccountServiceImpl implements AccountServiceIter {
@Autowired
private AccountDaoInter adi;
@Autowired
private TransactionTemplate tt;
//轉帳方法,由out向in轉money元
@Override
public void transfer(final String out, final String in, final double money) {
// TODO Auto-generated method stub

//使用事務管理器模板進行事務控制
tt.execute(new TransactionCallbackWithoutResult() {

@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// TODO Auto-generated method stub
adi.outMoney(out, money);
//一個異常,使用了事務控制,在出現了異常以後,事務會回滾
int i = 1 / 0;
adi.inMoney(in, money);
}
});

}

}
-------------------------------------------------------------------------
聲明是事務
一、使用 @Transactional 註解
使用 @Transactional 註解 須要在 配置文件中 開啓對這個註解的掃描。 <tx:annotation-driven transaction-manager = "transactionManager"/>,引用事務管理,這樣就可使用
@Transactional 註解了。 @Transactional 能夠用在類上表示對全部的方法都起做用;能夠用在方法上表示只對指定方法起做用。

二、使用 Aop 聲明事務控制
步驟:
一、配置事務管理器
<bean id = "transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref = "dataSource"></property>
</bean>
二、配置事務加強 <tx:advice>,須要配置 事務加強的傳播機制 7種傳播機制
<tx id = "adviser" transaction-manager = "transactionManager">
<tx:attributes>
<tx:method name ="add*" propagation="REQUIRED"/>
</tx:attributes>
</tx>
三、配置切點、事務通知
<aop:config>
<aop:pointcut id = "myPointcut" expression = "execution(* com.service.SerImpl.*.*(..))"/>
<aop:advisor id = "adviser" pointcut-ref = "myPointcut"/>
</aop:config>
Spring 優先級?

Spring 傳播機制: 7個
support :支持當前事務
never : 以非事務方式執行,若是當前存在事務,則拋出異常。
Not_Supported: 以非事務方式執行,若是當前存在事務,則把當前事務掛起
Required: 若是當前沒有事務,則建立一個事務;若是當前有事務,則加入到這個事務中
Required_New :新建事務,若是當前有事務,就把當啊親事務掛起
manadator: 使用當前事務,若是當前沒有事務,則拋出異常。
NESTED :若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行 與 PROPAGATION_REQUIRED 相似的操做。

 1)、<tx:method name="*" propagation="REQUIRED" /> 若是當前沒有事務,就新建一個事務;若是已存在一個事務,就加入到這個事務中。

    2)、<tx:method name="*" propagation="SUPPORTS" /> 支持當前事務,若是當前沒有事務,以非事務方式執行。

    3)、<tx:method name="*" propagation="MANDATORY" />使用當前事務,若是當前沒有事務,則拋出異常。

    4)、<tx:method name="*" propagation="REQUIRES_NEW" />新建事務,若是當前存在事務,則把當前事務掛起。

    5)、<tx:method name="*" propagation="NOT_SUPPORTED" />以非事務方式執行,若是當前存在事務,則把當前事務掛起。

    6)、<tx:method name="*" propagation="NEVER" />以非事務方式執行,若是當前存在事務,則拋出異常。

     7)、<tx:method name="*" propagation="NESTED" />若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行         與 PROPAGATION_REQUIRED 相似的操做。


一、事務的4個特性?
原子性 :一個事務在執行的過程當中,要麼所有執行,要麼所有不執行。
一致性 :數據不會由於事務的執行而遭到破壞。
隔離性 :一個事務的執行不會影響其餘事務的執行。
持久性 :一個事務一旦提交,對數據庫的影響是永久的。

二、事務的實現:
聲明式事務 和 編程式聲明。

基於Aop 技術實現的事務,本質就是在方法執行以前或者執行以後對方法進行攔截,而後 目標方法執行以前建立並加入事務,根據執行結果來肯定回滾或者提交。
聲明式事務有另種方式:
基於xml 配置
@transactional 註解,把事務 規則應用到業務邏輯中。

三、事務的隔離機制
Read committed 讀提交
Read Uncommitted 讀未提交。最低級別。
RepeaTable read :可重複讀。 可避免髒讀,不可重複讀的發生。
Serializable 串行化 。可避免:髒讀,不可重複讀,幻讀的發生。

髒讀: 是一個事務在修改某個數據但未提交,這時,另外一個事務也來訪問該數據,
這時就會形成兩個事務獲得的數據不一致,
好比,A 向 B 轉 100元,這時 B 發現錢確實到帳了,但只要 A 不提交該事務,全部的事務都將回滾, B 會發現 錢沒能到帳

不可重複讀是: 指事務1在讀取某一數據,而事務2立馬修改了這個數據並提交給事務給數據庫,
當事務1再次讀取該數據就會獲得不一樣的結果,

幻讀: 事務非獨立執行時發生的一種現象。
好比:事務1對一個表中的全部行的某個數據項進行修改操做如從 1 修改爲2,這時事務2又對這個表中插入了一行數據,而且在這個數據項的數據爲 1 時就提交給數據庫。若是事務1的操做用戶查看剛剛修改的數據,會發現還有一行沒有修改,其實這一行是事務2添加的,這就是 幻讀

四、Spring 工做原理
Spring 最核心的就是 ioc(控制反轉) Aop(面向切面編程)。 IOC 控制反轉 使一個 對象不用new ,能夠自動生產,在程序運行的時候動態的建立,調用對象。把建立對象的權利交給Spring 容器來進行建立。
Aop 是面向切面編程,能夠爲某一類對象的方法在執行先後去調用指定模塊。
五、爲何要用spring?

六、介紹一下spring 的事務管理?
聲明式事務 和 編程式事務

七、在spring 中如何定義 hibernate mapping?

八、依賴注入(DI) 和控制反轉(Ioc)?
依賴注入是控制反轉IOC 的一個方面,就是說只須要描述對象是如何建立的,不須要在代碼裏面實現。  控制反轉是咱們不須要本身建立對象,而是把建立對象交給spring 容器,只須要告訴它如何建立,須要對象的時候直接從容器中獲取就能夠了。

控制反轉是原則,依賴注入是實現的具體方式。
Spring的注入方式有哪些?
一、setter 注入
二、構造器注入
三、註解注入
@Component
@Service
@Controller
@Autowired ;默認是根據byName 去查找,而後是根據byType ,若是有多個 ,用@Qualifier("UserDao")
九、Spring 中 BeanFactory 和 ApplicationContext 做用?
BeanFactory:做用:用來 實例化,初始化,管理bean 的 ;建立bean 實例

十、Spring 中核心類有哪些?
BeanFactory :產生新實例,能夠實現單例模式Singeleton
ApplicationContext: 提供框架的實現,包含BeanFactory 中全部方法,

十一、什麼是Aop?做用是什麼?
Aop:面向切面編程。
最大的好處就是能夠 提升代碼複用率。 好比:在實際的開發中須要記錄日誌,好多地方都用到了記錄日誌這個方法,能夠把記錄日誌的這些代碼抽取出來,放到代理的方法中,這樣就能夠當須要記錄日誌的時候調用代理類的記錄日誌方法實現。
Aop 能夠完善 OOP 面向對象思想,之前是:定義一個抽象類 中記錄 日誌的方法,在須要記錄日誌的類中 繼承這個抽象類來實現,可是這種方式會有重複代碼。

十二、使用Spring 有什麼好處?什麼是Spring?
Spring是輕量級的,Spring是一個容器框架,管理對象的生命週期和配置。包括  控制反轉IOC和依賴注入DI;

  一、控制反轉;

  二、面向切面編程AOP
1三、介紹一下Spring 中Bean 的生命週期?
1四、spring 注入?
1五、Aop 名詞:
切面Aspect
鏈接點:joinpoint
通知:Advice
切入點:pointcut
引入:introduction
目標對象 :target Object
Aop代理: Aop Prox
織入 weaving
通知類型:
前置通知:before advice
返回後通知 After return advice
拋出異常後通知:After throwing advice
後通知: After advice
環繞通知: around Advice

版本控制工具 git 和 svn 區別? 、 svn :是’集中式‘ 版本控制工具; git :是’分佈式' 版本控制工具。 所謂 分佈式 和 集中式 也就是 他們保存的地方不同。 svn 是 集中保存 在 遠程服務器上,若是服務器完蛋了,那麼就不能再進行回退和看歷史版本了。每次須要先進行更新,而後再把有變更的代碼進行提交。 git 是 保存在本地 或者 遠程服務器 ,這樣是比較安全的。其次是 通常 git 的速度要比 svn 快。

相關文章
相關標籤/搜索