1. 程式人生 > >面試題:總結 !=!=未看

面試題:總結 !=!=未看

row 使用遞歸 ocl object 作者 rand col cat 完全

一、如何比較兩個對象,比如學生類,根據屬性年齡比較大小

參考:http://zhidao.baidu.com/link?url=0eh3YqTJGUd0Kp9R_YM3q2sh2A39i55sh2_SNFokjnqshjr8rlLew94IE6ZXw6WHiPr3WwrbTT7JQu8jx4RCYa&qq-pf-to=pcqq.group

[python] view plain copy
  1. import java.util.*;
  2. public class Demo10 {
  3. public static void main(String[] args) {
  4. Person p1 = new Student(9,"m","gd","廣");
  5. Person p2 = new Student(3,"m","gd","廣");
  6. Person p3 = new Student(5,"m","gd","廣");
  7. List<Person> list = new ArrayList<Person>();
  8. list.add(p1);
  9. list.add(p2);
  10. list.add(p3);
  11. //排序
  12. Collections.sort(list);
  13. for(int i = 0; i < list.size(); i++){
  14. Person p = (Person)(list.get(i));
  15. System.out.println(p.getAge());
  16. }
  17. }
  18. }
  19. class Person implements Comparable{
  20. private int age;//齡
  21. private String sex;//性別
  22. private String placeOfOrigin;//籍貫
  23. public int getAge(){
  24. return this.age;
  25. }
  26. public void setAge(int age){
  27. this.age = age;
  28. }
  29. public String getSex(){
  30. return this.sex;
  31. }
  32. public void setSex(String sex){
  33. this.sex = sex;
  34. }
  35. public String getPlaceOfOrigin(){
  36. return this.placeOfOrigin;
  37. }
  38. public void setPlaceOfOrigin(String placeOfOrigin){
  39. this.placeOfOrigin = placeOfOrigin;
  40. }
  41. //實現Comparable接口
  42. public int compareTo(Object obj){
  43. Person p = (Person)obj;
  44. if(this.age > p.age){
  45. return 1;
  46. } else if(this.age == p.age){
  47. return 0;
  48. } else {
  49. return -1;
  50. }
  51. }
  52. }
  53. class Student extends Person{
  54. private String school;//讀校
  55. public Student(int age, String sex, String placeOfOrigin, String school){
  56. setAge(age);
  57. setSex(sex);
  58. setPlaceOfOrigin(placeOfOrigin);
  59. this.school = school;
  60. }
  61. public String getSchool(){
  62. return this.school;
  63. }
  64. public void setSchool(String school){
  65. this.school = school;
  66. }
  67. }
  68. class CollegeStudent extends Person{
  69. private String tutor;//導師
  70. private double subsidy;//補助
  71. public String getTutor(){
  72. return this.tutor;
  73. }
  74. public void setTutor(String tutor){
  75. this.tutor = tutor;
  76. }
  77. public double getSubsidy(){
  78. return this.subsidy;
  79. }
  80. public void setSubsidy(double subsidy){
  81. this.subsidy = subsidy;
  82. }
  83. }



二、給你一個set 如何根據學生類的name進行對象排序

三、給你一臺服務器,要你裝Tomcat,你得做什麽

在Linux上安裝:上傳安裝包 解壓之後,配置 tomcat7\conf\tomcat-users.xml,在文件的最下面,</tomcat-users>的上面添加

[python] view plain copy
  1. <role rolename="manager-gui"/>
  2. <role rolename="manager-script"/>
  3. <role rolename="manager"/>
  4. <role rolename="admin-gui"/>
  5. <user username="admin" password="admin" roles="manager-gui,manager,manager-script,admin-gui"/>



四、怎麽取map中的key

兩種方法 Map 的 map.keySet();和map.entrySet();方法

測試代碼:

[python] view plain copy
  1. package com.lyt.test;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;
  7. public class MapTest {
  8. public static void main(String[] args) {
  9. getKeySet();
  10. getEntrySet();
  11. }
  12. //根據Map 中的 keySet()方法獲取
  13. public static void getKeySet(){
  14. System.out.println("--------keySet()方法獲取-------------");
  15. Map map = new HashMap();
  16. map.put(1, "a");
  17. map.put(2, "b");
  18. System.out.println(map.keySet());
  19. Collection s = map.keySet();
  20. System.out.println(s);
  21. Iterator iter2 = (Iterator)map.keySet().iterator();
  22. while(iter2.hasNext()){
  23. System.out.print(iter2.next() + ", ");
  24. }
  25. System.out.println("========得到value的方法========");
  26. Collection c = map.values();
  27. System.out.println(c);
  28. Iterator iter1 = (Iterator)map.values().iterator();
  29. while(iter1.hasNext()){
  30. System.out.print(iter1.next() + ", ");//一個一個獲取value值
  31. }
  32. }
  33. //根據Map 中的 entrySet()方法獲取
  34. public static void getEntrySet(){
  35. System.out.println("--------entrySet()方法獲取-------------");
  36. Map map = new HashMap();
  37. map.put(1, "a");
  38. map.put(2, "b");
  39. System.out.println(map.entrySet());
  40. Collection s = map.entrySet();
  41. System.out.println(s);
  42. Iterator iter2 = (Iterator)map.entrySet().iterator();
  43. while(iter2.hasNext()){
  44. System.out.print(iter2.next() + ", ");
  45. }
  46. }
  47. }



五、hashmap是怎麽存儲數據的

hashmap 實質上一個數組和鏈表的結合體,記得嚴尉敏版的C數據結構上將這個稱為“散列表”。對於hashmap存儲可以這樣理解,數組用於存儲key,鏈表用於存儲value,每個鏈表都鏈接在數組中的一個元素上。

arraylist 實質上就是一個順序的動態數組,開始時以一默認值開一數組,滿了後再擴容,且實現了動態添加和刪除。

二者性能區別:hashmpa 用於快速查找,但是arraylist基本上不浪費空間。各有利弊吧

查看詳情:http://blog.csdn.net/vking_wang/article/details/14166593

六、是不是用了maven,有對項目分過模塊吧,你知道為什麽要分嗎?(這個沒法說 自己想吧)

1、什麽業務場景下我們使用遞歸寫法,請舉一個例子,並予以說明

2、dubbo、webservice或你熟悉的接口與http接口的區別?我們在做這些接口交互時應當註意什麽?

webservice做接口 跟http做接口有啥區別 :協議不一樣


3、為何我們在開發中要使用到序列號和反序列號,你都知道哪些序列化工具,並描述各自的優缺點

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是為了解決對象流讀寫操作時可能引發的問題(如果不進行序列化可能會存在數據亂序的問題)。要實現序列化,需要讓一個類實現Serializable接口,該接口是一個標識性接口,標註該類對象是可被序列化的,然後使用一個輸出流來構造一個對象輸出流並通過writeObject(Object obj)方法就可以將實現對象寫出(即保存其狀態);如果需要反序列化則可以用一個輸入流建立對象輸入流,然後通過readObject方法從流中讀取對象。序列化除了能夠實現對象的持久化之外,還能夠用於對象的深度克隆

4、列舉關系型數據庫和非關系型數據庫的區別?對於目前nosq數據庫說說它的應用場景和優勢

5、簡述hibernate和mybatis的區別,你偏向使用哪種,為什麽?

參見:http://blog.csdn.net/liyintaoliuyun/article/details/51446758

6、我們在使用springmvc進行開發時,是如何對數據進行封裝的和校驗的,對於restful的傳輸風格是否了解,說說它的特點

7、簡述spring的事務特性?什麽業務場景需要用到事務控制

8、java為什麽要有垃圾回收?什麽時候進行?如何進行檢測內存泄漏

GC是垃圾收集的意思,內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。Java程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉顯示的垃圾回收調用。

垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低優先級的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。在Java誕生初期,垃圾回收是Java最大的亮點之一,因為服務器端的編程需要有效的防止內存泄露問題,然而時過境遷,如今Java的垃圾回收機制已經成為被詬病的東西。移動智能終端用戶通常覺得iOS的系統比Android系統有更好的用戶體驗,其中一個深層次的原因就在於Android系統中垃圾回收的不可預知性。

補充:垃圾回收機制有很多種,包括:分代復制垃圾回收、標記垃圾回收、增量垃圾回收等方式。標準的Java進程既有棧又有堆。棧保存了原始型局部變量,堆保存了要創建的對象。Java平臺對堆內存回收和再利用的基本算法被稱為標記和清除,但是Java對其進行了改進,采用“分代式垃圾收集”。這種方法會跟Java對象的生命周期將堆內存劃分為不同的區域,在垃圾收集過程中,可能會將對象移動到不同區域:

  • 伊甸園(Eden):這是對象最初誕生的區域,並且對大多數對象來說,這裏是它們唯一存在過的區域。
  • 幸存者樂園(Survivor):從伊甸園幸存下來的對象會被挪到這裏。
  • 終身頤養園(Tenured):這是足夠老的幸存對象的歸宿。年輕代收集(Minor-GC)過程是不會觸及這個地方的。當年輕代收集不能把對象放進終身頤養園時,就會觸發一次完全收集(Major-GC),這裏可能還會牽扯到壓縮,以便為大對象騰出足夠的空間。

與垃圾回收相關的JVM參數:

  • -Xms / -Xmx --- 堆的初始大小 / 堆的最大大小
  • -Xmn --- 堆中年輕代的大小
  • -XX:-DisableExplicitGC --- 讓System.gc()不產生任何作用
  • -XX:+PrintGCDetail --- 打印GC的細節
  • -XX:+PrintGCDateStamps --- 打印GC操作的時間戳

9、你們公司的項目都用了那些框架,都用了Spring的那些核心,項目中怎麽體現的
spring參照http://blog.csdn.net/lovesomnus/article/details/46470255

10、你們是如何實現分布式的

11、你用過什麽緩存數據庫。什麽情況下需要用到

12、你在項目中用過多線程嗎?你知道如何實現多線程嗎?你那裏為什麽要用到多線程

Java 5以前實現多線程有兩種實現方法:一種是繼承Thread類;另一種是實現Runnable接口。兩種方式都要通過重寫run()方法來定義線程的行為,推薦使用後者,因為Java中的繼承是單繼承,一個類有一個父類,如果繼承了Thread類就無法再繼承其他類了,顯然使用Runnable接口更為靈活。

補充:Java 5以後創建線程還有第三種方式:實現Callable接口,該接口中的call方法可以在線程執行結束時產生一個返回值,代碼如下所示:

[python] view plain copy
  1. package com.lyt.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.Callable;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.Future;
  8. /**
  9. * 實現Callable接口,該接口中的call方法可以在線程執行結束時產生一個返回值
  10. * @author Administrator
  11. *
  12. */
  13. class MyTask implements Callable<Integer> {
  14. private int upperBounds;
  15. public MyTask(int upperBounds) {
  16. this.upperBounds = upperBounds;
  17. }
  18. @Override
  19. public Integer call() throws Exception {
  20. int sum = 0;
  21. for (int i = 1; i <= upperBounds; i++) {
  22. sum += i;
  23. }
  24. return sum;
  25. }
  26. }
  27. public class Test {
  28. public static void main(String[] args) throws Exception {
  29. List<Future<Integer>> list = new ArrayList<>();
  30. ExecutorService service = Executors.newFixedThreadPool(10);
  31. for (int i = 0; i < 10; i++) {
  32. list.add(service.submit(new MyTask((int) (Math.random() * 100))));
  33. }
  34. int sum = 0;
  35. for (Future<Integer> future : list) {
  36. while (!future.isDone())
  37. ;
  38. sum += future.get();
  39. }
  40. System.out.println("返回值:" + sum);
  41. }
  42. }




13、你了解消息隊列嗎?

14、你們的項目業務量有多大?如果某張表數據量越來越大,查詢會越來越慢,你會怎麽處理

寫sql的時候 註意優化 不用這麽多的join ,做分區做索引

下面舉兩個簡單的例子:

圖書館的例子:一個圖書館那麽多書,怎麽管理呢?建立一個字母開頭的目錄,例如:a開頭的書,在第一排,b開頭的在第二排,這樣在找什麽書就好說了,這個就是一個聚集索引,可是很多人借書找某某作者的,不知道書名怎麽辦?圖書管理員在寫一個目錄,某某作者的書分別在第幾排,第幾排,這就是一個非聚集索引

字典的例子:字典前面的目錄,可以按照拼音和部首去查詢,我們想查詢一個字,只需要根據拼音或者部首去查詢,就可以快速的定位到這個漢字了,這個就是索引的好處,拼音查詢法就是聚集索引,部首查詢就是一個非聚集索引.

看了上面的例子,下面的一句話大家就很容易理解了:聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲並不連續。就像字段,聚集索引是連續的,a後面肯定是b,非聚集索引就不連續了,就像圖書館的某個作者的書,有可能在第1個貨架上和第10個貨架上。還有一個小知識點就是:聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。


SQL索引有兩種,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系統的性能,加快數據的查詢速度與減少系統的響應時間
創建索引的語法:

CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name

ON {table_name | view_name} [WITH [index_property [,....n]]

說明:

UNIQUE: 建立唯一索引。

CLUSTERED: 建立聚集索引。

NONCLUSTERED: 建立非聚集索引。

Index_property: 索引屬性。

UNIQUE索引既可以采用聚集索引結構,也可以采用非聚集索引的結構,如果不指明采用的索引結構,則SQL Server系統默認為采用非聚集索引結構。

刪除索引語法:

DROP INDEX table_name.index_name[,table_name.index_name]

說明:table_name: 索引所在的表名稱。

index_name : 要刪除的索引名稱。

使用系統存儲過程:sp_helpindex 查看指定表的索引信息。

執行代碼如下:

Exec sp_helpindex book1;



15、在項目中可能碰到這種情況,公司要出報表了,但是後臺業務還在跑,這會導致報表查詢會被死鎖,你有什麽好的解決辦法嗎?

做後臺業務的方法和出報表的方法做線程同步

或者後臺業務處理完給個標示 然後才可以出報表(做標示比較好 個人推薦)

16、某個賬戶表中有N個賬戶,每個賬戶在記賬的時候都會被不同的記賬流程所操作進行余額更新,你是如何避免數據不一致以及死鎖的?

余額更新的方法加鎖

17、你了解過restful吧,你能說說它嗎?它和webservice有什麽異同

協議不一樣,

如果數據類型比較復雜 用webservice

18、你了解Linux嗎?如果讓你修改一個文件,你怎麽改?

vim 文件名.xml等等文件 執行之後進去 然後 i 就可以操作了,:qw 保存並退出
參照:http://blog.csdn.net/liyintaoliuyun/article/details/51407006

19、你們項目中對請求驗證是怎麽做的?

面試題:總結 !=!=未看