2020Java面試(更新中)


基本概念

1.操作系統中 heap 和 stack 的區別
1.heap是堆,stack是棧;
2.堆的空間由系統自動分配和釋放,棧的空間需要申請和手動釋放,所以棧的存取速度快;
3.堆的空間是很大的自由區,棧的空間有限;
4.堆內存主要用於存儲實例化對象和jre classes,棧內存存儲基本變量和對象的引用;
5.每個線程都有自己的一個Java棧,所有的線程共享一個堆,jvm中,內存分為內存棧區和內存堆區;
在Java中,若只是聲明一個對象,則在棧內存中為其分配地址空間,再new一下,實例化,則在對內存中為其分配存儲空間;

2.什么是基於注解的切面實現
AOP:面向切面編程,動態的將代碼切入到指定類,指定方法的思想就叫面向切面編程;
1.切入到指定類,指定方法的代碼稱為切面,切入的類切入的方法稱為切點,有了AOP,就可以將幾個類共有的代碼存入切片中,等待需要時存入到切片中,改變原來的狀態或行為;
2.AOP就是OOP的補充,OOP時橫向切面,AOP是縱向切面,AOP使得OOP變得立體,增加了時間,就使得OOP從二維變成了三維;
3.技術上,AOP通過代理機制實現;
4.
3.什么是 對象/關系 映射集成模塊
4.什么是 Java 的反射機制
Java的反射機制是增強Java的靈活性和動態性的一種方法。
Java反射機制指的是:在Java運行狀態中,任何一個類都可以獲得這個類的屬性和方法;對於給定的一個類,都可以調用它的屬性和方法;這種動態的獲取對象的屬性或方法就是反射機制。

5.什么是 ACID
ACID是衡量事務的四個特性,原子性,一致性,隔離性,耐久性,一般指的是數據庫事務的ACID,
原子性,指的是整個事務是一個獨立的單元,要么操作成功,要么操作不成功
一致性,事務必須要保持和系統處於一致的狀態
隔離性,事務是並發控制機制,一般通過鎖實現
耐久性,一個成功的事務將永久性地改變系統的狀態
6.BS與CS的聯系與區別
BS:瀏覽器應用,只需要瀏覽器就可以運行程序
CS:客戶端應用,如手機,電腦桌面應用程序,需要安裝軟件使用,
7.Cookie 和 Session的區別

session:稱為會話信息,位於web服務器上,主要負責訪問者與網站之間的交互
1.cookie以文本形式存儲在瀏覽器中,session存儲在服務端,限制了存儲量;
2.cookie限制了存儲量,只能存儲4kb,sesstion無限量;
3.我們可以輕松訪問cookie,但無法訪問繪畫值,因此更安全;
4.設置cookie時間可以使cookie過期。但是使用session-destory(),我們將會銷毀會話。

總結:如果我們需要經常登錄一個站點時,最好用cookie來保存信息,要不然每次登陸都特別麻煩,如果對於需要安全性高的站點以及控制數據的能力時需要用會話效果更佳,當然我們也可以結合兩者,使網站按照我們的想法進行運行

8.fail-fast 與 fail-safe 機制有什么區別
9.get 和 post請求的區別
HTTP協議中的兩種發送請求的方法。
1.get會把請求的參數放在url后面,post會放在 </request body>中,因此post更安全;
2.get的長度有限制;
3.get請求的內容在瀏覽器中會主動緩存;
4.get僅支持url編碼格式;
5.get僅支持ASCII字符,post對參數類型沒有限制;
6.后退頁面get無影響,post會再次請求;

10.Interface 與 abstract 類的區別
abstract類:抽象類,含有abstract修飾符的class即為抽象類,abstract 類不能創建的實例對象。
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。
11.IOC的優點是什么
IOC(Inversion of Control)控制反轉,將創建對象和對象之間的依賴關系的權利交給spring容器,優點是程序員自己不用再new 對象了,這些都交給容器來做。
12.IO 和 NIO的區別,NIO優點
NIO即New IO,這個庫是在JDK1.4中才引入的,NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在JavaAPI中提供了兩套NIO,一套是針對標准輸入輸出NIO,另一套就是網絡編程NIO。
Java IO和NIO之間的主要區別:
1. Java IO和NIO之間第一個最大的區別是,IO是面向流的,NIO是面向緩沖區的,操作更靈活。
2. Java IO的各種流是阻塞的,,就是當一個線程調用讀寫方法時,該線程會被阻塞,直到讀寫完,在這期間該線程不能干其他事,CPU轉而去處理其他線程,假如一個線程監聽一個端口,一天只會有幾次請求進來,但是CPU卻不得不為該線程不斷的做上下文切換,並且大部分切換以阻塞告終
NIO通訊是將整個任務切換成許多小任務,由一個線程負責處理所有io事件,並負責分發。它是利用事件驅動機制,而不是監聽機制,事件到的時候再觸發。NIO線程之間通過wait,notify等方式通訊。保證了每次上下文切換都有意義,減少無謂的進程切換。
3. Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已准備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
13.Java 8 / Java 7 為我們提供了什么新功能

Java 7 的7個新特性
1.對集合類的語言支持;
2.自動資源管理;
3.改進的通用實例創建類型推斷;
4.數字字面量下划線支持;
5.switch中使用string;
6.二進制字面量;
7.簡化可變參數方法調用。

JAVA8 新特性
Lambda 表達式 − Lambda允許把函數作為一個方法的參數(函數作為參數傳遞進方法中。
方法引用 − 方法引用提供了非常有用的語法,可以直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。
默認方法 − 默認方法就是一個在接口里面有了一個實現的方法。
新工具 − 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。
Stream API −新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。
Date Time API − 加強對日期與時間的處理。
Optional 類 − Optional 類已經成為 Java 8 類庫的一部分,用來解決空指針異常。
Nashorn, JavaScript 引擎 − Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上運行特定的javascript應用。

A.Java 7 的7個新特性
1.對集合類的語言支持

Java將包含對創建集合類的第一類語言支持。這意味着集合類的創建可以像Ruby和Perl那樣了。
原本需要怎樣:

List list = new ArrayList ();
list.add("item");
String item = list.get(0);

     Set<String> set = new HashSet<String>();
     set.add("item");
     Map<String, Integer> map = new HashMap<String, Integer>();
     map.put("key", 1);
     int value = map.get("key");

現在只需這樣:(這些集合是不可變的...)

List list = ["item"];
String item = list[0];

     Set<String> set = {"item"};
     
     Map<String, Integer> map = {"key" : 1};
     int value = map["key"];

2.自動資源管理
Java中某些資源是需要手動關閉的,如InputStream,Writes,Sockets,Sql classes等。這個新的語言特性允許try語句本身申請更多的資源,這些資源作用於try代碼塊,並自動關閉。
以前的寫法:
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
現在可以:(有點像C#)
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}
3.改進的通用實例創建類型推斷;
類型推斷是一個特殊的煩惱,如下面的代碼:
Map<String, List > anagrams = new HashMap<String, List >();
通過類型推斷后變成:
Map<String, List > anagrams = new HashMap<>();
注:這個<>被叫做diamond(鑽石)運算符,Java 7后這個運算符從引用的聲明中推斷類型。
4.數字字面量下划線支持
很長的數字可讀性不好,在Java 7中可以使用下划線分隔長int以及long了。如:
int one_million = 1_000_000;
這樣子還真看不慣。。。不過的確是可讀性好了。
5.switch中使用string
這個問題是我在Java中不喜歡用switch的原因之一,以前在switch中只能使用number或enum。現在可以使用string了,哈哈,不錯,贊個!

String s = ...
switch(s) {
case "quux":
processQuux(s);
// fall-through
case "foo":
case "bar":
processFooOrBar(s);
break;
case "baz":
processBaz(s);
// fall-through
default:
processDefault(s);
break;
}

6.二進制字面量
由於繼承C語言,Java代碼在傳統上迫使程序員只能使用十進制,八進制或十六進制來表示數(numbers)。
由於很少的域是以bit導向的,這種限制可能導致錯誤。你現在可以使用0b前綴創建二進制字面量
int binary = 0b1001_1001;
現在,可以使用二進制字面量這種表示方式,並且使用非常簡短的代碼,可將二進制字符轉換為數據類型,如在byte或short。
byte aByte = (byte)0b001;
short aShort = (short)0b010;
7.簡化可變參數方法調用。
當程序員試圖使用一個不可具體化的可變參數並調用一個varargs (可變)方法時,編輯器會生成一個“非安全操作”的警告。
JDK 7將警告從call轉移到了方法聲明(methord declaration)的過程中。這樣API設計者就可以使用vararg,因為警告的數量大大減少了。

B.Java8的新特性
Java 8是Java的一個重大版本,有人認為,雖然這些新特性領Java開發人員十分期待,但同時也需要花不少精力去學習。在這一小節中,我們將介紹Java 8的大部分新特性。
2.1 Lambda表達式和函數式接口
Lambda表達式(也稱為閉包)是Java 8中最大和最令人期待的語言改變。它允許我們將函數當成參數傳遞給某個方法,或者把代碼本身當作數據處理:函數式開發者非常熟悉這些概念。很多JVM平台上的語言(Groovy、Scala等)從誕生之日就支持Lambda表達式,但是Java開發者沒有選擇,只能使用匿名內部類代替Lambda表達式。
Lambda的設計耗費了很多時間和很大的社區力量,最終找到一種折中的實現方案,可以實現簡潔而緊湊的語言結構。最簡單的Lambda表達式可由逗號分隔的參數列表、->符號和語句塊組成,例如:
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
在上面這個代碼中的參數e的類型是由編譯器推理得出的,你也可以顯式指定該參數的類型,例如:
Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
如果Lambda表達式需要更復雜的語句塊,則可以使用花括號將該語句塊括起來,類似於Java中的函數體,例如:
Arrays.asList( "a", "b", "d" ).forEach( e -> {
System.out.print( e );
System.out.print( e );
} );
Lambda表達式可以引用類成員和局部變量(會將這些變量隱式得轉換成final的),例如下列兩個代碼塊的效果完全相同:
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );

final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );
Lambda表達式有返回值,返回值的類型也由編譯器推理得出。如果Lambda表達式中的語句塊只有一行,則可以不用使用return語句,下列兩個代碼片段效果相同:
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
int result = e1.compareTo( e2 );
return result;
} );
Lambda的設計者們為了讓現有的功能與Lambda表達式良好兼容,考慮了很多方法,於是產生了函數接口這個概念。函數接口指的是只有一個函數的接口,這樣的接口可以隱式轉換為Lambda表達式。java.lang.Runnable和java.util.concurrent.Callable是函數式接口的最佳例子。在實踐中,函數式接口非常脆弱:只要某個開發者在該接口中添加一個函數,則該接口就不再是函數式接口進而導致編譯失敗。為了克服這種代碼層面的脆弱性,並顯式說明某個接口是函數式接口,Java 8 提供了一個特殊的注解@FunctionalInterface(Java 庫中的所有相關接口都已經帶有這個注解了),舉個簡單的函數式接口的定義:
@FunctionalInterface
public interface Functional {
void method();
}
不過有一點需要注意,默認方法和靜態方法不會破壞函數式接口的定義,因此如下的代碼是合法的。

@FunctionalInterface
public interface FunctionalDefaultMethods {
void method();

default void defaultMethod() {            
}        

}

Lambda表達式作為Java 8的最大賣點,它有潛力吸引更多的開發者加入到JVM平台,並在純Java編程中使用函數式編程的概念。如果你需要了解更多Lambda表達式的細節,可以參考官方文檔。
2.2 接口的默認方法和靜態方法
Java 8使用兩個新概念擴展了接口的含義:默認方法和靜態方法。默認方法使得接口有點類似traits,不過要實現的目標不一樣。默認方法使得開發者可以在 不破壞二進制兼容性的前提下,往現存接口中添加新的方法,即不強制那些實現了該接口的類也同時實現這個新加的方法。
默認方法和抽象方法之間的區別在於抽象方法需要實現,而默認方法不需要。接口提供的默認方法會被接口的實現類繼承或者覆寫,例子代碼如下:

private interface Defaulable {
// Interfaces now allow default methods, the implementer may or
// may not implement (override) them.
default String notRequired() {
return "Default implementation";
}
}

private static class DefaultableImpl implements Defaulable {
}

private static class OverridableImpl implements Defaulable {
@Override
public String notRequired() {
return "Overridden implementation";
}
}

Defaulable接口使用關鍵字default定義了一個默認方法notRequired()。DefaultableImpl類實現了這個接口,同時默認繼承了這個接口中的默認方法;OverridableImpl類也實現了這個接口,但覆寫了該接口的默認方法,並提供了一個不同的實現。
Java 8帶來的另一個有趣的特性是在接口中可以定義靜態方法,例子代碼如下:
private interface DefaulableFactory {
// Interfaces now allow static methods
static Defaulable create( Supplier< Defaulable > supplier ) {
return supplier.get();
}
}
下面的代碼片段整合了默認方法和靜態方法的使用場景:

public static void main( String[] args ) {
Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
System.out.println( defaulable.notRequired() );

defaulable = DefaulableFactory.create( OverridableImpl::new );
System.out.println( defaulable.notRequired() );

}

這段代碼的輸出結果如下:
Default implementation
Overridden implementation
由於JVM上的默認方法的實現在字節碼層面提供了支持,因此效率非常高。默認方法允許在不打破現有繼承體系的基礎上改進接口。該特性在官方庫中的應用是:給java.util.Collection接口添加新方法,如stream()、parallelStream()、forEach()和removeIf()等等。
盡管默認方法有這么多好處,但在實際開發中應該謹慎使用:在復雜的繼承體系中,默認方法可能引起歧義和編譯錯誤。如果你想了解更多細節,可以參考官方文檔。
2.3 方法引用
方法引用使得開發者可以直接引用現存的方法、Java類的構造方法或者實例對象。方法引用和Lambda表達式配合使用,使得java類的構造方法看起來緊湊而簡潔,沒有很多復雜的模板代碼。
西門的例子中,Car類是不同方法引用的例子,可以幫助讀者區分四種類型的方法引用。

public static class Car {
public static Car create( final Supplier< Car > supplier ) {
return supplier.get();
}

public static void collide( final Car car ) {
    System.out.println( "Collided " + car.toString() );
}

public void follow( final Car another ) {
    System.out.println( "Following the " + another.toString() );
}

public void repair() {   
    System.out.println( "Repaired " + this.toString() );
}

}

第一種方法引用的類型是構造器引用,語法是Class::new,或者更一般的形式:Class ::new。注意:這個構造器沒有參數。
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );
第二種方法引用的類型是靜態方法引用,語法是Class::static_method。注意:這個方法接受一個Car類型的參數。
cars.forEach( Car::collide );
第四種方法引用的類型是某個實例對象的成員方法的引用,語法是instance::method。注意:這個方法接受一個Car類型的參數:
final Car police = Car.create( Car::new );
cars.forEach( police::follow );
運行上述例子,可以在控制台看到如下輸出(Car實例可能不同):
Collided com.javacodegeeks.java8.method.references.MethodReferences \(Car@7a81197d Repaired com.javacodegeeks.java8.method.references.MethodReferences\)Car@7a81197d
Following the com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
如果想了解和學習更詳細的內容,可以參考官方文檔
2.4 重復注解
自從Java 5中引入注解以來,這個特性開始變得非常流行,並在各個框架和項目中被廣泛使用。不過,注解有一個很大的限制是:在同一個地方不能多次使用同一個注解。Java 8打破了這個限制,引入了重復注解的概念,允許在同一個地方多次使用同一個注解。
在Java 8中使用@Repeatable注解定義重復注解,實際上,這並不是語言層面的改進,而是編譯器做的一個trick,底層的技術仍然相同。可以利用下面的代碼說明:

package com.javacodegeeks.java8.repeatable.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class RepeatingAnnotations {
@Target( ElementType.TYPE )
@Retention( RetentionPolicy.RUNTIME )
public @interface Filters {
Filter[] value();
}

@Target( ElementType.TYPE )
@Retention( RetentionPolicy.RUNTIME )
@Repeatable( Filters.class )
public @interface Filter {
    String value();
};

@Filter( "filter1" )
@Filter( "filter2" )
public interface Filterable {        
}

public static void main(String[] args) {
    for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
        System.out.println( filter.value() );
    }
}

}

正如我們所見,這里的Filter類使用@Repeatable(Filters.class)注解修飾,而Filters是存放Filter注解的容器,編譯器盡量對開發者屏蔽這些細節。這樣,Filterable接口可以用兩個Filter注解注釋(這里並沒有提到任何關於Filters的信息)。
另外,反射API提供了一個新的方法:getAnnotationsByType(),可以返回某個類型的重復注解,例如Filterable.class.getAnnoation(Filters.class)將返回兩個Filter實例,輸出到控制台的內容如下所示:
filter1
filter2
如果你希望了解更多內容,可以參考官方文檔。
2.5 更好的類型推斷
Java 8編譯器在類型推斷方面有很大的提升,在很多場景下編譯器可以推導出某個參數的數據類型,從而使得代碼更為簡潔。例子代碼如下:

package com.javacodegeeks.java8.type.inference;

public class Value< T > {
public static< T > T defaultValue() {
return null;
}

public T getOrDefault( T value, T defaultValue ) {
    return ( value != null ) ? value : defaultValue;
}

}

下列代碼是Value 類型的應用:

package com.javacodegeeks.java8.type.inference;

public class TypeInference {
public static void main(String[] args) {
final Value< String > value = new Value<>();
value.getOrDefault( "22", Value.defaultValue() );
}
}

參數Value.defaultValue()的類型由編譯器推導得出,不需要顯式指明。在Java 7中這段代碼會有編譯錯誤,除非使用Value. defaultValue()。
2.6 拓寬注解的應用場景
Java 8拓寬了注解的應用場景。現在,注解幾乎可以使用在任何元素上:局部變量、接口類型、超類和接口實現類,甚至可以用在函數的異常定義上。下面是一些例子:

package com.javacodegeeks.java8.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;

public class Annotations {
@Retention( RetentionPolicy.RUNTIME )
@Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
public @interface NonEmpty {
}

public static class Holder< @NonEmpty T > extends @NonEmpty Object {
    public void method() throws @NonEmpty Exception {            
    }
}

@SuppressWarnings( "unused" )
public static void main(String[] args) {
    final Holder< String > holder = new @NonEmpty Holder< String >();        
    @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();        
}

}

ElementType.TYPE_USER和ElementType.TYPE_PARAMETER是Java 8新增的兩個注解,用於描述注解的使用場景。Java 語言也做了對應的改變,以識別這些新增的注解。
14.什么是競態條件? 舉個例子說明。

15.JRE、JDK、JVM 及 JIT 之間有什么不同
16.MVC的各個部分都有那些技術來實現?如何實現?
17.RPC 通信和 RMI 區別
18.什么是 Web Service(Web服務)
19.JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。
20.WEB容器主要有哪些功能? 並請列出一些常見的WEB容器名字。
一個”.java”源文件中是否可以包含多個類(不是內部類)?有什么限制
簡單說說你了解的類加載器。是否實現過類加載器
解釋一下什么叫AOP(面向切面編程)
請簡述 Servlet 的生命周期及其相關的方法
請簡述一下 Ajax 的原理及實現步驟
簡單描述Struts的主要功能
什么是 N 層架構
什么是CORBA?用途是什么
什么是Java虛擬機?為什么Java被稱作是“平台無關的編程語言”
什么是正則表達式?用途是什么?哪個包使用正則表達式來實現模式匹配
什么是懶加載(Lazy Loading)
什么是尾遞歸,為什么需要尾遞歸
什么是控制反轉(Inversion of Control)與依賴注入(Dependency Injection)
Thread的 start方法只能啟動一次,啟動多次會出現異常,那么線程池是怎么實現復用Thread的

關鍵字
finalize

什么是finalize()方法
finalize()方法什么時候被調用
析構函數(finalization)的目的是什么
final 和 finalize 的區別
final
final關鍵字有哪些用法
final 與 static 關鍵字可以用於哪里?它們的作用是什么
final, finally, finalize的區別
final、finalize 和 finally 的不同之處?
能否在運行時向 static final 類型的賦值
使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變
一個類被聲明為final類型,表示了什么意思
throws, throw, try, catch, finally分別代表什么意義
Java 有幾種修飾符?分別用來修飾什么
volatile

volatile 修飾符的有過什么實踐
volatile 變量是什么?volatile 變量和 atomic 變量有什么不同
volatile 類型變量提供什么保證?能使得一個非原子操作變成原子操作嗎
能創建 volatile 數組嗎?
transient變量有什么特點
super什么時候使用
public static void 寫成 static public void會怎樣
說明一下public static void main(String args[])這段聲明里每個關鍵字的作用
請說出作用域public, private, protected, 以及不寫時的區別
sizeof 是Java 的關鍵字嗎
static

static class 與 non static class的區別
static 關鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法
靜態類型有什么特點
main() 方法為什么必須是靜態的?能不能聲明 main() 方法為非靜態
是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用
靜態變量在什么時候加載?編譯期還是運行期?靜態代碼塊加載的時機呢
成員方法是否可以訪問靜態變量?為什么靜態方法不能訪問成員變量
switch

switch 語句中的表達式可以是什么類型數據
switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上
while 循環和 do 循環有什么不同
操作符

&操作符和&&操作符有什么區別?
a = a + b 與 a += b 的區別?
邏輯操作符 (&,|,^)與條件操作符(&&,||)的區別
3*0.1 == 0.3 將會返回什么?true 還是 false?
float f=3.4; 是否正確?
short s1 = 1; s1 = s1 + 1;有什么錯?
數據結構

基礎類型(Primitives)

基礎類型(Primitives)與封裝類型(Wrappers)的區別在哪里
簡述九種基本數據類型的大小,以及他們的封裝類
int 和 Integer 哪個會占用更多的內存? int 和 Integer 有什么區別?parseInt()函數在什么時候使用到
float和double的默認值是多少
如何去小數四舍五入保留小數點后兩位
char 型變量中能不能存貯一個中文漢字,為什么
類型轉換

怎樣將 bytes 轉換為 long 類型
怎么將 byte 轉換為 String
如何將數值型字符轉換為數字
我們能將 int 強制轉換為 byte 類型的變量嗎?如果該值大於 byte 類型的范圍,將會出現什么現象
能在不進行強制轉換的情況下將一個 double 值賦值給 long 類型的變量嗎
類型向下轉換是什么
數組

如何權衡是使用無序的數組還是有序的數組
怎么判斷數組是 null 還是為空
怎么打印數組? 怎樣打印數組中的重復元素
Array 和 ArrayList有什么區別?什么時候應該使用Array而不是ArrayList
數組和鏈表數據結構描述,各自的時間復雜度
數組有沒有length()這個方法? String有沒有length()這個方法
隊列

隊列和棧是什么,列出它們的區別
BlockingQueue是什么
簡述 ConcurrentLinkedQueue LinkedBlockingQueue 的用處和不同之處。
ArrayList、Vector、LinkedList的存儲性能和特性
String
StringBuffer

ByteBuffer 與 StringBuffer有什么區別
HashMap

HashMap的工作原理是什么
內部的數據結構是什么
HashMap 的 table的容量如何確定?loadFactor 是什么? 該容量如何變化?這種變化會帶來什么問題?
HashMap 實現的數據結構是什么?如何實現
HashMap 和 HashTable、ConcurrentHashMap 的區別
HashMap的遍歷方式及效率
HashMap、LinkedMap、TreeMap的區別
如何決定選用HashMap還是TreeMap
如果HashMap的大小超過了負載因子(load factor)定義的容量,怎么辦
HashMap 是線程安全的嗎?並發下使用的 Map 是什么,它們內部原理分別是什么,比如存儲方式、 hashcode、擴容、 默認容量等
HashSet

HashSet和TreeSet有什么區別
HashSet 內部是如何工作的
WeakHashMap 是怎么工作的?
Set

Set 里的元素是不能重復的,那么用什么方法來區分重復與否呢?是用 == 還是 equals()? 它們有何區別?
TreeMap:TreeMap 是采用什么樹實現的?TreeMap、HashMap、LindedHashMap的區別。TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素?
TreeSet:一個已經構建好的 TreeSet,怎么完成倒排序。
EnumSet 是什么
Hash算法

Hashcode 的作用
簡述一致性 Hash 算法
有沒有可能 兩個不相等的對象有相同的 hashcode?當兩個對象 hashcode 相同怎么辦?如何獲取值對象
為什么在重寫 equals 方法的時候需要重寫 hashCode 方法?equals與 hashCode 的異同點在哪里
a.hashCode() 有什么用?與 a.equals(b) 有什么關系
hashCode() 和 equals() 方法的重要性體現在什么地方
Object:Object有哪些公用方法?Object類hashcode,equals 設計原則? sun為什么這么設計?Object類的概述
如何在父類中為子類自動完成所有的 hashcode 和 equals 實現?這么做有何優劣。
可以在 hashcode() 中使用隨機數字嗎?
LinkedHashMap

LinkedHashMap 和 PriorityQueue 的區別是什么
List

List, Set, Map三個接口,存取元素時各有什么特點
List, Set, Map 是否繼承自 Collection 接口
遍歷一個 List 有哪些不同的方式
LinkedList
LinkedList 是單向鏈表還是雙向鏈表
LinkedList 與 ArrayList 有什么區別
描述下 Java 中集合(Collections),接口(Interfaces),實現(Implementations)的概念。LinkedList 與 ArrayList 的區別是什么?
插入數據時,ArrayList, LinkedList, Vector誰速度較快?
ArrayList
ArrayList 和 HashMap 的默認大小是多數
ArrayList 和 LinkedList 的區別,什么時候用 ArrayList?
ArrayList 和 Set 的區別?
ArrayList, LinkedList, Vector的區別
ArrayList是如何實現的,ArrayList 和 LinkedList 的區別
ArrayList如何實現擴容
Array 和 ArrayList 有何區別?什么時候更適合用Array
說出ArraList,Vector, LinkedList的存儲性能和特性
Map

Map, Set, List, Queue, Stack
Map 接口提供了哪些不同的集合視圖
為什么 Map 接口不繼承 Collection 接口
Collections

介紹Java中的Collection FrameWork。集合類框架的基本接口有哪些
Collections類是什么?Collection 和 Collections的區別?Collection、Map的實現
集合類框架的最佳實踐有哪些
為什么 Collection 不從 Cloneable 和 Serializable 接口繼承
說出幾點 Java 中使用 Collections 的最佳實踐?
Collections 中 遺留類 (HashTable、Vector) 和 現有類的區別
什么是 B+樹,B-樹,列出實際的使用場景。

接口

Comparator 與 Comparable 接口是干什么的?列出它們的區別
對象

拷貝(clone)

如何實現對象克隆
深拷貝和淺拷貝區別
深拷貝和淺拷貝如何實現激活機制
寫clone()方法時,通常都有一行代碼,是什么
比較

在比較對象時,”==” 運算符和 equals 運算有何區別
如果要重寫一個對象的equals方法,還要考慮什么
兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對
構造器

構造器鏈是什么
創建對象時構造器的調用順序
不可變對象

什么是不可變象(immutable object)
為什么 Java 中的 String 是不可變的(Immutable)
如何構建不可變的類結構?關鍵點在哪里
能創建一個包含可變對象的不可變對象嗎
如何對一組對象進行排序

方法

構造器(constructor)是否可被重寫(override)
方法可以同時即是 static 又是 synchronized 的嗎
abstract 的 method是否可同時是 static,是否可同時是 native,是否可同時是synchronized
Java支持哪種參數傳遞類型
一個對象被當作參數傳遞到一個方法,是值傳遞還是引用傳遞
當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,並可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞
我們能否重載main()方法
如果main方法被聲明為private會怎樣
GC

概念

GC是什么?為什么要有GC
什么時候會導致垃圾回收
GC是怎么樣運行的
新老以及永久區是什么
GC 有幾種方式?怎么配置
什么時候一個對象會被GC? 如何判斷一個對象是否存活
System.gc() Runtime.gc()會做什么事情? 能保證 GC 執行嗎
垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收?
Minor GC 、Major GC、Young GC 與 Full GC分別在什么時候發生
垃圾回收算法的實現原理
如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內存?
垃圾回收的最佳做法是什么
GC收集器有哪些

垃圾回收器的基本原理是什么?
串行(serial)收集器和吞吐量(throughput)收集器的區別是什么
Serial 與 Parallel GC之間的不同之處
CMS 收集器 與 G1 收集器的特點與區別
CMS垃圾回收器的工作過程
JVM 中一次完整的 GC 流程是怎樣的? 對象如何晉升到老年代
吞吐量優先和響應優先的垃圾收集器選擇
GC策略

舉個實際的場景,選擇一個GC策略
JVM的永久代中會發生垃圾回收嗎
收集方法

標記清除、標記整理、復制算法的原理與特點?分別用在什么地方
如果讓你優化收集方法,有什么思路
JVM

參數

說說你知道的幾種主要的jvm 參數
-XX:+UseCompressedOops 有什么作用
類加載器(ClassLoader)

Java 類加載器都有哪些
JVM如何加載字節碼文件
內存管理

JVM內存分哪幾個區,每個區的作用是什么
一個對象從創建到銷毀都是怎么在這些部分里存活和轉移的
解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法
JVM中哪個參數是用來控制線程的棧堆棧小
簡述內存分配與回收策略
簡述重排序,內存屏障,happen-before,主內存,工作內存
Java中存在內存泄漏問題嗎?請舉例說明
簡述 Java 中軟引用(SoftReferenc)、弱引用(WeakReference)和虛引用
內存映射緩存區是什么
jstack,jstat,jmap,jconsole怎么用
32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?32 位和 64 位的 JVM,int 類型變量的長度是多數?
怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64 位
JVM自身會維護緩存嗎?是不是在堆中進行對象分配,操作系統的堆還是JVM自己管理堆
什么情況下會發生棧內存溢出
雙親委派模型是什么

多線程

基本概念

什么是線程
多線程的優點
多線程的幾種實現方式
用 Runnable 還是 Thread
什么是線程安全
Vector, SimpleDateFormat 是線程安全類嗎
什么 Java 原型不是線程安全的
哪些集合類是線程安全的
多線程中的忙循環是什么
如何創建一個線程
編寫多線程程序有幾種實現方式
什么是線程局部變量
線程和進程有什么區別?進程間如何通訊,線程間如何通訊
什么是多線程環境下的偽共享(false sharing)
同步和異步有何異同,在什么情況下分別使用他們?舉例說明
Current

ConcurrentHashMap 和 Hashtable的區別
ArrayBlockingQueue, CountDownLatch的用法
ConcurrentHashMap的並發度是什么
CyclicBarrier 和 CountDownLatch有什么不同?各自的內部原理和用法是什么
Semaphore的用法
Thread

啟動一個線程是調用 run() 還是 start() 方法?start() 和 run() 方法有什么區別
調用start()方法時會執行run()方法,為什么不能直接調用run()方法
sleep() 方法和對象的 wait() 方法都可以讓線程暫停執行,它們有什么區別
yield方法有什么作用?sleep() 方法和 yield() 方法有什么區別
Java 中如何停止一個線程
stop() 和 suspend() 方法為何不推薦使用
如何在兩個線程間共享數據
如何強制啟動一個線程
如何讓正在運行的線程暫停一段時間
什么是線程組,為什么在Java中不推薦使用
你是如何調用 wait(方法的)?使用 if 塊還是循環?為什么
生命周期

有哪些不同的線程生命周期
線程狀態,BLOCKED 和 WAITING 有什么區別
畫一個線程的生命周期狀態圖
ThreadLocal 用途是什么,原理是什么,用的時候要注意什么
ThreadPool

線程池是什么?為什么要使用它
如何創建一個Java線程池
ThreadPool用法與優勢
提交任務時,線程池隊列已滿時會發會生什么
newCache 和 newFixed 有什么區別?簡述原理。構造函數的各個參數的含義是什么,比如 coreSize, maxsize 等
線程池的實現策略
線程池的關閉方式有幾種,各自的區別是什么
線程池中submit() 和 execute()方法有什么區別?
線程調度

Java中用到的線程調度算法是什么
什么是多線程中的上下文切換
你對線程優先級的理解是什么
什么是線程調度器 (Thread Scheduler) 和時間分片 (Time Slicing)
線程同步
指令重排在生層應用中對底層c的依賴

請說出你所知的線程同步的方法
synchronized 的原理是什么
synchronized 和 ReentrantLock 有什么不同
什么場景下可以使用 volatile 替換 synchronized
有T1,T2,T3三個線程,怎么確保它們按順序執行?怎樣保證T2在T1執行完后執行,T3在T2執行完后執行
同步塊內的線程拋出異常會發生什么
當一個線程進入一個對象的 synchronized 方法A 之后,其它線程是否可進入此對象的 synchronized 方法B
使用 synchronized 修飾靜態方法和非靜態方法有什么區別
如何從給定集合那里創建一個 synchronized 的集合

Java Concurrency API 中 的 Lock 接口是什么?對比同步它有什么優勢
Lock 與 Synchronized 的區別?Lock 接口比 synchronized 塊的優勢是什么
ReadWriteLock是什么?
鎖機制有什么用
什么是樂觀鎖(Optimistic Locking)?如何實現樂觀鎖?如何避免ABA問題
解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖
什么時候應該使用可重入鎖
簡述鎖的等級方法鎖、對象鎖、類鎖
Java中活鎖和死鎖有什么區別?
什么是死鎖(Deadlock)?導致線程死鎖的原因?如何確保 N 個線程可以訪問 N 個資源同時又不導致死鎖
死鎖與活鎖的區別,死鎖與飢餓的區別
怎么檢測一個線程是否擁有鎖
如何實現分布式鎖
有哪些無鎖數據結構,他們實現的原理是什么
讀寫鎖可以用於什么應用場景
Executors類是什么? Executor和Executors的區別
什么是Java線程轉儲(Thread Dump),如何得到它
如何在Java中獲取線程堆棧
說出 3 條在 Java 中使用線程的最佳實踐
在線程中你怎么處理不可捕捉異常
實際項目中使用多線程舉例。你在多線程環境中遇到的常見的問題是什么?你是怎么解決它的
請說出與線程同步以及線程調度相關的方法
程序中有3個 socket,需要多少個線程來處理
假如有一個第三方接口,有很多個線程去調用獲取數據,現在規定每秒鍾最多有 10 個線程同時調用它,如何做到
如何在 Windows 和 Linux 上查找哪個線程使用的 CPU 時間最長
如何確保 main() 方法所在的線程是 Java 程序最后結束的線程
非常多個線程(可能是不同機器),相互之間需要等待協調才能完成某種工作,問怎么設計這種協調方案
你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它

異常

基本概念

Error 和 Exception有什么區別
UnsupportedOperationException是什么
NullPointerException 和 ArrayIndexOutOfBoundException 之間有什么相同之處
什么是受檢查的異常,什么是運行時異常
運行時異常與一般異常有何異同
簡述一個你最常見到的runtime exception(運行時異常)
finally

finally關鍵詞在異常處理中如何使用
如果執行finally代碼塊之前方法返回了結果,或者JVM退出了,finally塊中的代碼還會執行嗎
try里有return,finally還執行么?那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后
在什么情況下,finally語句不會執行
throw 和 throws 有什么區別?
OOM你遇到過哪些情況?你是怎么搞定的?
SOF你遇到過哪些情況?
既然我們可以用RuntimeException來處理錯誤,那么你認為為什么Java中還存在檢查型異常
當自己創建異常類的時候應該注意什么
導致空指針異常的原因
異常處理 handle or declare 原則應該如何理解
怎么利用 JUnit 來測試一個方法的異常
catch塊里別不寫代碼有什么問題
你曾經自定義實現過異常嗎?怎么寫的
什么是 異常鏈
在try塊中可以拋出異常嗎

JDBC

通過 JDBC 連接數據庫有哪幾種方式
闡述 JDBC 操作數據庫的基本步驟
JDBC 中如何進行事務處理
什么是 JdbcTemplate
什么是 DAO 模塊
使用 JDBC 操作數據庫時,如何提升讀取數據的性能?如何提升更新數據的性能
列出 5 個應該遵循的 JDBC 最佳實踐
IO

File
File類型中定義了什么方法來創建一級目錄
File類型中定義了什么方法來判斷一個文件是否存在


為了提高讀寫性能,可以采用什么流
Java中有幾種類型的流
JDK 為每種類型的流提供了一些抽象類以供繼承,分別是哪些類
對文本文件操作用什么I/O流
對各種基本數據類型和String類型的讀寫,采用什么流
能指定字符編碼的 I/O 流類型是什么
序列化
什么是序列化?如何實現 Java 序列化及注意事項
Serializable 與 Externalizable 的區別
Socket
socket 選項 TCP NO DELAY 是指什么
Socket 工作在 TCP/IP 協議棧是哪一層
TCP、UDP 區別及 Java 實現方式
說幾點 IO 的最佳實踐
直接緩沖區與非直接緩沖器有什么區別?
怎么讀寫 ByteBuffer?ByteBuffer 中的字節序是什么
當用System.in.read(buffer)從鍵盤輸入一行n個字符后,存儲在緩沖區buffer中的字節數是多少
如何使用掃描器類(Scanner Class)令牌化
面向對象編程(OOP)

解釋下多態性(polymorphism),封裝性(encapsulation),內聚(cohesion)以及耦合(coupling)
多態的實現原理
封裝、繼承和多態是什么
對象封裝的原則是什么?

獲得一個類的類對象有哪些方式
重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?
說出幾條 Java 中方法重載的最佳實踐
抽象類
抽象類和接口的區別
抽象類中是否可以有靜態的main方法
抽象類是否可實現(implements)接口
抽象類是否可繼承具體類(concrete class)
匿名類(Anonymous Inner Class)
匿名內部類是否可以繼承其它類?是否可以實現接口

內部類
內部類分為幾種
內部類可以引用它的包含類(外部類)的成員嗎
請說一下 Java 中為什么要引入內部類?還有匿名內部類
繼承
繼承(Inheritance)與聚合(Aggregation)的區別在哪里
繼承和組合之間有什么不同
為什么類只能單繼承,接口可以多繼承
存在兩個類,B 繼承 A,C 繼承 B,能將 B 轉換為 C 么?如 C = (C) B
如果類 a 繼承類 b,實現接口c,而類 b 和接口 c 中定義了同名變量,請問會出現什么問題
接口
接口是什么
接口是否可繼承接口
為什么要使用接口而不是直接使用具體類?接口有什么優點
泛型

泛型的存在是用來解決什么問題
泛型的常用特點
List能否轉為List
工具類

日歷
Calendar Class的用途
如何在Java中獲取日歷類的實例
解釋一些日歷類中的重要方法
GregorianCalendar 類是什么
SimpleTimeZone 類是什么
Locale類是什么
如何格式化日期對象
如何添加小時(hour)到一個日期對象(Date Objects)
如何將字符串 YYYYMMDD 轉換為日期
Math
Math.round()什么作用?Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?

XML
XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?DOM 和 SAX 解析器有什么不同?
Java解析XML的方式
用 jdom 解析 xml 文件時如何解決中文問題?如何解析
你在項目中用到了 XML 技術的哪些方面?如何實現
動態代理

描述動態代理的幾種實現方式,分別說出相應的優缺點
設計模式

什么是設計模式(Design Patterns)?你用過哪種設計模式?用在什么場合
你知道哪些商業級設計模式?
哪些設計模式可以增加系統的可擴展性
單例模式
除了單例模式,你在生產環境中還用過什么設計模式?
寫 Singleton 單例模式
單例模式的雙檢鎖是什么
如何創建線程安全的 Singleton
什么是類的單例模式
寫出三種單例模式實現
適配器模式
適配器模式是什么?什么時候使用
適配器模式和代理模式之前有什么不同
適配器模式和裝飾器模式有什么區別
什么時候使用享元模式
什么時候使用組合模式
什么時候使用訪問者模式
什么是模板方法模式
請給出1個符合開閉原則的設計模式的例子
開放問題

用一句話概括 Web 編程的特點
Google是如何在一秒內把搜索結果返回給用戶
哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入
樹(二叉或其他)形成許多普通數據結構的基礎。請描述一些這樣的數據結構以及何時可以使用它們
某一項功能如何設計
線上系統突然變得異常緩慢,你如何查找問題
什么樣的項目不適合用框架
新浪微博是如何實現把微博推給訂閱者
簡要介紹下從瀏覽器輸入 URL 開始到獲取到請求界面之后 Java Web 應用中發生了什么
請你談談SSH整合
高並發下,如何做到安全的修改同一行數據
12306網站的訂票系統如何實現,如何保證不會票不被超賣
網站性能優化如何優化的
聊了下曾經參與設計的服務器架構
請思考一個方案,實現分布式環境下的 countDownLatch
請思考一個方案,設計一個可以控制緩存總體大小的自動適應的本地緩存
在你的職業生涯中,算得上最困難的技術挑戰是什么
如何寫一篇設計文檔,目錄是什么
大寫的O是什么?舉幾個例子
編程中自己都怎么考慮一些設計原則的,比如開閉原則,以及在工作中的應用
解釋一下網絡應用的模式及其特點
設計一個在線文檔系統,文檔可以被編輯,如何防止多人同時對同一份文檔進行編輯更新
說出數據連接池的工作機制是什么
怎么獲取一個文件中單詞出現的最高頻率
描述一下你最常用的編程風格
如果有機會重新設計你們的產品,你會怎么做
如何搭建一個高可用系統
如何啟動時不需輸入用戶名與密碼
如何在基於Java的Web項目中實現文件上傳和下載
如何實現一個秒殺系統,保證只有幾位用戶能買到某件商品。
如何實現負載均衡,有哪些算法可以實現
如何設計一個購物車?想想淘寶的購物車如何實現的
如何設計一套高並發支付方案,架構如何設計
如何設計建立和保持 100w 的長連接
如何避免瀏覽器緩存。
如何防止緩存雪崩
如果AB兩個系統互相依賴,如何解除依
如果有人惡意創建非法連接,怎么解決
如果有幾十億的白名單,每天白天需要高並發查詢,晚上需要更新一次,如何設計這個功能
如果系統要使用超大整數(超過long長度范圍),請你設計一個數據結構來存儲這種超大型數字以及設計一種算法來實現超大整數加法運算)
如果要設計一個圖形系統,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現
如果讓你實現一個並發安全的鏈表,你會怎么做
應用服務器與WEB 服務器的區別?應用服務器怎么監控性能,各種方式的區別?你使用過的應用服務器優化技術有哪些
大型網站在架構上應當考慮哪些問題
有沒有處理過線上問題?出現內存泄露,CPU利用率標高,應用無響應時如何處理的
最近看什么書,印象最深刻的是什么
描述下常用的重構技巧
你使用什么版本管理工具?分支(Branch)與標簽(Tag)之間的區別在哪里
你有了解過存在哪些反模式(Anti-Patterns)嗎
你用過的網站前端優化的技術有哪些
如何分析Thread dump
你如何理解AOP中的連接點(Joinpoint)、切點(Pointcut)、增強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念
你是如何處理內存泄露或者棧溢出問題的
你們線上應用的 JVM 參數有哪些
怎么提升系統的QPS和吞吐量
知識面

解釋什么是 MESI 協議(緩存一致性)
談談 reactor 模型
Java 9 帶來了怎樣的新功能
Java 與 C++ 對比,C++ 或 Java 中的異常處理機制的簡單原理和應用
簡單講講 Tomcat 結構,以及其類加載器流程
虛擬內存是什么
闡述下 SOLID 原則
請簡要講一下你對測試驅動開發(TDD)的認識
CDN實現原理
Maven 和 ANT 有什么區別
UML中有哪些常用的圖
Linux
Linux 下 IO 模型有幾種,各自的含義是什么。
Linux 系統下你關注過哪些內核參數,說說你知道的
Linux 下用一行命令查看文件的最后五行
平時用到哪些 Linux 命令
用一行命令輸出正在運行的 Java 進程
使用什么命令來確定是否有 Tomcat 實例運行在機器上
什么是 N+1 難題
什么是 paxos 算法
什么是 restful,講講你理解的 restful
什么是 zab 協議
什么是領域模型(domain model)?貧血模型(anaemic domain model) 和充血模型(rich domain model)有什么區別
什么是領域驅動開發(Domain Driven Development)
介紹一下了解的 Java 領域的 Web Service 框架
Web Server、Web Container 與 Application Server 的區別是什么
微服務(MicroServices)與巨石型應用(Monolithic Applications)之間的區別在哪里
描述 Cookie 和 Session 的作用,區別和各自的應用范圍,Session工作原理
你常用的持續集成(Continuous Integration)、靜態代碼分析(Static Code Analysis)工具有哪些
簡述下數據庫正則化(Normalizations)
KISS,DRY,YAGNI 等原則是什么含義
分布式事務的原理,優缺點,如何使用分布式事務?
布式集群下如何做到唯一序列號
網絡
HTTPS 的加密方式是什么,講講整個加密解密流程
HTTPS和HTTP的區別
HTTP連接池實現原理
HTTP集群方案
Nginx、lighttpd、Apache三大主流 Web服務器的區別
是否看過框架的一些代碼
持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些
數值提升是什么
你能解釋一下里氏替換原則嗎
你是如何測試一個應用的?知道哪些測試框架
傳輸層常見編程協議有哪些?並說出各自的特點
編程題

計算加班費

加班10小時以下加班費是時薪的1.5倍。加班10小時或以上,按4元/時算。提示:(一個月工作26天,一天正常工作8小時)

計算1000月薪,加班9小時的加班費
計算2500月薪,加班11小時的加班費
計算1000月薪,加班15小時的加班費
賣東西

一家商場有紅蘋果和青蘋果出售。(紅蘋果5元/個,青蘋果4元/個)。

模擬一個進貨。紅蘋果跟青蘋果各進200個。
模擬一個出售。紅蘋果跟青蘋果各買出10個。每賣出一個蘋果需要進行統計。
提示:一個蘋果是一個單獨的實體。

日期提取

有這樣一個時間字符串:2008-8-8 20:08:08 , 請編寫能夠匹配它的正則表達式,並編寫Java代碼將日期后面的時分秒提取出來,即:20:08:08

線程

8設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。
用Java寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出
wait-notify 寫一段代碼來解決生產者-消費者問題
數字

判斷101-200之間有多少個素數,並輸出所有素數
用最有效率的方法算出2乘以17等於多少
有 1 億個數字,其中有 2 個是重復的,快速找到它,時間和空間要最優
2 億個隨機生成的無序整數,找出中間大小的值
10 億個數字里里面找最小的 10 個
1到1億的自然數,求所有數的拆分后的數字之和,如286 拆分成2、8、6,如1到11拆分后的數字之和 => 1 + … + 9 + 1 + 0 + 1 + 1
一個數如果恰好等於它的因子之和,這個數就稱為 “完數 “。例如6=1+2+3.編程 找出1000以內的所有完數
一個數組中所有的元素都出現了三次,只有一個元素出現了一次找到這個元素
一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地時,共經過多少米?第10次反彈多高?
求100-1000內質數的和
求1到100的和的平均數
求s=a+a+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。 求出1到100的和
算出1到40的質數,放進數組里
顯示放組里的數
找出第[5]個數
刪除第[9]個數,再顯示刪除后的第[9]個
有 3n+1 個數字,其中 3n 個中是重復的,只有 1 個是不重復的,怎么找出來。
有一組數1.1.2.3.5.8.13.21.34。寫出程序隨便輸入一個數就能給出和前一組數字同規律的頭5個數
計算指定數字的階乘
開發 Fizz Buzz
給定一個包含 N 個整數的數組,找出丟失的整數
一個排好序的數組,找出兩數之和為m的所有組合
將一個正整數分解質因數。例如:輸入90,打印出90=233*5。
打印出所有的 “水仙花數 “,所謂 “水仙花數 “是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個 “水仙花數 “,因為153=1的三次方+5的三次方+3的三次方
原地交換兩個變量的值
找出4字節整數的中位數
找到整數的平方根
實現斐波那契
網絡

用Java Socket編程,讀服務器幾個字符,再寫入本地顯示
反射

反射機制提供了什么功能?
反射是如何實現的
哪里用到反射機制
反射中 Class.forName 和 ClassLoader 區別
反射創建類實例的三種方式是什么
如何通過反射調用對象的方法
如何通過反射獲取和設置對象私有字段的值
反射機制的優缺點
數據庫

寫一段 JDBC 連Oracle的程序,並實現數據查詢
算法

50個人圍坐一圈,當數到三或者三的倍數出圈,問剩下的人是誰,原來的位置是多少
實現一個電梯模擬器用
寫一個冒泡排序
寫一個折半查找
隨機產生20個不能重復的字符並排序
寫一個函數,傳入 2 個有序的整數數組,返回一個有序的整數數組
寫一段代碼在遍歷 ArrayList 時移除一個元素
古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第四個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少
約瑟芬環游戲
正則

請編寫一段匹配IP地址的正則表達式
答:
寫出一個正則表達式來判斷一個字符串是否是一個數字
字符串

寫一個方法,入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。
寫一個程序找出所有字符串的組合,並檢查它們是否是回文串
寫一個字符串反轉函數,輸入abcde轉換成edcba代碼
小游戲,倒轉句子中的單詞
將GB2312編碼的字符串轉換為ISO-8859-1編碼的字符串
請寫一段代碼來計算給定文本內字符“A”的個數。分別用迭代和遞歸兩種方式
編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”
給定 2 個包含單詞列表(每行一個)的文件,編程列出交集
打印出一個字符串的所有排列
將一個鍵盤輸入的數字轉化成中文輸出(例如:輸入1234567,輸出:一百二拾三萬四千五百六拾七)
在Web應用開發過程中經常遇到輸出某種編碼的字符,如從 GBK 到 ISO8859-1等,如何輸出一個某種編碼的字符串
日期

計算兩個日期之間的差距


免責聲明!

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



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