1. 程式人生 > >Java程式設計師必備基礎:JDK 5-15都有哪些經典新特性

Java程式設計師必備基礎:JDK 5-15都有哪些經典新特性

前言

JDK 15釋出啦~ 我們一起回顧JDK 5-15 的新特性吧,大家一起學習哈~

本文已經收錄到github

https://github.com/whx123/JavaHome

「公眾號:撿田螺的小男孩」

Java 5 新特性

1. 泛型

泛型本質是引數化型別,解決不確定具體物件型別的問題。

 List<String> strList=new ArrayList<String>();

2. 增強迴圈(for-each)

for-each迴圈簡化了集合的遍歷。

String [] str = {"關注","公眾號","撿田螺的小男孩"};
for (String temp:str) {
     System.out.println(temp);
}

3. 自動封箱拆箱

  • 自動裝箱: 就是將基本資料型別自動轉換成對應的包裝類。
  • 自動拆箱:就是將包裝類自動轉換成對應的基本資料型別。

包裝型別有:Integer,Double,Float,Long,Short,Character和Boolean

Integer i =666;  //自動裝箱
int a= i;     //自動拆箱

4. 列舉

關鍵字enum可以將一組具名的值的有限集合建立為一種新的型別,而這些具名的值可以作為常規的程式元件使用,這就是列舉型別。

enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}

5. 可變引數

我們在定義方法引數的時候不確定定義多少個,就可以定義為「可變引數」,它本質上是一個「陣列」。

public static void main(String[] args) throws Exception {
    String [] str = {"關注","公眾號","撿田螺的小男孩"};
    testVarargs(str);
    String str1 = "關注公眾號,撿田螺的小男孩";
    testVarargs(str1);
}
//可變引數String... args
private static void testVarargs(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

6. 註解

可以把註解理解為程式碼裡的特殊標記,這些標記可以在編譯,類載入,執行時被讀取,並執行相應的處理。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

7.靜態匯入

通過import static類,就可以使用類裡的靜態變數或方法。看一下例子哈~

import static java.lang.System.out; //靜態匯入System類的靜態變數out
public class Test {
    public static void main(String[] args) throws Exception {
        String str1 = "關注公眾號,撿田螺的小男孩";
        System.out.println(str1); //常規寫法
        out.println(str1);  //靜態匯入,可以直接使用out輸出
    }
}

8. 執行緒併發庫(JUC)

JDK5 豐富了執行緒處理功能,java.util.concurrent包提供了以下的類、介面:

  • 執行緒池:ExecutorService介面
  • 執行緒護斥:Lock 類
  • 執行緒通訊:Condition介面
  • 同步佇列:ArrayBlockingQueue類
  • 同步集合:ConcurrentHashMap類

Java 6 新特性

1.Desktop類和SystemTray類

JDK 6在java.awt包下,新增了兩個類:Desktop類和SystemTray類

  • 「Desktop類」: 用來開啟系統預設瀏覽器瀏覽指定的URL,開啟系統預設郵件客戶端發郵件等
  • 「SystemTray類」:用來在系統托盤區建立一個托盤程式,如果在微軟的Windows上,它被稱為“工作列”狀態區域。
//獲取Desktop例項
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create("https://www.baidu.com"));

2. 使用JAXB2來實現物件與XML之間的對映

JAXB,即Java Architecture for XML Binding,可以實現物件與XML之間的對映,常用註解如下:

  • @XmlRootElement:註解在類上面,對應xml的跟元素,使用name屬性定義根節點的名稱。
  • @XmlElement:指定一個欄位或get/set方法對映到xml的節點,使用name屬性定義這個根節點的名稱。
  • @XmlAttribute:將JavaBean物件的屬性對映為xml的屬性,使用name屬性為生成的xml屬性指定別名。
  • @XmlAccessorType:定義對映這個類中的何種型別都需要對映到xml。
  • @XmlSchema: 將包對映到XML名稱空間

「看個例子吧~」

public class JAXB2XmlTest {

    public static void main(String[] args) throws JAXBException, IOException {
        
        List<Singer> list = new ArrayList<>();
        list.add(new Singer("jay", 8));
        list.add(new Singer("eason", 10));

        SingerList singerList = new SingerList();
        singerList.setSingers(list);

        String str = JAXB2XmlTest.beanToXml(singerList, SingerList.class);
        String path = "C:\\jay.txt";
        BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(path)));
        bfw.write(str);
        bfw.close();

    }

    private static String beanToXml(Object obj, Class<?> load) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(load);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
        StringWriter writer = new StringWriter();
        marshaller.marshal(obj,writer);
        return writer.toString();
    }
}
public class Singer {

    private String name;
    private int age;
    public Singer(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @XmlAttribute(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlAttribute(name="age")
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
@XmlRootElement(name="list")
public class SingerList {

    private List<Singer> singers;
    
    @XmlElement(name="singer")
    public List<Singer> getSingers() {
        return singers;
    }

    public void setSingers(List<Singer> singers) {
        this.singers = singers;
    }
}

「執行效果:」

<?xml version="1.0" encoding="GBK" standalone="yes"?>
<list>
    <singer age="8" name="jay"/>
    <singer age="10" name="eason"/>
</list>

3.輕量級 Http Server API

JDK 6中提供了簡單的Http Server API,可以構建嵌入式Http伺服器,同時支援Http和Https協議。HttpServer會呼叫HttpHandler實現類的回撥方法來處理客戶端請求,這裡使用者只需實現HttpHandler介面就可以了。

/**
 * 根據Java提供的API實現Http伺服器
 */
public class MyHttpServer {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立HttpServer伺服器
        HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 10);
        //將 /jay請求交給MyHandler處理器處理
        httpServer.createContext("/", new MyHandler());
        httpServer.start();
    }
}

public class MyHandler implements HttpHandler {

    public void handle(HttpExchange httpExchange) throws IOException {
        //請求頭
        Headers headers = httpExchange.getRequestHeaders();
        Set<Map.Entry<String, List<String>>> entries = headers.entrySet();

        StringBuffer response = new StringBuffer();
        for (Map.Entry<String, List<String>> entry : entries){
            response.append(entry.toString() + "\n");
        }
        //設定響應頭屬性及響應資訊的長度
        httpExchange.sendResponseHeaders(200, response.length());
        //獲得輸出流
        OutputStream os = httpExchange.getResponseBody();
        os.write(response.toString().getBytes());
        os.close();
    }
}

4. 插入式註解處理API

JDK 6提供了插入式註解處理API,可以讓我們定義的註解在編譯期而不是執行期生效,從而可以在編譯期修改位元組碼。lombok框架就是使用該特性來實現的,Lombok通過註解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString等方法,大大簡化了程式碼的開發。

5. STAX

STAX,是JDK6中一種處理XML文件的API。

public class STAXTest {

    public static void main(String[] args) throws Exception {

        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream("C:\\jay.xml"));
        XMLEvent event = null;
        StringBuffer stringBuffer = new StringBuffer();
        while (xmlEventReader.hasNext()) {
            event = xmlEventReader.nextEvent();
            stringBuffer.append(event.toString());
        }
        System.out.println("xml文件解析結果:");
        System.out.println(stringBuffer);
    }
}

「執行結果:」

xml文件解析結果:
<?xml version="1.0" encoding='GBK' standalone='yes'?><list>
    <singer name='jay' age='8'></singer>
    <singer name='eason' age='10'></singer>
</list>ENDDOCUMENT

6. Common Annotations

Common annotations原本是Java EE 5.0(JSR 244)規範的一部分,現在SUN把它的一部分放到了Java SE 6.0中。隨著Annotation元資料功能加入到Java SE 5.0裡面,很多Java 技術都會用Annotation部分代替XML檔案來配置執行引數。

以下列舉Common Annotations 1.0裡面的幾個Annotations:

  • @Generated:用於標註生成的原始碼
  • @Resource: 用於標註所依賴的資源,容器據此注入外部資源依賴,有基於欄位的注入和基於setter方法的注入兩種方式 。
  • @Resources:同時標註多個外部依賴,容器會把所有這些外部依賴注入
  • @PostConstruct:標註當容器注入所有依賴之後執行的方法,用來進行依賴注入後的初始化工作,只有一個方法可以標註為PostConstruct 。
  • @PreDestroy:當物件例項將要被從容器當中刪掉之前,要執行的回撥方法要標註為PreDestroy

7. Compiler API

javac編譯器可以把.java的原始檔編譯為.class檔案,JDK 6的新特性Compiler API(JSR 199)也可以動態編譯Java原始檔。

public class CompilerApiTest {
    public static void main(String[] args) throws Exception {
        JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager standardJavaFileManager = javaCompiler.getStandardFileManager(null,null,null);
        Iterable<? extends JavaFileObject> javaFileObjects = standardJavaFileManager.getJavaFileObjects("C:\\Singer.java");
        javaCompiler.getTask(null, standardJavaFileManager, null, null, null, javaFileObjects).call();
        standardJavaFileManager.close();
    }
}

執行結果:會在C目錄生成Singer.class檔案

8. 對指令碼語言的支援(如: ruby, groovy, javascript)

JDK6增加了對指令碼語言的支援(JSR 223),原理是將指令碼語言編譯成位元組碼,這樣指令碼語言也能享用Java平臺的諸多優勢,包括可移植性,安全等。JDK6實現包含了一個基於Mozilla Rhino的 指令碼語言引擎,因此可以支援javascript,當然JDK也支援ruby等其他語言

public class JavaScriptTest {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        String script;
        try {
            script = "print('Hello')";
            engine.eval(script);// 執行指令碼
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//output
Hello

Java 7 新特性

1.switch 支援String字串型別。

String singer = "jay";
switch (singer) {
       case "jay" :
            System.out.println("周杰倫");
             break;
       case "eason" :
            System.out.println("陳奕迅");
            break ;
       default :
            System.out.println("其他");
            break ;
   }

2.try-with-resources,資源自動關閉

JDK 7 之前:

BufferedReader br = new BufferedReader(new FileReader("d:七里香.txt"));
try {
   return br.readLine();
} finally {
   br.close();
}

JDK 7 之後:

/*
 * 宣告在try括號中的物件稱為資源,在方法執行完畢後會被自動關閉
 */
try (BufferedReader br = new BufferedReader(new FileReader("d:七里香.txt")) {
   return br.readLine();
}

3. 整數型別如(byte,short,int,long)能夠用二進位制來表示

//0b或者0B表示二進位制
int a = 0b010;
int b = 0B010;

4. 數字常量支援下劃線

int a = 11_11;//a的值為1111,下劃線不影響實際值,提升可讀性

5. 泛型例項化型別自動推斷,即”<>”

JDK 7 之前:

Map<String, List<String>> map = new HashMap<String, List<String>>();

JDK 7之後:

//不須宣告型別,自動根據前面<>推斷其型別
Map<String, List<String>> map = new HashMap<>();

6.一個catch中捕獲多個異常型別,用(|)分隔開

JDK 7之前

try{
   //do something
} catch (FirstException e) {
     logger.error(e);
} catch (SecondException e) {
     logger.error(ex);
}

JDk 7之後

try{
   //do something
} catch (FirstException | SecondException e) {
     logger.error(e);
}

7. 增強的檔案系統

Java7 提供了全新的NIO2.0 API,方便檔案管理的編碼。如,可以在java.nio.file包下使用Path、Paths、Files、WatchService等常用型別。

Path path = Paths.get("C:\\jay\\七里香.txt"); //建立Path物件
byte[] bytes= Files.readAllBytes(path);  //讀取檔案
System.out.println(path.getFileName()); //獲取當前檔名稱
System.out.println(path.toAbsolutePath()); // 獲取檔案絕對路徑
System.out.println(new String(bytes, "utf-8"));

8. Fork/join 框架

Java7提供的一個用於並行執行任務的框架,是一個把大任務分割成若干個小任務,最終彙總每個小任務結果後得到大任務結果的框架。

Fork/join計算1-1000累加值:

public class ForkJoinPoolTest {

    private static final Integer DURATION_VALUE = 100;

    static class ForkJoinSubTask extends RecursiveTask<Integer>{

        // 子任務開始計算的值
        private Integer startValue;
        // 子任務結束計算的值
        private Integer endValue;

        private ForkJoinSubTask(Integer startValue , Integer endValue) {
            this.startValue = startValue;
            this.endValue = endValue;
        }

        @Override
        protected Integer compute() {
            //小於一定值DURATION,才開始計算
            if(endValue - startValue < DURATION_VALUE) {
                System.out.println("執行子任務計算:開始值 = " + startValue + ";結束值 = " + endValue);
                Integer totalValue = 0;
                for (int index = this.startValue; index <= this.endValue; index++) {
                    totalValue += index;
                }
                return totalValue;
            } else {
                // 將任務拆分,拆分成兩個任務
                ForkJoinSubTask subTask1 = new ForkJoinSubTask(startValue, (startValue + endValue) / 2);
                subTask1.fork();
                ForkJoinSubTask subTask2 = new ForkJoinSubTask((startValue + endValue) / 2 + 1 , endValue);
                subTask2.fork();
                return subTask1.join() + subTask2.join();
            }
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // Fork/Join框架的執行緒池
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinTask<Integer> taskFuture =  pool.submit(new ForkJoinSubTask(1,1000));

        Integer result = taskFuture.get();
        System.out.println("累加結果是:" + result);

    }
}

執行結果:

...
執行子任務計算:開始值 = 189;結束值 = 250
執行子任務計算:開始值 = 251;結束值 = 313
執行子任務計算:開始值 = 314;結束值 = 375
執行子任務計算:開始值 = 376;結束值 = 438
執行子任務計算:開始值 = 439;結束值 = 500
執行子任務計算:開始值 = 501;結束值 = 563
執行子任務計算:開始值 = 564;結束值 = 625
執行子任務計算:開始值 = 626;結束值 = 688
執行子任務計算:開始值 = 689;結束值 = 750
執行子任務計算:開始值 = 751;結束值 = 813
執行子任務計算:開始值 = 814;結束值 = 875
執行子任務計算:開始值 = 876;結束值 = 938
執行子任務計算:開始值 = 939;結束值 = 1000
累加結果是:500500

Java 8 新特性

1.lambada表示式

Lambda 允許把函式作為一個方法的引數,傳遞到方法中

語法格式:

(parameters) -> expression 或 (parameters) ->{ statements; }

程式碼示例:

Arrays.asList("jay", "Eason", "SHE").forEach(
       ( String singer ) -> System.out.print( singer + ",") );

2. 函式式介面

Lambda的設計者為了讓現有的功能與Lambda表示式很好相容,設計出函式式介面。

  • 函式式介面是指只有一個函式的介面,可以隱式轉換為lambada表示式。
  • Java 8 提供了註解@FunctionalInterface,顯示宣告一個函式式介面。
  • java.lang.Runnable和java.util.concurrent.Callable是函式式介面的例子~
@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

3. 方法引用

方法引用提供了非常有用的語法,可以直接引用已有Java類或物件(例項)的方法或構造器。它與Lambda表示式配合使用,可以減少冗餘程式碼,使程式碼更加簡潔。

//利用函式式介面Consumer的accept方法實現列印,Lambda表示式如下
Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("jay");
//引用PrintStream類(也就是System.out的型別)的println方法,這就是方法引用
consumer = System.out::println;
consumer.accept("關注公眾號撿田螺的小男孩");

4. 預設方法

預設方法就是一個在接口裡面有了一個實現的方法。它允許將新方法新增到介面,但不強制實現了該介面的類必須實現新的方法。

public interface ISingerService {
    // 預設方法
    default void sing(){
        System.out.println("唱歌");
    }
    void writeSong();
}

//JaySingerServiceImpl 不用強制實現ISingerService的預設sing()方法
public class JaySingerServiceImpl implements ISingerService {
    @Override
    public void writeSong() {
        System.out.println("寫了一首七里香");
    }
}

5.Stream API

Stream API,支援對元素流進行函式式操作,它整合在Collections API 中,可以對集合進行批量操作。常用API:

  • filter 篩選
  • map流對映
  • reduce 將流中的元素組合起來
  • collect 返回集合
  • sorted 排序
  • flatMap 流轉換
  • limit返回指定流個數
  • distinct去除重複元素
public class Singer {

    private String name;
    private Integer songNum;
    private Integer age;
    ...
}

List<Singer> singerList = new ArrayList<Singer>();
singerList.add(new Singer("jay", 11, 36));
singerList.add(new Singer("eason", 8, 31));
singerList.add(new Singer("JJ", 6, 29));

List<String> singerNameList = singerList.stream()
                .filter(singer -> singer.getAge() > 30)  //篩選年齡大於30
                .sorted(Comparator.comparing(Singer::getSongNum))  //根據歌曲數量排序
                .map(Singer::getName)  //提取歌手名字
                .collect(Collectors.toList()); //轉換為List

6. Optional

Java 8引入Optional類,用來解決NullPointerException。Optional代替if...else解決空指標問題,使程式碼更加簡潔。

相關推薦

Java程式設計師必備基礎JDK 5-15哪些經典特性

前言 JDK 15釋出啦~ 我們一起回顧JDK 5-15 的新特性吧,大家一起學習哈~ 本文已經收錄到github ❝ https://github.com/whx123/JavaHome ❞ 「公眾號:撿田螺的小男孩」 Java 5 新特性 1. 泛型 泛型本質是引數化型別,解決不確定具體物件型別的問題

Java程式設計師必備基礎內部類解析

前言 整理了一下內部類的相關知識,算是比較全,比較基礎的,希望大家一起學習進步。 一、什麼是內部類? 在Java中,可以將一個類的定義放在另外一個類的定義內部,這就是內部類。內部類本身就是類的一個屬性,與其他屬性 定義方式一致。 一個內部類的例子: public class Outer { pr

Java程式設計師必備技能程式設計師如何閱讀Java原始碼

對於程式設計師來說,對原始碼真的是有又愛又恨,愛的是原始碼蘊藏的知識太多,學會了對技術的提高大有裨益,恨的是原始碼往往非常難啃,對於初級Java程式設計師來說閱讀原始碼並不是那麼容易。本文小編分享一些閱讀原始碼的技巧和心得,大家有其他的想法也可以一起交流。 正文: 原始碼閱讀,我覺

Java 程式設計師 必備基礎知識 溫故而知

前言正文 自我介紹Java篇計算機網路作業系統資料庫相關XML常識性知識總結 前言 準備了接近兩個月的面試筆試,現在終於是可以休息下了。真真是應了那句老話“臺上一分鐘, 臺下十年功。”。 人嘛,越努力,才會越幸運。機會總是留給有準備的人的。 下面分享一下我

程式設計師必備基礎Git 命令全方位學習

## 前言 掌握Git命令是每位程式設計師必備的基礎,之前一直是用smartGit工具,直到看到大佬們都是在用Git命令操作的,回想一下,發現有些Git命令我都忘記了,於是寫了這篇博文,複習一下~ > https://github.com/whx123/JavaHome **公眾號:撿田螺的小男孩*

程式設計師必備基礎如何安全傳輸儲存使用者密碼?

前言 我們開發網站或者APP的時候,首先要解決的問題,就是「如何安全傳輸和儲存使用者的密碼」。一些大公司的使用者資料庫洩露事件也時有發生,帶來非常大的負面影響。因此,如何安全傳輸儲存使用者密碼,是每位程式設計師必備的基礎。本文將跟大家一起學習,如何安全傳輸儲存使用者的密碼。 公眾號:「撿田螺的小男孩」(一

轉載程式設計師必備基礎

因為和同事有約定再加上LZ自己也喜歡做完一件事之後進行總結,因此有了這篇文章。這篇文章大部分內容都是面向整個程式設計師群體的,當然因為LZ本身是做Java開發的,因此有一部分內容也是專門面向咱們Java程式設計師的。 簡單先說一下,LZ座標杭州,13屆本科畢業,算上年前在阿里巴巴B2B事業部的面

轉發Java程式設計師必備的Intellij外掛

點選File–>Settings–>Plugins–>然後搜尋GsonFormat,點選下載並安裝。自定義個javabean(就是新建一個名字最好帶bean的無內容的class檔案),然後在該檔案處點選–>code–>Generate–>GsonFormat(或者直接按al

Java程式設計師必備異常的十個關鍵知識點

前言 總結了Java異常十個關鍵知識點,面試或者工作中都有用哦,加油。 一. 異常是什麼 異常是指阻止當前方法或作用域繼續執行的問題。比如你讀取的檔案不存在,陣列越界,進行除法時,除數為0等都會導致異常。 一個檔案找不到的異常: public class TestException { public

Java程式設計師必備序列化全方位解析

前言 相信大家日常開發中,經常看到Java物件“implements Serializable”。那麼,它到底有什麼用呢?本文從以下幾個角度來解析序列這一塊知識點~ 什麼是Java序列化? 為什麼需要序列化? 序列化用途 Java序列化常用API 序列化的使用 序列化底層 日常開發序列化的注意點 序列化常見

8年開發java程式設計師教你JAVA開發應該學習什麼?讓你不迷茫

java入門學習有哪些內容?很多想學習java的學生都不知道怎麼學java,特別是沒有基礎的學生,今天8年開發的老程式設計師,給大家整理了一下,java入門學習有哪些內容: 第一階段 計算機基本原理,Java語言發展簡史,Java開發環境的搭建,體驗Java程式的開發,Java語法格式

程式設計師必備知識常見進位制轉換

價值不是你擁有多少,而是你留下多少。                     

Java 程式設計師必備15 個框架

Java 程式設計師方向太多,且不說移動開發、大資料、區塊鏈、人工智慧這些,大部分 Java 程式設計師都是 Java Web/後端開發。那作為一名 Java Web 開發程式設計師必須需要熟悉哪些框架呢? 今天,棧長我給大家列舉了一些通用的、必須掌握的框架,學會這些,20K+ 不是問題。

Java程式設計師必備的Intellij外掛

善用Intellij外掛可大幅提升我們的效率,以下是我用過不錯的Intellij外掛,分享給大家希望能幫到大家。 1. .ignore 生成各種ignore檔案,一鍵建立git ignore檔案的模板,免得自己去寫 截圖:  2. lombok

Java程式設計師必備的11大Intellij外掛

.ignore 生成各種ignore檔案,一鍵建立git ignore檔案的模板,免得自己去寫 如果有想要學習java的小夥伴,可來我們的java學習扣裙哦:72340,3928裡面贈送java系列教學視訊和資料!小編也是從事了6年java開發的全棧

Java程式設計師必備15個框架,學會這些20K+ 不是問題

Java 程式設計師方向太多,且不說移動開發、大資料、區塊鏈、人工智慧這些,大部分 Java 程式設計師都是 Java Web/後端開發。那作為一名 Java Web 開發程式設計師必須需要熟悉哪些框架呢? 今天,給大家列舉了一些通用的、必須掌握的框架,學會這些,20K+ 不是問題。 1.S

Java程式設計師經驗分享如何在面試中介紹自己的專案經驗?

在面試時,經過寒暄後,一般面試官會讓你介紹專案經驗。常見的問法是:“說下你最近的(或最拿得出手的)一個專案”。 可能不少程式設計師對此沒準備,說起來磕磕巴巴,甚至有人說出專案經驗從時間段或技術等方面和簡歷上的不匹配,這樣就會造成如下的後果: 第一印象就不好了,至少會感覺該候選人表述

java程式設計師必備15個框架

Java 程式設計師方向太多,且不說移動開發、大資料、區塊鏈、人工智慧這些,大部分 Java 程式設計師都是 Java Web/後端開發。那作為一名 Java Web 開發程式設計師必須需要熟悉哪些框架呢? 今天,我給大家列舉了一些通用的、必須掌握的框架,學會這些, 不是問題。 1.

JAVA程式設計師的墮落只知框架不懂底層原理

我曾在多個場合撰文說過,現在培訓出來的企業Java開發兵團只知道使用某種框架,但完全不知道這些框架的底層原理。今天早上,在依次對三個職位的應聘者面試中,我又再次見到了這種情形。   我們的顧問公司收到了一個客戶的招聘需求,要一個經驗豐富並通曉SQL的Java開發人員。我

Java 11 特性,Java程式設計師必備

Java JDK 11已經於 2018年9月25日正式釋出,那麼Java 11主要包含哪些新特性呢?JDK 11是Java SE 11平臺版本11的開源參考實現,由JSR 384在Java Community Process中指定。該版本的功能和時間表是通過JEP流程提出和跟蹤的,並由JEP 2.0提案進行了