java 面試總結(都是親身面試的經歷)

AlbenXie發表於2018-08-20

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

import java.util.*;
public class Demo10 {
	public static void main(String[] args) {
		Person p1 = new Student(9, "m", "gd", "廣");
		Person p2 = new Student(3, "m", "gd", "廣");
		Person p3 = new Student(5, "m", "gd", "廣");
		List<Person> list = new ArrayList<Person>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		//排序
		Collections.sort(list);
		for (int i = 0; i < list.size(); i++) {
			Person p = (Person) (list.get(i));
			System.out.println(p.getAge());
		}
	}
}
class Person implements Comparable {
	private int age;
	//齡
	private String sex;
	//性別
	private String placeOfOrigin;
	//籍貫
	public int getAge() {
		return this.age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return this.sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getPlaceOfOrigin() {
		return this.placeOfOrigin;
	}
	public void setPlaceOfOrigin(String placeOfOrigin) {
		this.placeOfOrigin = placeOfOrigin;
	}
	//實現Comparable介面
	public int compareTo(Object obj) {
		Person p = (Person) obj;
		if (this.age > p.age) {
			return 1;
		} else if (this.age == p.age) {
			return 0;
		} else {
			return -1;
		}
	}
}
class Student extends Person {
	private String school;
	//讀校
	public Student(int age, String sex, String placeOfOrigin, String school) {
		setAge(age);
		setSex(sex);
		setPlaceOfOrigin(placeOfOrigin);
		this.school = school;
	}
	public String getSchool() {
		return this.school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
}
class CollegeStudent extends Person {
	private String tutor;
	//導師
	private double subsidy;
	//補助
	public String getTutor() {
		return this.tutor;
	}
	public void setTutor(String tutor) {
		this.tutor = tutor;
	}
	public double getSubsidy() {
		return this.subsidy;
	}
	public void setSubsidy(double subsidy) {
		this.subsidy = subsidy;
	}
}

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

        

三、給你一臺伺服器,要你裝Tomcat,你得做什麼

       在Linux上安裝:上傳安裝包 解壓之後,配置  tomcat7\conf\tomcat-users.xml,在檔案的最下面,</tomcat-users>的上面新增

<role rolename="manager-gui"/>

<role rolename="manager-script"/>

<role rolename="manager"/>

<role rolename="admin-gui"/>

<user username="admin" password="admin" roles="manager-gui,manager,manager-script,admin-gui"/>

四、怎麼取map中的key

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

測試程式碼:

package com.lyt.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
	public static void main(String[] args) {
		getKeySet();
		getEntrySet();
	}
	//根據Map 中的 keySet()方法獲取
	public static void getKeySet(){
		System.out.println("--------keySet()方法獲取-------------");
		Map map = new HashMap();
		map.put(1, "a");
		map.put(2, "b");
		System.out.println(map.keySet());
		Collection s = map.keySet();
		System.out.println(s);
		Iterator iter2 = (Iterator)map.keySet().iterator();
		while(iter2.hasNext()){
			System.out.print(iter2.next() + ", ");
		}
		System.out.println("========得到value的方法========");
		Collection c = map.values();
		System.out.println(c);
		Iterator iter1 = (Iterator)map.values().iterator();
		while(iter1.hasNext()){
			System.out.print(iter1.next() + ", ");
			//一個一個獲取value值
		}
	}
	//根據Map 中的 entrySet()方法獲取
	public static void getEntrySet(){
		System.out.println("--------entrySet()方法獲取-------------");
		Map map = new HashMap();
		map.put(1, "a");
		map.put(2, "b");
		System.out.println(map.entrySet());
		Collection s = map.entrySet();
		System.out.println(s);
		Iterator iter2 = (Iterator)map.entrySet().iterator();
		while(iter2.hasNext()){
			System.out.print(iter2.next() + ", ");
		}
	}
}

五、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方法可以線上程執行結束時產生一個返回值,程式碼如下所示:

package com.lyt.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 實現Callable介面,該介面中的call方法可以線上程執行結束時產生一個返回值
* @author Administrator
*
*/
class MyTask implements Callable<Integer> {
	private int upperBounds;
	public MyTask(int upperBounds) {
		this.upperBounds = upperBounds;
	}
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (int i = 1; i <= upperBounds; i++) {
			sum += i;
		}
		return sum;
	}
}
public class Test {
	public static void main(String[] args) throws Exception {
		List<Future<Integer>> list = new ArrayList<>();
		ExecutorService service = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			list.add(service.submit(new MyTask((int) (Math.random() * 100))));
		}
		int sum = 0;
		for (Future<Integer> future : list) {
			while (!future.isDone())
			;
			sum += future.get();
		}
		System.out.println("返回值:" + sum);
	}
}

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、你們專案中對請求驗證是怎麼做的?

相關文章