Java 200道題


1. junit用法,before,beforeClass,after, afterClass的執行順序

一個測試類單元測試的執行順序為:

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

每一個測試方法的調用順序為:

@Before –> @Test –> @After

參考: http://blog.csdn.net/wangpeng047/article/details/9631193


2. 分布式鎖

一、zookeeper 瞬時有序節點:每個客戶端對某個功能加鎖時,在zookeeper上的與該功能對應的指定節點的目錄下,生成一個唯一的瞬時有序節點

二、memcached add函數:add會添加第一個到達的值,並返回true,后續的添加則都會返回false。(無法持久化)

三、redis分布式鎖

redis分布式鎖即可以結合zk分布式鎖鎖高度安全memcached並發場景下效率很好的優點,可以利用jedis客戶端實現。

參考http://blog.csdn.net/java2000_wl/article/details/8740911

http://surlymo.iteye.com/blog/2082684


3. nginx的請求轉發算法,如何配置根據權重轉發

當在一台主機上部署了多個不同的web服務器,並且需要能在80端口同時訪問這些web服務器時,可以使用 nginx 的反向代理功能: 用 nginx 在80端口監聽所有請求,並依據轉發規則(比較常見的是以 URI 來轉發)轉發到對應的web服務器上。

例如有 webmail , webcom 以及 webdefault 三個服務器分別運行在 portmail , portcom , portdefault 端口,要實現從80端口同時訪問這三個web服務器,則可以在80端口運行 nginx, 然后將 /mail 下的請求轉發到 webmail 服務器, 將 /com下的請求轉發到 webcom 服務器, 將其他所有請求轉發到 webdefault 服務器。

http://blog.csdn.net/tobacco5648/article/details/51099426


4. 用hashmap實現redis有什么問題

(死鎖,死循環,可用ConcurrentHashmap)


5. 線程的狀態

五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態。


5. 線程的阻塞的方式

sleep() wait() join()


6. sleep和wait的區別

對於sleep()方法,是屬於Thread類中的。而wait()方法,則是屬於Object類中的。

sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,線程不會釋放對象鎖。

而當調用wait()方法的時候,線程會放棄對象鎖,對象調用notify()方法后本線程才獲取對象鎖進入運行狀態。


7. hashmap的底層實現

HashMap是基於哈希表的Map接口的非同步實現(Hashtable跟HashMap很像,唯一的區別是Hashtalbe中的方法是線程安全的,也就是同步的)。

HashMap底層就是一個數組,數組中的每一項又是一個鏈表。當程序試圖將一個key-value對放入HashMap中時,程序首先根據該 key 的 hashCode() 返回值決定該 Entry 的存儲位置:如果兩個 Entry 的 key 的 hashCode() 返回值相同,那它們的存儲位置相同。如果這兩個 Entry 的 key 通過 equals 比較返回 true,新添加 Entry 的 value 將覆蓋集合中原有 Entry 的 value,但key不會覆蓋。如果這兩個 Entry 的 key 通過 equals 比較返回 false,新添加的 Entry 將與集合中原有 Entry 形成 Entry 鏈

http://www.cnblogs.com/ITtangtang/p/3948406.html


8. 一萬個人搶100個紅包,如何實現(不用隊列),如何保證2個人不能搶到同一個紅包?

可用jedisLock—redis分布式鎖實現:基本原理用一個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。

SETNX key value/expire KEY seconds/del KEY

http://blog.csdn.net/u010359884/article/details/50310387

http://www.cnblogs.com/0201zcr/p/5942748.html


9. java內存模型,

垃圾回收機制,不可達算法


10. 兩個Integer的引用對象傳給一個swap方法在方法內部交換引用,返回后,兩個引用的值是否會發現變化

不會!Java里方法的參數傳遞方式只有一種:值傳遞。

Integer a =1;Integer b=2; swap(Integer a1,Integer b1){c=b1;b1=a1;a1=c}


11. aop的底層實現,動態代理是如何動態,假如有100個對象,如何動態的為這100個對象代理

AOP的核心機制通過動態代理來實現(jdk動態代理和cglib動態代理)


12. 是否用過maven install。 maven test。Git(make install是安裝本地jar包)

maven install 生成jar包

maven test 運行 src/test/java下的測試用例

mvn install -Dmaven.test.skip=true跳過測試

http://www.cnblogs.com/phoebus0501/archive/2011/05/10/2042511.html


13. tomcat的各種配置,如何配置docBase

appBase這個目錄下面的子目錄將自動被部署為應用

docBase只是指向了你某個應用的目錄

http://blog.csdn.net/liuxuejin/article/details/9104055


14. spring的bean配置的幾種方式

基於XML的配置、基於注解的配置和基於Java類的配置。

http://www.cnblogs.com/zhangwenjing/p/3546006.html


15. web.xml的配置

最終加載順序:ServletContext -> listener -> filter -> servlet

http://www.cnblogs.com/xxoome/p/5954633.html


16. spring的監聽器。

http://blog.csdn.net/xrt95050/article/details/6132179


17. zookeeper的實現機制,有緩存,如何存儲注冊服務的

ZooKeeper是Hadoop Ecosystem中非常重要的組件,它的主要功能是為分布式系統提供一致性協調(Coordination)服務

http://blog.csdn.net/xinguan1267/article/details/38422149


18. IO會阻塞嗎?readLine是不是阻塞的

readLine()是一個阻塞函數,當沒有數據讀取時,就一直會阻塞在那,而不是返回null

readLine()只有在數據流發生異常或者另一端被close()掉時,才會返回null值。

http://blog.csdn.net/swingline/article/details/5357581


19. 用過spring的線程池還是java的線程池?

SpringFrameWork 的 ThreadPoolTaskExecutor 是輔助 JDK 的 ThreadPoolExecutor 的工具類,它將屬性通過 JavaBeans 的命名規則提供出來,方便進行配置。

http://www.cnblogs.com/chkk/p/5386356.html


20. 字符串的格式化方法 (20,21這兩個問題問的太低級了)

String類的format()方法

21. 時間的格式化方法

SimpleDateFormat的format()方法
22. 定時器用什么做的

http://lengchaotian.iteye.com/blog/1887439


23. 線程如何退出結束

1. 使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。 while (!exit);
2. 使用stop方法強行終止線程。
3. 使用interrupt方法中斷線程。


24. java有哪些鎖?

樂觀鎖 悲觀鎖 synchronized 可重入鎖 讀寫鎖,

用過reentrantlock嗎?reentrantlock與synmchronized的區別

1. 等待可中斷 tryLock(long timeout, TimeUnit unit)。

2.公平鎖與非公平鎖(synchronized的是非公平鎖

3.綁定多個Condition

http://www.cnblogs.com/fanguangdexiaoyuer/p/5313653.html


25. ThreadLocal的使用場景

ThreadLocal就是用於線程間的數據隔離的。最適合的是按線程多實例(每個線程對應一個實例)的對象的訪問


26. java的內存模型,垃圾回收機制


27. 為什么線程執行要調用start而不是直接run

(直接run,跟普通方法沒什么區別,先調start,run才會作為一個線程方法運行)


28. qmq消息的實現機制(qmq是去哪兒網自己封裝的消息隊列)
29. 遍歷hashmap的三種方式

方式1:通過遍歷keySet()遍歷HashMap的value
用時:61
方式2:通過遍歷values()遍歷HashMap的value
用時:7
方式3:通過entrySet().iterator()遍歷HashMap的key和映射的value
用時:12

http://blog.csdn.net/fly_zxy/article/details/43015193

 

30. jvm的一些命令

jps jstat jmap jhat jstack jinfo

 

31. memcache和redis的區別

1  Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2  Redis支持數據的備份,即master-slave模式的數據備份。
3  Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用

http://blog.csdn.net/tonysz126/article/details/8280696/

32. MySQL的行級鎖加在哪個位置

表級,直接鎖定整張表,在你鎖定期間,其它進程無法對該表進行寫操作。如果你是寫鎖,則其它進程則讀也不允許
行級,,僅對指定的記錄進行加鎖,這樣其它進程還是可以對同一個表中的其它記錄進行操作。
頁級,表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。

http://www.jb51.net/article/50047.htm


33. ConcurrentHashmap的鎖是如何加的?是不是分段越多越好

http://www.cnblogs.com/my376908915/p/6759667.html


34. myisam和innodb的區別

(innodb是行級鎖,myisam是表級鎖)


35. mysql其他的性能優化方式

http://www.cnblogs.com/eric-gao/articles/5549801.html

 

36. linux系統日志在哪里看

/var/log/*     ,用Ls / cat查看

http://mushme.iteye.com/blog/1001478

 

37. 如何查看網絡進程

38. 統計一個整數的二進制表示中bit為1的個數

while (n >0) { if((n &1) ==1) // 當前位是1 ++c ; // 計數器加1 n >>=1 ; // 移位  }

http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html

 

39. jvm內存模型,java內存模型

http://www.cnblogs.com/my376908915/p/6753498.html

 

40. 如何把java內存的數據全部dump出來

jmap來獲取內存鏡像;MAT/ visualvm來進行內存鏡像分析

http://f.dataguru.cn/thread-714170-1-1.html

41. 如何手動觸發全量回收垃圾,如何立即觸發垃圾回收

手動調用gc函數

 

42. hashmap如果只有一個寫其他全讀會出什么問題

如果value為空(表示這個key還沒有插入),那么很可能同時幾個線程get的value都是null

 

43. git rebase git merge 區別

在當前的分支下rebase一下master分支,這樣我這個分支的幾個commits相對於master還是處於最頂端的,也就是說rebase主要用來跟上游同步,同時把自己的修改頂到最上面。

用rebase有時候會需要多次fix沖突;用merge確實只需要解決一遍沖突,比較簡單粗暴

 

44. mongodb和hbase的區別

Redis定位在"快",HBase定位於"大",mongodb定位在"靈活"。

mongodb可以當作簡單場景下的但是性能高數倍的MySQL,定位是取代關系型數據庫,想當一個主流數據庫。因為他有非結構化、方便擴充字段、寫性能優於mysql。萬事萬物有利有弊,mongodb的內存型緩存內容,讓其速度飛快,帶來內存率多,掉電數據問題等

Redis基本只會用來做緩存,是一個小而美的數據庫,主要用在key-value 的內存緩存,讀寫性能極佳,list,set,hash等幾種簡單結構使得使用也很簡單。緩存與簡單是其定位,分布式redis架構的出現,讓redis更加廣泛的使用,穩坐緩存第一把交椅。

HBase用來做離線計算,定位非結構化大數據,可伸縮性好,並不是完全高可用,底層依靠hadoop提供的HDFS,使用時有一整套zookeeper,pig,hive的生態系統。

 

45. 如何解決並發問題

代碼中的處理就是線程池,多線程,生產者消費者的應用了。

一、 web外網加速相關技術
1. 鏡像站點:譬如一個美國網站的中國鏡像可以使來自中國的用戶直接從這個中國的鏡像訪問,從而加快了速度。這可以看作是一種全球范圍的緩存。
2. DNS負載均衡:在DNS服務器中為同一個主機名配置多個IP地址,DNS服務器對每個查詢將以DNS文件中主機記錄的IP地址按順序返回不同的解析結果,將客戶端的訪問引導到不同的機器上去,從而達到負載均衡的目的
3. CDN內容分發:盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節
二、 內網加速技術

0. HTML靜態化 :HTTP請求---Web服務器---Servlet--HTML--響應請求
1. 負載均衡(軟件負載均衡:LVS、Nginx,第七層(應用層)的應用。硬件負載均衡:F5,第四層(傳輸層)上的應用)
2. Web緩存服務器(數據庫緩存:memcached/redis來做緩存集群)
3. Web/應用服務器分布式文件系統(圖片服務器分離 )
4. 分布式數據庫。數據庫主從分布: M-M-Slaves方式,2個主Mysql(寫),多個Slaves(讀-負載均衡,結合LVS)。數據庫分割:從業務層面上進行分區,比如id,切分到不同的數據庫集群去。)

http://www.ablanxue.com/prone_1020_1.html


46. volatile的用途

一個最常見的volatile的應用場景是boolean的共享狀態標志位,或者單例模式的雙重檢查鎖

http://www.cnblogs.com/my376908915/p/6757533.html


47. java線程池

http://www.cnblogs.com/my376908915/p/6761364.html


48. mysql的binlog

binlog日志用於記錄所有更新了數據或者已經潛在更新了數據(例如,沒有匹配任何行的一個DELETE)的所有語句。語句以“事件”的形式保存,它描述數據更改。

作用:因為有了數據更新的binlog,所以可以用於實時備份,與master/slave復制。

http://blog.csdn.net/wyzxg/article/details/7412777


49. 代理模式
50. mysql是如何實現事務的

MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關

1.MyISAM:不支持事務,用於只讀程序提高性能

2.InnoDB:支持ACID事務、行級鎖、並發

3.Berkeley DB:支持事務

在MySQL中,事務開始使用COMMIT或ROLLBACK語句開始工作和結束。

http://www.cnblogs.com/ymy124/p/3718439.html

 

51. 讀寫分離何時強制要讀主庫,讀哪個從庫是通過什么方式決定的,從庫的同步mysql用的什么方式

開啟了讀寫分離,在寫數據的時候寫入了主庫,寫完都需要刷新redis緩存,強制要讀主庫。在寫操作的同步延遲窗口之內讀,則讀取主庫,其他情況下讀從庫。

讀寫一致:http://www.it610.com/article/4872058.htm

 

主從架構本來就是一種高可用性解決方案,主從架構下的強一致性(銀行業)只需要在主機寫入時,確認更新已經同步到備機之后,再返回寫操作成功即可。主流數據庫均支持這種完全的同步模式。(MySQL的Semi-sync功能)

目前互聯網企業對於“高並發的寫操作”問題比較典型的解決方案是分表分庫+寫緩存,增加針對寫操作的緩存層,把寫操作放到隊列里,排隊到數據庫結點上異步執行。(在數據庫層之上架構一個redis這樣的分布式緩存

 


52. mysql的存儲引擎

MySQL5.5以后默認使用InnoDB存儲引擎,其中InnoDB和BDB提供事務安全表,其它存儲引擎都是非事務安全表。若要修改默認引擎,可以修改配置文件中的default-storage-engine。

http://www.cnblogs.com/gbyukg/archive/2011/11/09/2242271.html


53. mysql的默認隔離級別,其他隔離級別

Read Uncommitted(讀取未提交內容),臟讀

Read Committed(讀取提交內容):大多數數據庫系統的默認隔離級別,不可重復讀

Repeatable Read(可重讀):MySQL的默認事務隔離級別,幻讀

Serializable(可串行化):最高的隔離級別

http://www.jb51.net/article/96179.htm


54. 將一個鏈表反轉(用三個指針,但是每次只發轉一個)

思路:從原鏈表的頭部一個一個取節點並插入到新鏈表的頭部

思路:每次都將原第一個結點之后的那個結點放在新的表頭后面。

http://blog.csdn.net/hyqsong/article/details/49429859


55. spring Aop的實現原理,具體說說

IOC(反轉控制):對成員變量的賦值的控制權從代碼中反轉到配置文件中。
AOP:Aspect(切面) Oriented(面向) Programming(編程),面向切面編程。

動態代理和發射技術,已經基本實現了AOP的功能: http://www.jb51.net/article/81788.htm


56. 何時會內存泄漏,內存泄漏會拋哪些異常

首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連;
其次,這些對象是無用的,即不被程序使用,然而它卻占用內存。

一個生存周期遠大於另一個生存周期,而且生存周期大的對象有指向生存周期小的對象的引用,

而且生存周期小的對象不再有指向其他對象的引用,那好,既然大的有指向小的引用,那垃圾回收器對小的也無可奈何。

memory leak:最終會導致out of memory!


57. 是否用過Autowire注解

Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。

Spring 通過一個 BeanPostProcessor 對 @Autowired 進行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

Spring 將直接采用 Java 反射機制對 Boss 中的 car 和 office 這兩個私有成員變量進行自動注入。


58. spring的注入bean的方式

Spring中依賴注入有三種注入方式:

一、構造器注入;

二、設值注入(setter方式注入);

三、Feild方式注入(注解方式注入)。

http://glzaction.iteye.com/blog/1299441


59. sql語句各種條件的執行順序,如select, where, order by, group by

from--where--group by--having--select--order by---limit

http://www.cnblogs.com/huminxxl/p/3149097.html


60. select  xx from xx where xx and xx order by xx limit xx; 如何優化這個(看explain)

加limit,和不加走的索引不一樣。 select  xx from (select  xx from xx where xx and xx order by xx ) yy limit xx;

在order by  limit 一起時 執行順序不是按照:where ------order by ------ limit

而是:order by ----- limit -------where的順序去執行,這樣就會有一個問題,按照我們管用的思路,上面的查詢肯定是會丟失數據的。

http://blog.csdn.net/wulantian/article/details/42679167

 

MySQL 對於千萬級的大表要怎么優化?

第一優化你的sql和索引;MySQL性能優化的最佳20+條經驗:http://coolshell.cn/articles/1846.html

第二加緩存,memcached,redis;

第三以上都做了后,還是慢,就做主從復制或主主復制,讀寫分離

第四如果以上都做了還是慢,不要想着去做切分,mysql自帶分區表:http://www.cnblogs.com/zemliu/archive/2013/07/21/3203511.html

第五如果以上都做了,那就先做垂直拆分,其實就是根據你模塊的耦合度,將一個大的系統分為多個小的系統,也就是分布式系統;列與列之間關聯性不大的時候,垂直切分。

第六才是水平切分,針對數據量大的表,行很多的時候水平切分表,表名取模:http://www.cnblogs.com/sns007/p/5790838.html

 

61. 四則運算寫代碼

http://www.jb51.net/article/71487.htm

 

62. 統計100G的ip文件中出現ip次數最多的100個ip

1,分割IP:讀原始文件,去掉IP中的點轉化為一個long型變量,取模為0,1,2...99的 IP都分到一個(寫)文件了。(內存不夠分而治之http://blog.csdn.net/yan5105105/article/details/50783262)

2,哈希表map<(ip, count>,將每個IP作為關鍵字映射為出現次數,這個哈希表建好之后也得先寫入硬盤

3,建小頂堆,每次有數據輸入的時候可以先與根節點比較。若小於或等於根節點,則舍棄;否則用新數值替換根節點數值。並進行最小堆的調整。http://blog.csdn.net/ephuizi/article/details/11790957

基於堆實現的優先級隊列:PriorityQueue 解決 Top K 問題:https://my.oschina.net/leejun2005/blog/135085


63. zookeeper的事務,結點,服務提供方掛了如何告知消費方
64. 5台服務器如何選出leader

分布式-選舉算法(bully算法):

當任何一個進程發現協調者不響應請求時,他發起一次選舉,選舉過程如下:

a, P進程向所有編號比他大的進程發送一個election消息;

b, 如果無人響應,則P獲勝,成為協調者

c,如果編號比他大的進程響應,則由響應者接管選舉工作,P的工作完成。

http://blog.csdn.net/huangwei19892008/article/details/9004970

 

65. 適配器和代理模式的區別

代理模式(Proxy):為其他對象提供一種代理以控制對這個對象的訪問。用同一接口的子類的方法去 實現接口的方法

適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口,使得原本接口不兼容而不能一起工作的那些類可以一起工作。用不同接口的子類的方法去 實現接口的方法


66. 讀寫鎖

對於讀多寫少的場景,一個讀操作無須阻塞其它讀操作,只需要保證讀和寫  或者 寫與寫  不同時發生即可。

讀寫鎖的鎖定規則如下:
獲得讀鎖后,其它線程可獲得讀鎖而不能獲取寫鎖
獲得寫鎖后,其它線程既不能獲得讀鎖也不能獲得寫鎖

http://www.cnblogs.com/my376908915/p/6758681.html


67. static加鎖

synchronized是對類的當前實例進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,注意這里是“ 類的當前實例 ”,類的兩個不同實例就沒有這種約束了。

那么static synchronized恰好就是要控制類的所有實例的訪問了,static synchronized是限制線程同時訪問jvm中該類的所有實例同時訪問對應的代碼塊。

http://blog.csdn.net/zbuger/article/details/50827762


68. 事務隔離級別

MySQL數據庫為我們提供的四種隔離級別:

  ① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。

  ② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。

  ③ Read committed (讀已提交):可避免臟讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

http://www.cnblogs.com/fjdingsd/p/5273008.html


69. 門面模式,類圖(外觀模式)

為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

http://www.cnblogs.com/wangjq/archive/2012/07/10/2583672.html


70. mybatis如何映射表結構

    1. SqlMapConfig.xml中
      <typeAliases>
      <typeAlias alias="game" type="實體類路徑"/>
      </typeAliases>
      這就是把你的實體類寫了個別名

    2. 最后:在寫查詢添加的時候:
      <select id="gameDao" resultType="game">返回實體類對象
      select * from tb_game
      </select>
      這樣查出的結果就對應上數據了。

71. 二叉樹遍歷

前序、中序以及后序三種遍歷方法。

遞歸實現:

void preOrder1(BinTree *root) //遞歸前序遍歷,按照“根結點-左孩子-右孩子”的順序進行訪問。
{
if(root!=NULL)
{
cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder1(root->rchild);
}
}

非遞歸實現:
1)訪問結點P,並將結點P入棧;
2)判斷結點P的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點P,循環至1);若不為空,則將P的左孩子置為當前的結點P;
3)直到P為NULL並且棧為空,則遍歷結束。
void preOrder2(BinTree *root) //非遞歸前序遍歷
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}

72. 主從復制

整體上來說,復制有3個步驟:   

       (1)    master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
       (2)    slave將master的binary log events拷貝到它的中繼日志(relay log);

       (3)    slave重做中繼日志中的事件,將改變反映它自己的數據。

在每個事務更新數據完成之前,master在二日志記錄這些改變。MySQL將事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成后,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日志。
SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位於OS的緩存中,所以中繼日志的開銷很小。

http://blog.csdn.net/hguisu/article/details/7325124


73. mysql引擎區別

MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。

MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。

一般來說,MyISAM適合:
(1)做很多count 的計算;
(2)插入不頻繁,查詢非常頻繁;
(3)沒有事務。

InnoDB適合:
(1)可靠性要求比較高,或者要求事務;
(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定數據引擎的創建

http://www.jb51.net/article/38004.htm


74. 靜態內部類加載到了哪個區?

方法區

靜態內部類,又叫類級內部類。

延遲加載單例模式:類裝載的時候不去初始化對象,延遲初始化到getInstance方法時初始化。

http://www.javaweb1024.com/java/Javajichu/2015/03/25/454.html

 

75. class文件編譯后加載到了哪

方法區

java編譯期會加載.class文件:加載的類是你需要編譯類所依賴的類,如你使用了System這個類,因為在jdk里的lib已經存在了,所以你不用顯示的如加載,已經在classpath下面了。

如果你自己寫的一個Class1,把它編譯后,再寫了個Class2。再編譯Class2的時候就需要把Class1的編譯文件加載到classpath中。

 

76. web的http請求如果整體響應時間變長導致處理的請求數變少,該如何處理?

瓶頸在哪里?

用隊列,當處理不了那么多http請求時將請求放到隊列中慢慢處理

 

77. 線程安全的單例模式

靜態內部類實現單例模式:

  1. public class MySingleton {  
  2.     //內部類  
  3.     private static class MySingletonHandler{  
  4.         private static MySingleton instance = new MySingleton();  //靜態內部類在類加載是被實例化
  5.     }   
  6.       
  7.     private MySingleton(){}  
  8.     public static MySingleton getInstance() {   
  9.         return MySingletonHandler.instance;  
  10.     }  

枚舉數據類型實現單例模式:EnumFactory.singletonFactory.getInstance()

  1. public enum EnumFactory{    
  2.     singletonFactory;  
  3.     private MySingleton instance;  
  4.     private EnumFactory(){//枚舉類的構造方法在類加載是被實例化  (在使用枚舉時,構造方法會被自動調用)
  5.         instance = new MySingleton();  
  6.     }  
  7.        
  8.     public MySingleton getInstance(){  
  9.         return instance;  
  10.     }  

http://blog.csdn.net/cselmu9/article/details/51366946

78. 快速排序性能考慮

該方法的基本思想(分治法)是:

1.先從數列中取出一個數作為基准數。

2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重復第二步,直到各區間只有一個數。

http://blog.csdn.net/morewindows/article/details/6684558

http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html

 

79. volatile關鍵字用法

volatile的應用場景是boolean的共享狀態標志位,或者單例模式的雙重檢查鎖

http://www.cnblogs.com/my376908915/p/6757533.html

 

80. 求表的size,或做數據統計可用什么存儲引擎

MyISAM

一般來說,MyISAM適合:
(1)做很多count 的計算;
(2)插入不頻繁,查詢非常頻繁;
(3)沒有事務。

InnoDB適合:
(1)可靠性要求比較高,或者要求事務;
(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定數據引擎的創建

http://www.jb51.net/article/38004.htm

 

81. 讀多寫少可用什么引擎

MyISAM

 

82. 假如要統計多個表應該用什么引擎

MyISAM

 

83. concurrenhashmap求size是如何加鎖的,如果剛求完一段后這段發生了變化該如何處理

Put等操作都是在單個Segment中進行的,但是ConcurrentHashMap有一些操作是在多個Segment中進行,比如size操作,ConcurrentHashMap的size操作也采用了一種比較巧的方式,來盡量避免對所有的Segment都加鎖。   

前面我們提到了一個Segment中的有一個modCount變量,代表的是對Segment中元素的數量造成影響的操作的次數,這個值只增不減,

size操作就是遍歷了兩次Segment,每次記錄Segment的modCount值,然后將兩次的modCount進行比較,如果相同,則表示期間沒有發生過寫入操作,就將原先遍歷的結果返回,

如果不相同,則把這個過程再重復做一次,

如果再不相同,則就需要將所有的Segment都鎖住,然后一個一個遍歷了。

 

ConcurrentHashMap加鎖的時候根據散列值鎖住了散列值鎖對應的那段,因此提高了並發性能。

ConcurrentHashMap也增加了對常用復合操作的支持,比如"若沒有則添加":putIfAbsent(),替換:replace()。這2個操作都是原子操作。

http://www.cnblogs.com/my376908915/p/6759667.html

 

84. 1000個蘋果,請你將它放進10個箱子,如何放,使得顧客不管要多少個蘋果,你總可以從10箱子里拿出若干個箱子,其蘋果之和就是顧客要的蘋果數?

箱子中依次放1,2,4,8,16,32,64,128,256,489個蘋果

算法:其實就是數的二進制表示而已,你將所有的數轉換成2進制后,就會發現,所有的數都是由不同位上的1組成
二進制表:1,10,100,1000,10000,100000。。。。。。。

 

85. 可重入的讀寫鎖,可重入是如何實現的?

可重入鎖又叫做遞歸鎖。

reentrant 鎖意味着什么呢?簡單來說,它有一個與鎖相關的獲取計數器,如果擁有鎖的某個線程再次得到鎖,那么獲取計數器就加1,然后鎖需要被釋放兩次才能獲得真正釋放。

這相當於是模仿了synchronized中又可以嵌套一個synchronized這樣的場景

http://blog.csdn.net/johnking123/article/details/50043961

 

86. 是否用過NIO

BufferChannel是標准NIO中的核心對象(網絡NIO中還有個Selector核心對象),幾乎每一個IO操作中都會用到它們。

http://www.cnblogs.com/my376908915/p/6767922.html

 

87. java的concurrent包用過沒

java.util.concurrent包,

AtomicI原子化,基於原子操作的循環CAS算法。

Collections容器,ConcurrentLinkedQueue(非阻塞隊列---基於原子引用的循環CAS),ConcurrentHashMap

Locks鎖,基於非阻塞隊列的循環CAS + JNI的unsafe.park(false, 0L)阻塞線程

Executor線程池。

http://www.cnblogs.com/my376908915/p/6758278.html

 

88. sting s=new string("abc")分別在堆棧上新建了哪些對象

棧:sting s
堆:new string("abc")
字符串池(方法區):"abc"

JVM中存在着一個字符串池,使用引號 創建文本的方式的String對象都會放入字符串池。可以提高效率。
String a="abc"; String b="abc";//這兩句在字符串池 只創建一個實例對象。
String a="ab"+"cd";//這一句在字符串池 創建三個實例對象。
new方式新建String對象則不會放入字符串池,放入堆。
參考: http://blog.csdn.net/lubiaopan/article/details/4776000/

89. java虛擬機的區域分配,各區分別存什么

http://www.cnblogs.com/my376908915/p/6753498.html

 

90. 分布式事務(JTA)

普通的jdbc事務只能針對單個connection,要實現多個數據庫事務的操作,jta可以滿足要求。

jta應用程序要調用 javax.transaction.UserTransaction 接口中的方法。

“用 JTA 界定事務,那么就需要有一個實現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅動程序。
一個實現了這些接口的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。”
要使用JTA事務,必須使用XADataSource來產生數據庫連接,產生的連接為一個XA連接。
XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區別在於:XA可以參與JTA的事務,而且不支持自動提交。
Innodb存儲引擎支持XA事務,通過XA事務可以支持分布式事務的實現。
http://blog.csdn.net/mchdba/article/details/13076803

 

91. threadlocal使用時注意的問題

(ThreadLocal和Synchonized都用於解決多線程並發訪問。但是ThreadLocal與synchronized有本質的區別。

synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。

而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的並不是同一個對象,這樣就隔離了多個線程對數據的數據共享。

而Synchronized卻正好相反,它用於在多個線程間通信時能夠獲得數據共享)

http://www.cnblogs.com/my376908915/p/6763210.html

 

92. java有哪些容器

(各種集合,tomcat也是一種容器)

 

93. 二分查找算法

用二分查找在已排序的數組中查看該數組是否含有一個特定的值。速度是非常快速的。

迭代方式:

  1. public int BinarySearchIteration(int[] array, int key)  
  2. {  
  3.     int begin = 0;  
  4.     int end = array.Length - 1;  
  5.     while (begin <= end)  
  6.     {  
  7.         int mid = begin + (end - begin) / 2;  
  8.         if (array[mid] > key)  
  9.         {  
  10.             end = mid - 1;  
  11.         }  
  12.         else if (array[mid] < key)  
  13.         {  
  14.             begin = mid + 1;  
  15.         }  
  16.         else  
  17.         {  
  18.             return mid;  
  19.         }  
  20.     }  
  21.     return -1;  

http://blog.csdn.net/beiyeqingteng/article/details/5736004


94. myisam的優點,和innodb的區別

MyISAM

一般來說,MyISAM適合:
(1)做很多count 的計算;
(2)插入不頻繁,查詢非常頻繁;
(3)沒有事務。

InnoDB適合:
(1)可靠性要求比較高,或者要求事務;
(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定數據引擎的創建

http://www.jb51.net/article/38004.htm


95. redis能存哪些類型

redis常用五種數據類型:string,hash,list,set,zset(sorted set).

http://blog.csdn.net/qq_19943157/article/details/50495925


96. http協議格式,get和post的區別

http協議格式: http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

get和post的區別:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html


97. 可重入鎖中對應的wait和notify

條件鎖,http://www.cnblogs.com/my376908915/p/6758681.html

Conditon中的await()對應Object的wait();
Condition中的signal()對應Object的notify();
Condition中的signalAll()對應Object的notifyAll()。


98. redis能把內存空間交換進磁盤中嗎

Redis利用swap文件將數據從內存轉移到磁盤。

http://blog.csdn.net/nvnh7553/article/details/50107971

如果你打開虛擬內存功能,當內存用盡時, Redis就會把那些不經常使用的數據存儲到磁盤。
如果Redis里的虛擬內存被禁了,他就會用上操作系統的虛擬內存(交換內存),同時性能急劇下降。
你可以配置maxmemory參數,來避免Redis默認再分配更多的內存。

http://www.dewen.net.cn/q/242


99. java線程池中基於緩存和基於定長的兩種線程池,當請求太多時分別是如何處理的?

Java自帶的幾種線程池:

1、newCachedThreadPool 創建一個可緩存的線程池。

這種類型的線程池特點是:

a).工作線程的創建數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。

b).如果長時間沒有往線程池中提交任務,即如果工作線程空閑了指定的時間(默認為1分鍾),則該工作線程將自動終止。終止后,如果你又提交了新的任務,則線程池重新創建一個工作線程。

2、newFixedThreadPool 創建一個指定工作線程數量的線程池。

每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。

3、newSingleThreadExecutor 創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,如果這個線程異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。

單工作線程最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的 。

4、newScheduleThreadPool 創建一個定長的線程池,而且支持定時的以及周期性的任務執行,類似於Timer。


100. synchronized加在方法上用的什么鎖

方法對應的實例對象。

 

101. 可重入鎖中的lock和trylock的區別

ReentrantLock獲取鎖定與三種方式:
    a)  lock(), 如果獲取了鎖立即返回,如果別的線程持有鎖,當前線程則一直處於休眠狀態,直到獲取鎖

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

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

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

http://www.cnblogs.com/my376908915/p/6758681.html


102. innodb對一行數據的讀會加鎖嗎?

對於insert、update、delete,InnoDB會自動給涉及的數據加排他鎖(X);

對於一般的Select語句,InnoDB不會加任何鎖,事務可以通過以下語句給顯示加共享鎖或排他鎖。

共享鎖:select * from table_name where .....lock in share mode

排他鎖:select * from table_name where .....for update

http://www.2cto.com/database/201508/429967.html


103. redis做緩存是分布式存的?不同的服務器上存的數據是否重復?guava cache呢?是否重復?不同的機器存的數據不同

由於redis是單點,項目中需要使用,必須自己實現分布式。

分布式實現通過key做一致性哈希,實現key對應redis結點的分布。

http://www.open-open.com/lib/view/open1384603154712.html

Mysql是適合海量數據存儲的,然后通過Memcached將一些常用的數據進行緩存,加快訪問速度。

當數據量不斷的增大的時候,進行切表,拆表的,Memcached也需要不斷的跟着擴容MemcachedMysql的數據一致性的問題,Memcached數據命中率低或者Down機,大量的訪問就會穿透到數據庫,這時候Mysql可能會無法支撐。

          Redis使用最佳方式是全部數據in-memory。

          Redis更多場景是作為Memcached的替代者來使用。

         當需要除key/value之外的更多數據類型支持時,使用Redis更合適。

         當存儲的數據不能被剔除時,使用Redis更合適。

http://blog.csdn.net/bemavery/article/details/47061663


104. 用awk統計一個ip文件中top10

cat File.log | awk -F ',' '{print $8}' | sort | uniq -c | sort -k1nr | head -10

 

Linux awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。http://man.linuxde.net/awk

https://yq.aliyun.com/ziliao/73055


105. 對表做統計時可直接看schema info信息,即查看表的系統信息

MySQL中有一個名為 information_schema 的數據庫,在該庫中有一個 TABLES 表,這個表主要字段分別是:

TABLE_SCHEMA : 數據庫名

TABLE_NAME:表名

ENGINE:所使用的存儲引擎

TABLES_ROWS:記錄數

DATA_LENGTH:數據大小

INDEX_LENGTH:索引大小

 

use information_schema;
select table_name,table_rows from tables
where TABLE_SCHEMA = '數據庫名'
order by table_rows desc;
查詢出來的是每張表的行數

http://help.wopus.org/mysql-manage/607.html


106. mysql目前用的版本

據說5.0.x的版本比較穩定,兼容比較好,我現在安裝的5.1.63

Mysql查看版本號的五種方式介紹:http://www.jb51.net/article/36370.htm


107. 公司經驗豐富的人給了什么幫助?(一般boss面會問這些)

具體技術的點撥,思考問題的方式,解決問題的方式。


108. 自己相對於一樣的應屆生有什么優勢

經驗豐富


109. 自己的好的總結習慣,給自己今后的工作帶了什么幫助,舉例為證

技術總結分享,文檔歸檔。

 

110. 原子類,線程安全的對象,異常的處理方式

JUC出現之后,這些原子操作 基於JNI提供了新的實現,

比如AtomicInteger,AtomicLong,AtomicBoolean,AtomicReference,AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray;

這些操作中提供一些原子化操作,比如incrementAndGet(相當於i++),compareAndSet(安全賦值)等,直接讀源代碼也很容易懂。

www.cnblogs.com/my376908915/p/6758415.html

 

111. 4億個int數,如何找出重復的數

大數據處理算法一:Bitmap算法

核心思想即通過將一個數作為下標(index)來索引一個bit表示一個數是否存在,排序時的時間復雜度為O(N),需要的額外空間的復雜度O(N/8),支持整個int范圍(正負數都支持)的算法

http://www.open-open.com/lib/view/open1430902831226.html


112. 4億個url,找出其中重復的(考慮內存不夠,通過hash算法,將url分配到1000個文件中,不同的文件間肯定就不會重復了,再分別找出重復的)

hash算法:   H(url)出一個整數后,取1000的余數,分割到1000個文件中,余數即為文件名。

讀入每個小文件,進內存HashMap(url,Counts)。

遍歷EntrySets,即Counts 〉1的url

hash算法原理詳解 :http://blog.csdn.net/tanggao1314/article/details/51457585


有1萬個數組,每個數組有1000個整數,每個數組都是降序的,從中找出最大的10個數。

每個數組取出前10個,堆排序,或優先隊列。

 

113. LinkedHashmap的底層實現

LinkedHashMap實現與HashMap的不同之處在於,LinkedHashMap維護着一個運行於所有條目的雙向鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。

對於LinkedHashMap而言,它繼承與HashMap、底層使用哈希表與雙向鏈表來保存所有元素。其基本操作與父類HashMap相似,它通過重寫父類相關的方法,來實現自己的鏈接列表特性。

Entry除了保存當前對象的引用外,還保存了其上一個元素before和下一個元素after的引用,從而在哈希表的基礎上又構成了雙向鏈接列表。

http://zhangshixi.iteye.com/blog/673789


114. 類序列化時類的版本號的用途,如果沒有指定一個版本號,系統是怎么處理的?如果加了字段會怎么樣?

如果沒有顯式聲明序列號,那么在程序編譯時會自己生成這個版本序列號。

如果加了字段,更改了實體類的時候又會重新生成一個序列號。

運行程序,就會報錯:InvalidClassException

http://blog.sina.com.cn/s/blog_7f73e06d0100u52c.html


115. Override和Overload的區別,分別用在什么場景

方法重載(overload),參數不同。

方法覆蓋(override),方法內容不同。用在子類

http://blog.csdn.net/zhouhong1026/article/details/8232350


116. java的反射是如何實現的

反射機制其實就是指程序在運行的時候能夠獲取自身的信息。

如果知道一個類的名稱/或者它的一個實例對象, 就能把這個類的所有方法和變量的信息(方法名,變量名,方法,修飾符,類型,方法參數等等所有信息)找出來。

如果明確知道這個類里的某個方法名+參數個數 類型,還能通過傳遞參數來運行那個類里的那個方法,這就是反射。

盡管Java不是一種動態語言,但它卻有一個非常突出的動態機制:Reflection。它使我們可以於運行時加載、探知、使用編譯期間完全未知的 classes。

換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、 或對其fields設值、或喚起其methods。既一種“看透class”的能力。

http://www.tuicool.com/articles/zuIN7r

http://www.cnblogs.com/my376908915/p/6752707.html

http://blog.csdn.net/liujiahan629629/article/details/18013523

 

117.HashMap  HashTable的區別

http://www.importnew.com/7010.html

118.Map集合的四種遍歷方式

http://www.cnblogs.com/blest-future/p/4628871.html

119.HashMap如何實現

Hash算法-〉數組,

+ 處理沖突-〉鏈表法

120.多線程循環刪除List數組容器里面元素,會ConcurrentModificationException

把List數組轉換成Iterator進行迭代刪除,一點問題都沒有:listA.iterator().remove(); Iterator進行循環操作,然后刪除,是很安全的。

121.線程間共享數據的方式

http://www.cnblogs.com/my376908915/p/6756895.html

122.Spring MVC頁面渲染的幾種方式

http://blog.csdn.net/suifeng3051/article/details/51648360

123.Ioc和AOP的理解和源碼

AOP基於什么設計模式實現的?具體說下cglib代理和jdk代理的區別,他們是怎么實現動態代理的,核心類和核心方法是什么

http://www.cnblogs.com/my376908915/p/6782604.html

124.spring bean的幾種狀態

用的最多的還是singleton單態,prototype原型多態。

125.spring的緩存優化是怎么做的?如何清緩存,緩存哪里用到了,用他做什么?

http://blog.csdn.net/a494303877/article/details/53780597

http://blog.csdn.net/dlf123321/article/details/51382666

126.使用spring初始化需要加載的東西,

bean.dispatcherServlet,加載Html,spring的配置文件

127.如果redis緩存宕掉了怎么辦

https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&context=%7B%22sourceFrom%22%3A%22bjh%22%2C%22nid%22%3A%22news_3562062748706618586%22%7D

128.java中異常機制

Throwable是Error和Exception的父類,
Error一般是指JVM拋出的錯誤,不需要捕獲,Exception是程序錯誤,需要捕獲處理;

129.有10億條文本,找出前一萬條重復率高的

先Hash算法分割到1000個文件中去;HashMap(文本,counts);堆排序。

BitMap算法:使用hash計算並存儲次數,然后遍歷一次找出top10;



130.對一千萬條數據排序,你認為最好的方式是什么
分塊查找,堆排序。
BitMap算法。是否有重復。申請長度為一千萬位的位向量bit[10000000],所有位設置為0,順序讀取待排序文件,每讀入一個數i,便將bit[i]置為1。當所有數據讀入完成,便對bit做從頭到尾的遍歷,如果bit[i]=1,則輸出i到文件,當遍歷完成,重復的數據被輸出。
131.10w行數據,每行一個單詞,統計出現次數出現最多的前100個。
(1)可以使用小根堆;
(2)在linux中實現: cat words.txt | sort | uniq -c | sort -k1,1nr | head -10
uniq -c:  顯示唯一的行,並在每行 行首 加上本行在文件中出現的次數
sort -k1,1nr:  按照第一個字段,數值排序,且為逆序
132.一個文本文件,給你一個單詞,判斷單詞是否出現。
grep -wq "fail" 123.txt && echo "no"||echo "yes"
-w 精確匹配

http://www.2cto.com/os/201411/348541.html

 

其他:

互聯網公司校招Java面試題總結及答案——京東

互聯網公司校招Java面試題總結及答案——百度(目前只是部分總結)

互聯網公司校招Java面試題總結及答案——美團

互聯網公司校招Java面試題總結及答案——CVTE

互聯網公司校招Java面試題總結及答案——樂視、滴滴、華為

互聯網公司校招Java面試題總結及答案——招銀科技

互聯網公司校招Java面試題總結及答案——微店、去哪兒、蘑菇街


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM