面試總結

1.arrayList底層實現、linkedList的底層實現、hashmap的底層實現 
ArrayList底層是數組css

public static void main(String[] args) { List list=new ArrayList(); list.add("王利虎"); list.add("張三"); list.add("李四"); int size=list.size(); String[] array=new String[size]; for(int i=0;i<list.size();i++){ array[i]=(String)list.get(i); } for(int i=0;i<array.length;i++){ System.out.println(array[i]); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

linkedList底層是鏈表java

private static class Node<E> {     //業務數據 E item;     //指向下個node Node<E> next;     //指向上個node Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

hashmap底層是數組+鏈表node

import Collection.TestLinkedList;

/* * 自定義實現Map功能(底層:數組+鏈表) * Map:存放鍵值對,根據鍵找值 * 目的僅爲更加了解該結構、編碼部分不考慮細節 * 注意註釋部分 * */ class Entry<K, V> { K Key; V Value; public Entry(K key, V value) { super(); Key = key; Value = value; } } public class RealizeMap<K, V, E> { @SuppressWarnings("unchecked") TestLinkedList<Entry<K, V>> arr[] = new TestLinkedList[165]; int size; RealizeMap() { size = 0; } public void put(K key, V value) { // 注意不能漏了->處理鍵值覆蓋 Entry<K, V> e = new Entry<>(key, value); int hash = key.hashCode() % 165; if (arr[hash] == null) { TestLinkedList<Entry<K, V>> list = new TestLinkedList<>(); arr[hash] = list; list.addLast(e); }else { for(int i=0;i<arr[hash].size;i++) { Entry<K, V> E = arr[hash].get(i);//因爲E在此取義爲該鏈表鍵對應節點的地址,因此直接改E便可覆蓋之 if(E.Key.equals(key)) { E.Value = value; return; } } arr[hash].addLast(e); } } public V get(K key) { int hash = key.hashCode(); if (arr[hash] != null) { for (int i = 0; i < arr[hash].size; i++) { if (arr[hash].get(i).Key.equals(key)) return arr[hash].get(i).Value; } } return null; } public static void main(String[] args) { RealizeMap<String, String, Entry<String, String>> map = new RealizeMap<>(); map.put("1", "張三"); map.put("2", "李四"); map.put("2", "黎明"); map.put("3", "王五"); map.put("4", "馬六"); System.out.println(map.get("2")); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

2.描述線程池搭建mysql

2.1利用java.util.concurrent包提供了現成的線程池實現ThreadPoolExecutorjquery

2.2Spring中的線程池是由ThreadPoolTaskExecutor類來實現的。該類的實現原理最終也是調 
用了java中的ThreadPoolExecutor類中的一些方法。具體的實現讀者能夠本身去翻閱 
Spring的源碼,這裏筆者就不羅列了。咱們看下ThreadPoolTaskExecutor的初始化。 
ThreadPoolTaskExecutor有兩種經常使用的有兩種初始化方式:xml配置,java代碼初始化 
xml配置:web

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="keepAliveSeconds" value="200" /> <property name="maxPoolSize" value="10" /> <property name="queueCapacity" value="20" /> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

看過上面的內容,讀者應該很清楚上面的一些參數表明的意思了吧。筆ajax

public MyThreadPoolTaskExecutor { @Autowired private ThreadPoolTaskExecutor taskExecutor;  private void test(){   taskExecutor.execute(new Runnable(){     @Override     public void run() {      //執行的代碼     }});   } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Java代碼初始化:spring

private void test2(){   ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();   executor.setCorePoolSize(10);   executor.setMaxPoolSize(15);   executor.setKeepAliveSeconds(1);   executor.setQueueCapacity(5);   executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());   executor.initialize();   executor.execute(new Runnable(){     @Override     public void run() {       //執行的代碼     }   }); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.get與post的區別sql

3.1GET後退按鈕/刷新無害,POST數據會被從新提交(瀏覽器應該告知用戶數據會被從新提交)。 
3.2GET書籤可收藏,POST爲書籤不可收藏。GET能被緩存,POST不能緩存 。GET編碼類型application/x-www-form-url,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。 
3.3GET歷史參數保留在瀏覽器歷史中。POST參數不會保存在瀏覽器歷史中。GET對數據長度有限制,當發送數據時GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)。 
3.4POST無限制。GET只容許 ASCII 字符。POST沒有限制。也容許二進制數據。 
3.5POST 相比,GET 的安全性較差。數據庫

4.ajax同步異步的關鍵字 
jquery的async:false,這個屬性 
默認是true:異步,false:同步 
5.xml的頭有什麼做用 
ML文檔必須以<?xml version="1.0"?>開頭,不然XML解析器將沒法識別該XML文檔 
xml做用是用來spring xml配置 
6.線程安全 
ArrayList、Vector 
synchronized、volition 、lock 互斥鎖 
8.建立線程幾種方式

1、繼承Thread類建立線程類
(1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就表明了線程要完
成的任務。所以把run()方法稱爲執行體。 (2)建立Thread子類的實例,即建立了線程對象。 (3)調用線程對象的start()方法來啓動該 2、經過Runnable接口建立線程類 (1)定義runnable接口的實現類,並重寫該接口的run()方法,該run()方法的方法體一樣 是該線程的線程執行體。 (2)建立 Runnable實現類的實例,並依此實例做爲Thread的target來建立Thread對象, 該Thread對象纔是真正的線程對象。 (3)調用線程對象的start()方法來啓動該線程。 3、經過Callable和Future建立線程 (1)建立Callable接口的實現類,並實現call()方法,該call()方法將做爲線程執行體, 而且有返回值。 (2)建立Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask 對象封裝了該Callable對象的call()方法的返回值。 (3)使用FutureTask對象做爲Thread對象的target建立並啓動新線程。 (4)調用FutureTask對象的get()方法來得到子線程執行結束後的返回值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

9.mybatis的流程 
1.建立數據庫 
2.配置mybatis配置文件xml 
3.建立model實體類以及mapper的xml 
4.建立回話工廠與sqlsession回話 
5.建立service與實現service接口的實現類 
調用sql語句進行映射對象、經過對象傳參進行。 
或者數據或者對數據庫進行增刪改查。 
10.主從數據庫的搭建敘述 
1.保證數據版本同樣 
其中核心就是BINLOG須要開啓 並設置serverID的值 
而後用cp命令將主數據庫複製到從數據庫、接着修改從數據庫的my.cof增長serverID 制定 
複製用戶 主數據庫服務器id 短褲 用戶名 密碼 
啓動進行驗證 show salve status驗證 
進行更新等操做驗證數據庫。 
11.單例模式 深層 
懶漢

比較懶、在類加載時、不建立實例、所以類加載速度快、可是運行時獲取對象的速度慢 
餓漢 
在類加載時就完成來了初始化、因此類加載較慢、但獲取對象的速度快 
內部靜態類 枚舉 雙重校驗鎖 
若是線程安全選擇 雙重校驗鎖 
類加載機制 
java虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗、轉換解析和初始 
化,最終造成能夠被虛擬機直接使用的Java類型,這就是虛擬機的加載機制

12.rabbitMQ的實現原理與過程 消息隊列 生產者 mq至關於一個倉庫 消費者 先導入jar包、rabbitmq相關依賴、序列化相關依賴 建立鏈接到rabbitmq 設置主機名 建立一個鏈接 建立一個頻道 一個隊列 13.數據庫函數 BEGIN 寫SQL語句 END 14.gradle與maven區別 maven使用者轉投gradle的懷抱,和Gradle相比,ant顯得冗餘複雜,maven顯得有些死板落 後,而gradle基於DSL語法,特色明顯:簡潔、靈活、可讀性強。 16.mysql limit 從0開始的n 17.spring mvc與spring boot的區別 Spring Boot實現了自動配置,下降了項目搭建的複雜度 Spring MVC提供了一種輕度耦合的方式來開發web應用、Spring MVC是Spring的一個模塊, 式一個web框架。經過Dispatcher Servlet, ModelAndView 和 View Resolver,開發web應 用變得很容易。解決的問題領域是網站應用程序或者服務開發——URL路由、Session、模 板引擎、靜態Web資源等等 Spring 是一個「引擎」; Spring MVC 是基於Spring的一個 MVC 框架 ; Spring Boot 是基於Spring4的條件註冊的一套快速開發整合包; 18.liunx 操做 ls cd mkdir cp rm locate q!回車 vim

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息