總結---持更

myjfhtml

1.自動化用例如何保持穩定性java

https://www.jianshu.com/p/78163813f7a6node

https://blog.csdn.net/wanglha/article/category/3069295python

    1、裝飾器與出錯重試機制保證穩定性

  2、測試用例分層機制保證可維護性

  三,等待mysql

              1.直接sleeplinux

      2.使用selenium webdriver提供的等待方法nginx

                 driver.manage().timeouts().implicitlyWait(10,TimeUnit.Seconds);程序員

             3.使用webDriver提供的wait<T>接口web

                  

FluentWait<T> implements Wait<T> redis


Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);

WebElement element = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("element"));
}
});
element.click();//something to do

此方法用於等待一個元素在頁面上出現,超時時間爲30S,每隔5S去請求一次,而且忽略掉until中拋出的NoSuchElementException

       單個校驗每一個元素,或者每一個頁面,減小依賴

2.jsf給予dubbo作的封裝

3.hashmap在併發下是線程安全的嗎

  不是,hashtable是線程安全的

4.數據庫主鍵

   

1.什麼是主鍵

  表中的每一行都應該具備能夠惟一標識本身的一列(或一組列)。而這個承擔標識做用的列稱爲主鍵
  若是沒有主鍵,數據的管理將會十分混亂。好比會存在多條如出一轍的記錄,刪除和修改特定行十分困難。

2.那些列能夠做爲主鍵:

  任何列均可以做爲主鍵,只要它知足如下條件:

    • 任何兩行都不具備相同的主鍵值。就是說這列的值都是互不相同的。
    • 每一個行都必須具備一個主鍵值。主鍵列不容許設置爲NULL。
    • 主鍵列的值不建議進行修改和更新

5.設計接口測試用例,如何驗證結果

6.對項目進度的把控

7.手工測試和自動化測試如何平衡

8.代碼覆蓋率

  jacoco,emma,cobertura,clover

9.自動化用例作沒作過多線程

10.jvm內存分區,gc

  程序計數器 JVM支持多個線程同時運行,當每個新線程被建立時,它都將獲得它本身的pc寄存器(程序計數器)。

  java棧(自動分配連續的空間,後進先出) 存放:局部變量

  Java堆(不連續) 存放:new出的對象

  方法區(也是堆)存放:類的信息(代碼),static變量,常量池(字符串常量)等

  本地方法棧:主要存放native的方法

  gc(垃圾回收機制):

    1.對象空間的分配:使用new關鍵字建立對象便可

  2.對象空間的釋放:將對象賦值null便可。垃圾回收器將負責回收全部「不可達」對象的內存空間

      要點:程序員無權調用垃圾回收器

               程序員能夠經過system.gc(),經過gc運行,可是java規範並不能保證當即運行

               finalize方法,是java提供給程序員用來釋放對象或資源的方法,但儘可能少用。

      垃圾回收是編程時不須要考慮內存管理,能夠有效的方式內存泄漏,有效的使用能夠使用的內存。

      垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收。

      回收機制:Mark-Sweep(標記-清除)算法,Copying(複製)算法,Mark-Compact(標記-整理)算法,Generational Collection(分代收集)算法

11.a,b兩個方法,a方法調用b的方法,b的註解沒有生效的緣由是什麼?

  使用Spring Aop註解的時候,如@Transactional, @Cacheable等註解通常須要在類方法第一個入口的地方加,否則不會生效。

  https://segmentfault.com/a/1190000014346303?utm_source=tag-newest

     b方法是在a內部調用的,調用a方法是,spring內部實際上是代理類proxy的invoke,這個時候已經再也不代理對象中操做了,因爲b方法是在a方法內部調用的,因此這裏實際調用的是method的真實對象,並非代理對象,因此致使b的緩存註解沒有生效。

  https://blog.csdn.net/ZL_LSY/article/details/86542481

@Transactional 加於private方法, 無效
@Transactional 加於未加入接口的public方法, 再經過普通接口方法調用, 無效
@Transactional 加於接口方法, 不管下面調用的是private或public方法, 都有效
@Transactional 加於接口方法後, 被本類普通接口方法直接調用, 無效
@Transactional 加於接口方法後, 被本類普通接口方法經過接口調用, 有效
@Transactional 加於接口方法後, 被它類的接口方法調用, 有效
@Transactional 加於接口方法後, 被它類的私有方法調用後, 有效

12.hashmap是無序的,怎麼校驗結果的正確性?

    linkedHashMap是有序的

13.契約測試

契約測試也叫消費者驅動測試。
兩個角色:消費者(Consumer)和 生產者(Provider)
一個思想:需求驅動(消費者驅動)
契約文件:由Consumer端和Provider端共同定義的規範,包含API路徑,輸入,輸出。一般由Consumber生成。
實現原理:Consumer 端提供一個相似「契約」的東西(如json 文件,約定好request和response)交給Provider 端,告訴Provider 有什麼需求,而後Provider 根據這份「契約」去實現。

14.jmeter併發,測試數據準備,測試數據清除

15.mysql鎖

http://www.javashuo.com/article/p-fqrzmnlo-kv.html

鎖是計算機協調多個進程或線程併發訪問某一資源的機制。

  相對其餘數據庫而言,MySQL的鎖機制比較簡單,其最顯著的特色是不一樣的存儲引擎支持不一樣的鎖機制。好比,

MyISAM和MEMORY存儲引擎採用的是表級鎖(table-level locking)。
InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認狀況下是採用行級鎖。

  • 表級鎖:每次操做鎖住整張表。開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低;
  • 行級鎖:每次操做鎖住一行數據。開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高;
  • 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常。

 

16.mysql索引

mysql的索引分爲單列索引(主鍵索引,惟索引,普通索引)和組合索引.

單列索引:一個索引只包含一個列,一個表能夠有多個單列索引.

組合索引:一個組合索引包含兩個或兩個以上的列,

1.單列索引

1-1)    普通索引,這個是最基本的索引,

其sql格式是 CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 或者 ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

第一種方式 :

  CREATE INDEX account_Index ON `award`(`account`);

第二種方式: 

ALTER TABLE award ADD INDEX account_Index(`account`)

1-2)    惟一索引,與普通索引相似,可是不一樣的是惟一索引要求全部的類的值是惟一的,這一點和主鍵索引同樣.可是他容許有空值,

其sql格式是 CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length)); 或者 ALTER TABLE TableName ADD UNIQUE (column_list)  

CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(`account`);

1-3)    主鍵索引,不容許有空值,(在B+TREE中的InnoDB引擎中,主鍵索引發到了相當重要的地位)

主鍵索引創建的規則是 int優於varchar,通常在建表的時候建立,最好是與表的其餘字段不相關的列或者是業務不相關的列.通常會設爲 int 並且是 AUTO_INCREMENT自增類型的

2.組合索引

一個表中含有多個單列索引不表明是組合索引,通俗一點講 組合索引是:包含多個字段可是隻有索引名稱

其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

 CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

(3)全文索引

文本字段上(text)若是創建的是普通索引,那麼只有對文本的字段內容前面的字符進行索引,其字符大小根據索引創建索引時申明的大小來規定.

若是文本中出現多個同樣的字符,並且須要查找的話,那麼其條件只能是 where column lick '%xxxx%' 這樣作會讓索引失效

.這個時候全文索引就祈禱了做用了

ALTER TABLE tablename ADD FULLTEXT(column1, column2)

有了全文索引,就能夠用SELECT查詢命令去檢索那些包含着一個或多個給定單詞的數據記錄了。

ELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘xxx′, ‘sss′, ‘ddd′)

這條命令將把column1和column2字段裏有xxx、sss和ddd的數據記錄所有查詢出來。

(二)索引的刪除

刪除索引的mysql格式 :DORP INDEX IndexName ON `TableName`

17.spring ioc/aop

18.java內存

19.數組和鏈表有什麼區別

   數組是將元素在內存中連續存放,因爲每一個元素佔用內存相同,能夠經過下標迅速訪問數組中任何元素。可是若是要在數組中增長一個元素,須要移動大量元素,在內存中空出一個元素的空間,而後將要增長的元素放在其中。一樣的道理,若是想刪除一個元素,一樣須要移動大量元素去填掉被移動的元素。若是應用須要快速訪問數據,不多插入和刪除元素,就應該用數組。

   鏈表中的元素在內存中不是順序存儲的,而是經過存在元素中的指針聯繫到一塊兒,每一個結點包括兩個部分:一個是存儲數據元素 的數據域,另外一個是存儲下一個結點地址的 指針。若是要訪問鏈表中一個元素,須要從第一個元素始,一直找到須要的元素位置。可是增長和刪除一個元素對於鏈表數據結構就很是簡單了,只要修改元素中的指針就能夠了。若是應用須要常常插入和刪除元素你就須要用鏈表 

區別:

(1)存儲位置上:

數組邏輯上相鄰的元素在物理存儲位置上也相鄰,而鏈表不必定;

(2)存儲空間上:

鏈表存放的內存空間能夠是連續的,也能夠是不連續的,數組則是連續的一段內存空間。通常狀況下存放相同多的數據數組佔用較小的內存,而鏈表還須要存放其前驅和後繼的空間。

(3)長度的可變性:

鏈表的長度是按實際須要能夠伸縮的,而數組的長度是在定義時要給定的,若是存放的數據個數超過了數組的初始大小,則會出現溢出現象。

(4)按序號查找時,數組能夠隨機訪問,時間複雜度爲O(1),而鏈表不支持隨機訪問,平均須要O(n); 

(5)按值查找時,若數組無序,數組和鏈表時間複雜度均爲O(1),可是當數組有序時,能夠採用折半查找將時間複雜度降爲O(logn); 

(6)插入和刪除時,數組平均須要移動n/2個元素,而鏈表只需修改指針便可; 

(7)空間分配方面:

數組在靜態存儲分配情形下,存儲元素數量受限制,動態存儲分配情形下,雖然存儲空間能夠擴充,但須要移動大量元素,致使操做效率下降,並且若是內存中沒有更大塊連續存儲空間將致使分配失敗; 即數組從棧中分配空間,,對於程序員方便快速,但自由度小。鏈表存儲的節點空間只在須要的時候申請分配,只要內存中有空間就能夠分配,操做比較靈活高效;即鏈表從堆中分配空間, 自由度大但申請管理比較麻煩。

20.selenium框架封裝

21.性能測試

22.灰度測試

23.業務開關

 

aiqiyi

1.數組從高到低排序,去重

2.sql多表查詢

3.selenium

4.單元測試,sonar發現什麼問題

 

zhihu

1.數組,求字符串最長前綴

2.開發框架

 

sogou

1.給定機器數量,怎麼計算出瓶頸

2.給一段代碼,找錯誤

3,迴文字符串

4.http接口 用代碼實現請求 處理返回值

http://www.javashuo.com/article/p-ymiseazx-hs.html

5.設計測試用例

6.nginx停啓命令

      查看進程號,ps -ef | grep nginx

      殺死進程 kill -QUIT 2202 從容中止nginx

                   kill -TERM 2202 快速中止nginx

      pkill -9 nginx  強制中止nginx

    啓動 nginx -c /usr/local/nginx/conf/nginx.conf

7.按端口號殺死進程

    ps -ef | grep 進程名

    kill -9 進程id

8.用例設計

9.性格分析

10.線段有n個點,起始點s,終點t,遍歷點,從s到t,每一個點訪問一次,能夠實現跳躍到1節點或者尾節點,問最少跳躍幾回能夠實現遍歷?

11.string+拼接問題,stringBuffer ,stringBuilder區別

string 字符串常量 string是不可變的對象,常用對系統性能有影響  適用於少許字符串操做狀況

stringBuffer 字符串變量(線程安全)  適用於單線程下在字符緩衝區進行大量操做的狀況

stringBuilder 字符串變量(非線程安全)   適用於多線程下大量字符緩衝區進行大量操做的狀況

運行速度:stringBuilder>stringBuffer>string

12.cookie session

cookie 和session 的區別:

一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙
   考慮到安全應當使用session。

三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
   考慮到減輕服務器性能方面,應當使用COOKIE。

四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。

五、因此我的建議:
   將登錄信息等重要信息存放爲SESSION
   其餘信息若是須要保留,能夠放在COOKIE中

.cookie/session的區別與聯繫
區別:

1.cookie存放在客戶端,session存放在服務器端。

2.cookie只能存放4k的數據,而session理論上沒有作限制

聯繫:

session雖然說存放在服務器端,可是仔細看剛纔的執行流程你會明白,session是依賴於cookie的

 

其餘:

1.兩個int變量不用第三個變量的狀況下,怎麼作數據交換

  int a,b;

  a = a+b;

  b = a-b;

  a = a-b;

 

yuanfudao

1.字符串,橫版改爲豎版輸出

2.括號匹配

3.鏈表刪除奇樹節點

4.gc

5.項目中印象深的點

6.linux 命令

查詢字符串重複次數

grep -o objstr filename | wc -l

grep -o 'objstr1 |\| objstr2' filename | wc -l

awk '{s+=gsub(/targetStr/,"女")}END{print s}' filename

 

yingshidaquan227

1.設計模式

單例模式

2.編寫用例

3.spring mvc路由

4.網絡協議

 

baidu

1.快排

2.1000萬條信息,查找重複最多的前四條

  

方法1:能夠用哈希表的方法對1千萬條分紅若干組進行邊掃描邊建散列表。第一次掃描,取首字節,尾字節,中間隨便兩字節做爲Hash Code,插入到hash table中。並記錄其地址和信息長度和重複次數,1千萬條信息,記錄這幾個信息還放得下。同Hash Code且等長就疑似相同,比較一下。相同記錄只加1次進hash table,但將重複次數加1。一次掃描之後,已經記錄各自的重複次數,進行第二次hash table的處理。用線性時間選擇可在O(n)的級別上完成前10條的尋找。分組後每份中的top10必須保證各不相同,可hash來保證,也可直接按hash值的大小來分類。

 

方法2:能夠採用從小到大排序的方法,根據經驗,除非是羣發的過節短信,不然字數越少的短信出現重複的概率越高。建議從字數少的短信開始找起,好比一開始搜一個字的短信,找出重複出現的top10並分別記錄出現次數,而後搜兩個字的,依次類推。對於對相同字數的比較常的短信的搜索,除了hash之類的算法外,能夠選擇只抽取頭、中和尾等幾個位置的字符進行粗判,由於此種判斷方式是爲了加快查找速度但未能獲得真正指望的top10,所以須要作標記;如此搜索一遍後,能夠從各次top10結果中找到備選的top10,若是這top10中有剛纔作過標記的,則對其對應字數的全部短信進行精確搜索以找到真正的top10並再次比較。

方法3:能夠採用內存映射的辦法,首先1千萬條短信按如今的短信長度將不會超過1G空間,使用內存映射文件比較合適。能夠一次映射(固然若是更大的數據量的話,能夠採用分段映射),因爲不須要頻繁使用文件I/O和頻繁分配小內存,這將大大提升數據的加載速度。其次,對每條短信的第i(i從0到70)個字母按ASCII嘛進行分組,其實也就是建立樹。i是樹的深度,也是短信第i個字母。

    該問題主要是解決兩方面的內容,一是內容加載,二是短信內容比較。採用文件內存映射技術能夠解決內容加載的性能問題(不只僅不須要調用文件I/O函數,並且也不須要每讀出一條短信都分配一小塊內存),而使用樹技術能夠有效減小比較的次數。

https://blog.csdn.net/u010601183/article/details/56481868/

3.自動化

 

yiqijiaoyu

1.ui框架了解多少?

2.接口測試怎麼作的

3.短信驗證碼一小時失效,緩存,編寫測試用例

4.post接口,編寫接口測試用例

5.冒泡排序

6.開發測試工做佔比,人數佔比

7.你以爲什麼工做是真正提效的?

 

58jinrong

1.list查a字符的數

2.hashmap遍歷

public static void main(String[] args){
Map<String,String> map = new HashMap<String, String>();
map.put("1","a");
map.put("2","b");
map.put("3","c");

//最簡潔,最通用的遍歷方式
for (Map.Entry<String,String> entry : map.entrySet()){
System.out.println("key: " + entry.getKey() + "value: " + entry.getValue());
}
}

3.mapper動態 若是a ,b不爲空查對應,若是a,b爲空查全部

<select id="selectResult"> resultMap="testMap">

  select * from table

  where

  <if a != null and b != null>

    a=#{a} AND b=#{b}

  </if>

</select>

4.提供了一個http接口

5.ui作到什麼程度,寫了多少條用例,有拖拽和滾動嗎,有h5頁面嗎

6.接口寫了多少用例

7.客戶端有接觸嗎

8.post接口怎麼測

9.跨域怎麼實現

 

meiriyouxian

1.string stringBuffer stringBuilder 區別,具體拼接怎麼作

2.string,求每一個字符重複的次數,返貨top3

3.單例模式有幾種寫法,哪一種是線程安全的,哪一種是線程不安全的 

懶漢 線程不安全 餓漢 線程安全

4.new的時候是調了類的什麼方法? 構造器方法

5.做用域及其範圍

6.testNG before test ,before class,before method區別

   junit before做用範圍

@BeforeSuite:註解的方法,將會在testng定義的xml根元素裏面的全部執行以前運行

@BeforeClass:註解的方法將會在當前測試類的第一個測試方法執行以前運行。

@BeforeTest:註解的方法將會在一個元素定義的全部裏面全部測試方法執行以前運行。

@BeforeMethod:註解的方法將每一個測試方法以前運行。

junit:

  • @Before – 表示在任意使用@Test註解標註的public void方法執行以前執行
  • @BeforeClass – 表示在類中的任意public static void方法執行以前執行
  • @Test – 使用該註解標註的public void方法會表示爲一個測試方法

7.spring aop

8.過濾器和攔截器順序

一、過濾器(Filter)

首先說一下Filter的使用地方,咱們在配置web.xml時,總會配置下面一段設置字符編碼,否則會致使亂碼問題:

1)過濾器(Filter):它依賴於servlet容器。在實現上,基於函數回調,它能夠對幾乎全部請求進行過濾,可是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的,是用來作一些過濾操做,獲取咱們想要獲取的數據,好比:在Javaweb中,對傳入的request、response提早過濾掉一些信息,或者提早設置一些參數,而後再傳入servlet或者Controller進行業務邏輯操做。一般用的場景是:在過濾器中修改字符編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些參數(XSSFilter(自定義過濾器)),如:過濾低俗文字、危險字符等。

二、攔截器(Interceptor)

攔截器的配置通常在SpringMVC的配置文件中,使用Interceptors標籤,具體配置以下:

(2)攔截器(Interceptor):它依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上,基於Java的反射機制,屬於面向切面編程(AOP)的一種運用,就是在service或者一個方法前,調用一個方法,或者在方法後,調用一個方法,好比動態代理就是攔截器的簡單實現,在調用方法前打印出字符串(或者作其它業務邏輯的操做),也能夠在調用方法後打印出字符串,甚至在拋出異常的時候作業務邏輯的操做。因爲攔截器是基於web框架的調用,所以能夠使用Spring的依賴注入(DI)進行一些業務操做,同時一個攔截器實例在一個controller生命週期以內能夠屢次調用。可是缺點是隻能對controller請求進行攔截,對其餘的一些好比直接訪問靜態資源的請求則沒辦法進行攔截處理。
(1)、Filter須要在web.xml中配置,依賴於Servlet;
(2)、Interceptor須要在SpringMVC中配置,依賴於框架;
(3)、Filter的執行順序在Interceptor以前,具體的流程見下圖

攔截器與過濾器的區別:
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求起做用。
攔截器能夠訪問action上下文、值棧裏的對象,而過濾器不能訪問。
在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次

執行順序:過濾前 – 攔截前 – Action處理 – 攔截後 – 過濾後。我的認爲過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登陸用戶不能訪問內部頁面的處理);過濾經過後,攔截器將檢查用戶提交數據的驗證,作一些前期的數據處理,接着把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還能夠作其餘過程(還沒想到要作啥),再向上返回到過濾器的後續操做。

9.接口能繼承類和抽象類嗎,抽象類能繼承類嗎

接口不能繼承類 ,接口能夠繼承多個接口,類能夠實現接口

抽象類能夠繼承實體類,抽象類能夠實現接口

10.mock怎麼作的

 

2.27 kuaishou

1.編程題:兩個已排序的數組合並並排序

2.編程題:判斷兩個app版本哪一個比較大

3.java四大特性

封裝:

  屬性可用來描述同一類事物的特徵,方法可描述一類事物可作的操做。封裝就是把屬於同一類事物的共性(包括屬性與方法)歸到一個類中,以方便使用

概念:

  封裝也稱爲信息隱藏,是指利用抽象數據類型將數據和基於數據的操做封裝在一塊兒,使其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內部,儘量地隱藏內部的細節,只保留一些對外接口使之與外部發生聯繫。系統的其餘部分只有經過包裹在數據外面的被受權的操做來與這個抽象數據類型交流與交互。也就是說,用戶無需知道對象內部方法的實現細節,但能夠根據對象提供的外部接口(對象名和參數)訪問該對象。

好處:

  (1)實現了專業的分工。將能實現某一特定功能的代碼封裝成一個獨立的實體後,各程序員能夠在須要的時候調用,從而實現了專業的分工。

  (2)隱藏信息,實現細節。經過控制訪問權限能夠將能夠將不想讓客戶端程序員看到的信息隱藏起來,如某客戶的銀行的密碼須要保密,只能對該客戶開發權限。

繼承:

  個性對共性的屬性與方法的接受,並加入個性特有的屬性與方法

  繼承後子類自動擁有了父類的屬性和方法,但特別注意的是,父類的私有屬性和構造方法並不能被繼承。

  另外子類能夠寫本身特有的屬性和方法,目的是實現功能的擴展,子類也能夠複寫父類的方法即方法的重寫。實際就是多態性

概念:

  一個類繼承另外一個類,則稱繼承的類爲子類,被繼承的類爲父類。

  子類與父類的關係並非平常生活中的父子關係,子類與父類而是一種特殊化與通常化的關係,是is-a的關係,子類是父類更加詳細的分類。如class dog extends animal,就能夠理解爲dog is a animal.注意設計繼承的時候,若要讓某個類能繼承,父類需適當開放訪問權限,遵循里氏代換原則,即向修改關閉對擴展開放,也就是開-閉原則。

好處:

  實現代碼的複用。

什麼是多態

  1. 面向對象的三大特性:封裝、繼承、多態。從必定角度來看,封裝和繼承幾乎都是爲多態而準備的。這是咱們最後一個概念,也是最重要的知識點。
  2. 多態的定義:指容許不一樣類的對象對同一消息作出響應。即同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式。(發送消息就是函數調用)
  3. 實現多態的技術稱爲:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
  4. 多態的做用:消除類型之間的耦合關係
  5. 現實中,關於多態的例子不勝枚舉。比方說按下 F1 鍵這個動做,若是當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;若是當前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發生在不一樣的對象上會產生不一樣的結果。

下面是多態存在的三個必要條件,要求你們作夢時都能背出來!

多態存在的三個必要條件
1、要有繼承;
2、要有重寫;
3、父類引用指向子類對象。

 多態的好處:

1.可替換性(substitutability)。多態對已存在代碼具備可替換性。例如,多態對圓Circle類工做,對其餘任何圓形幾何體,如圓環,也一樣工做。
2.可擴充性(extensibility)。多態對代碼具備可擴充性。增長新的子類不影響已存在類的多態性、繼承性,以及其餘特性的運行和操做。實際上新加子類更容易得到多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類經過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere爲了實現多態,完善或者覆蓋這兩個接口方法。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操做,提升了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤爲在處理大量對象的運算和操做時,這個特色尤其突出和重要。

Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

4.arraylist和linkedlist區別

ArrayList和LinkedList的大體區別:

1.ArrayList是實現了基於動態數組的數據結構,LinkedList是基於鏈表結構。
2.對於隨機訪問的get和set方法,ArrayList要優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinkedList比較佔優點,由於ArrayList要移動數據。
他們在性能上的有缺點:

1.對ArrayList和LinkedList而言,在列表末尾增長一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部數組中增長一項,指向所添加的元素,偶爾可能會致使對數組從新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry對象。
2.在ArrayList集合中添加或者刪除一個元素時,當前的列表所全部的元素都會被移動。而LinkedList集合中添加或者刪除一個元素的開銷是固定的。
3.LinkedList集合不支持 高效的隨機隨機訪問(RandomAccess),由於可能產生二次項的行爲。
4.ArrayList的空間浪費主要體如今在list列表的結尾預留必定的容量空間,而LinkedList的空間花費則體如今它的每個元素都須要消耗至關的空間
因此在咱們進行對元素的增刪查操做的時候,進行 查操做時用ArrayList,進行增刪操做的時候最好用LinkedList。

5.selenium特性,selenium grid

Selenium特色:

對web 頁面有良好的支持 
簡單(API 簡單)、靈活(用開發語言驅動) 
支持分佈式測試用例執行

  1. 開源軟件:源代碼開放能夠根據須要來增長工具的某些功能
  2. 跨平臺:Linux,windows,mac
  3. 核心功能:就是能夠在多個瀏覽器上進行自動化測試
  4. 多語言:java、python、c#、JS、ruby等
  5. 成熟穩定:目前已經被google、百度、騰訊等公司普遍使用
  6. 功能強大:可以實現相似商業工具的大部分功能,由於開原性,可實現定製化功能

一,selenium grid是什麼?

selenium是一個用於UI自動化測試的工具。

selenium grid是selenium家族中的三大組件的一員。selenium grid有兩個版本,grid1和grid2,。目前grid1已經基本被廢棄了。grid2的出版要晚於selenium2,因此grid2支持selenium2的全部的功能。

2、爲何要用grid?

1,當咱們在selenium webdriver中寫好了各類腳本時,咱們可能須要在不一樣的系統裏,不一樣的瀏覽器下去運行。

2,咱們的一個系統,可能有上萬條用例須要執行。咱們又不但願用例在迴歸時一條一條被執行,而是但願可以節省時間的批量執行用例。

基於以上兩點,咱們須要這個強大的組件grid。

3、grid能夠作些什麼?

1,selenium grid不是用來寫腳本代碼的,只負責運行。因此咱們的腳本仍是須要利用webdriver,在咱們的開發環境中去寫好。

2,selenium grid給咱們提供了兩個東西。一個叫hub,一個叫node。

3,hub被稱爲總控節點。他是你加載全部的測試機器,一個grid裏面只有一個hub。打個比方:hub就像咱們的交換機,他負責接通網線,把網絡分發給後面的各類設備,無論咱們是用手機上網,仍是電腦上網,都是連着咱們的交換機。grid中的hub,總管着的是腳本代碼。

4,node稱之爲節點。他就比如咱們的鏈接網絡的各個終端設備,好比電腦,好比手機,iPad之類等等。因此grid中,能夠有不少個node,node用於接收代碼,且在不一樣的瀏覽器中運行代碼。

 

6.jmeter特性

 

利用Jmeter作功能測試有如下優勢:

Ø         不依賴於界面,若是服務正常啓動,傳遞參數明確就能夠添加測試用例,執行測試

Ø         測試腳本不須要編程,熟悉http請求,熟悉業務流程,就能夠根據頁面中input對象來編寫測試用例。

Ø         測試腳本維護方便,能夠將測試腳本複製,而且能夠將某一部分單獨保存。

Ø         能夠跳過頁面限制,向後臺程序添加非法數據,這樣能夠測試後臺程序的健壯性。

Ø         利用badboy錄製測試腳本,能夠快速的造成測試腳本

Ø         Jmeter斷言能夠驗證代碼中是否有須要獲得的值

Ø         使用參數化以及Jmeter提供的函數功能,能夠快速完成測試數據的添加修改等

利用Jmeter作功能測試有如下缺點:

Ø         使用Jmeter沒法驗證JS程序,也沒法驗證頁面,因此須要手工去驗證。

Ø         Jmeter的斷言功能不是很強大

Ø         就算是jmeter腳本順利執行,依舊沒法肯定程序是否正確執行,有時候須要進入程序查看,或者查看Jmeter的響應數據。

Ø         Jmeter腳本的維護須要保存爲本地文件,而每一個腳本文件只能保存一個測試用例,不利於腳本的維護。

 

360hr電面:

1.get和post區別

比較 GET 與 POST

下面的表格比較了兩種 HTTP 方法:GET 和 POST。

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

與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。

在發送密碼或其餘敏感信息時毫不要使用 GET !

POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。
可見性 數據在 URL 中對全部人都是可見的。 數據不會顯示在 URL 中。

2.數據庫索引

3.session和cookie區別

存儲數據量方面:session 可以存儲任意的 java 對象,cookie 只能存儲 String 類型的對象
一個在客戶端一個在服務端。因Cookie在客戶端因此能夠編輯僞造,不是十分安全。
Session過多時會消耗服務器資源,大型網站會有專門Session服務器,Cookie存在客戶端沒問題。
域的支持範圍不同,比方說a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解決這個問題的辦法是JSONP或者跨域資源共享。

4.紙杯測試。。。

5.不記得了

 

360電面

1.接口和類區別

接口與類的相同點:
        兩者均可能具備抽象方法
        兩者都不能夠實例化

 接口與類的區別:
       抽象類:只能用以派生新類,不能用以建立對象
       類的成員:1.屬性 2.方法 3.構造器
       java中接口的成員:1.靜態常量 2.抽象方法
       
          接口裏面沒有--變量、普通方法、構造器!
       
       接口中的變量 只能是靜態常量 系統默認加上public static final
       接口中的方法 默認都是public abstract修飾的
       
       類和接口之間的關係:類實現接口 implements
       類實現接口,類必須重寫接口的抽象方法
       
       接口和接口之間的關係:接口繼承接口
       
       java中規定:
       類只能直接繼承一個類(一個類只能有一個直接父類)
       類能夠同時實現多個接口
       
       因爲接口中的全部方法都是抽象方法,實現接口的非抽象類必定要實現接口中全部的抽象方法。
       
       定義接口能夠經過interface關鍵字,接口的定義與類的定義相似,
       也是分爲接口的聲明和接口體兩部分。
       其中,接口體由靜態常量定義和抽象方法定義兩部分組成

    1)在類實現接口時,被重寫的方法的名字、參數列表必須與接口中的徹底一致,
    權限修飾符只能是public的
    2)一個非抽象類實現接口時,必須實現接口中全部的方法
    3)Java中的類不支持多繼承,要想實現多繼承,能夠經過實現接口來進行
    4)類實現接口能夠經過關鍵字implements

2.不記得了。。。

 

xiaomi

1.編程題 臺階n 一次只能邁一節或兩節,n輸入一個數,輸出須要邁幾回,有幾種解決方法?

2.一個類裏有兩個方法,定義了string和char兩個變量,調方法問輸出結果,

3.如何說服業務接受這個促銷方案

場景:移動端電影票1000個用戶能夠以20%價格購買,一個用戶限制下一單

4.sql查詢

 時間轉成時間戳

5.socket

http://www.javashuo.com/article/p-whixaapp-kh.html

socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操做抽象爲幾個簡單的接口供應用層調用已實現進程在網絡中通訊。

socket屏蔽了各個協議的通訊細節,使得程序員無需關注協議自己,直接使用socket提供的接口來進行互聯的不一樣主機間的進程的通訊。這就比如操做系統給咱們提供了使用底層硬件功能的系統調用,經過系統調用咱們能夠方便的使用磁盤(文件操做),使用內存,而無需本身去進行磁盤讀寫,內存管理。socket其實也是同樣的東西,就是提供了tcp/ip協議的抽象,對外提供了一套接口,同過這個接口就能夠統1、方便的使用tcp/ip協議的功能了。

 

 

頭條

1.hashmap基本結構

簡單來講,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,若是定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操做很快,僅需一次尋址便可;若是定位到的數組包含鏈表,對於添加操做,其時間複雜度依然爲O(1),由於最新的Entry會插入鏈表頭部,僅需簡單改變引用鏈便可,而對於查找操做來說,此時就須要遍歷鏈表,而後經過key對象的equals方法逐一比對查找。因此,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。

HashMap底層實現仍是數組,只是數組的每一項都是一條鏈

默認初始容量 (16) 和默認加載因子 (0.75) 

2.hashmap hashcode衝突在jdk1.8怎麼解決的

在Java 8 以前,HashMap和其餘基於map的類都是經過鏈地址法解決衝突,它們使用單向鏈表來存儲相同索引值的元素。在最壞的狀況下,這種方式會將HashMap的get方法的性能從O(1)下降到O(n)。爲了解決在頻繁衝突時hashmap性能下降的問題,

Java 8中使用平衡樹來替代鏈表存儲衝突的元素。這意味着咱們能夠將最壞狀況下的性能從O(n)提升到O(logn)。
在Java 8中使用常量TREEIFY_THRESHOLD來控制是否切換到平衡樹來存儲。目前,這個常量值是8,這意味着當有超過8個元素的索引同樣時,HashMap會使用樹來存儲它們。

何時會產生衝突

HashMap中調用hashCode()方法來計算hashCode。
因爲在Java中兩個不一樣的對象可能有同樣的hashCode,因此不一樣的鍵可能有同樣hashCode,從而致使衝突的產生。

3.concurrenthashmap 中丟數遇到過嗎

4.springboot註解實現

https://www.cnblogs.com/3xmq/p/springboot.html

5.單體應用和微服務優缺點,測試優缺點

「單體應用(monolith application)」就是將應用程序的全部功能都打包成一個獨立的單元,能夠是 JAR、WAR、EAR 或其它歸檔格式。單體應用有以下優勢:

  • 爲人所熟知:現有的大部分工具、應用服務器、框架和腳本都是這種應用程序;
  • IDE友好:像 NetBeans、Eclipse、IntelliJ 這些開發環境都是針對開發、部署、調試這樣的單個應用而設計的;
  • 便於共享:單個歸檔文件包含全部功能,便於在團隊之間以及不一樣的部署階段之間共享;
  • 易於測試:單體應用一旦部署,全部的服務或特性就均可以使用了,這簡化了測試過程,由於沒有額外的依賴,每項測試均可以在部署完成後馬上開始;
  • 容易部署:只需將單個歸檔文件複製到單個目錄下。

單體應用的一些不足:

  • 不夠靈活:對應用程序作任何細微的修改都須要將整個應用程序從新構建、從新部署。開發人員須要等到整個應用程序部署完成後才能看到變化。若是多個開發人員共同開發一個應用程序,那麼還要等待其餘開發人員完成了各自的開發。這下降了團隊的靈活性和功能交付頻率;
  • 妨礙持續交付:單體應用可能會比較大,構建和部署時間也相應地比較長,不利於頻繁部署,阻礙持續交付。在移動應用開發中,這個問題會顯得尤其嚴重;
  • 受技術棧限制:對於這類應用,技術是在開發以前通過慎重評估後選定的,每一個團隊成員都必須使用相同的開發語言、持久化存儲及消息系統,並且要使用相似的工具,沒法根據具體的場景作出其它選擇;
  • 技術債務:「不壞不修(Not broken,don’t fix)」,這在軟件開發中很是常見,單體應用尤爲如此。系統設計或寫好的代碼難以修改,由於應用程序的其它部分可能會以意料以外的方式使用它。隨着時間推移、人員更迭,這必然會增長應用程序的技術債務。

服務就是一種能夠知足這種需求的軟件架構風格。單體應用被分解成多個更小的服務,每一個服務有本身的歸檔文件,單獨部署,而後共同組成一個應用程序。這裏的「微」不是針對代碼行數而言,而是說服務的範圍限定到單個功能。微服務有以下特色:

  • 領域驅動設計:應用程序功能分解能夠經過 Eric Evans 在《領域驅動設計》中明肯定義的規則實現;每一個團隊負責與一個領域或業務功能相關的所有開發;團隊擁有全系列的開發人員,具有用戶界面、業務邏輯和持久化存儲等方面的開發技能;
  • 單一職責原則:每一個服務應該負責該功能的一個單獨的部分,這是SOLID原則之一;
  • 明確發佈接口:每一個服務都會發佈一個定義明確的接口,並且保持不變;服務消費者只關心接口,而對於被消費的服務沒有任何運行依賴;
  • 獨立部署、升級、擴展和替換:每一個服務均可以單獨部署及從新部署而不影響整個系統。這使得服務很容易升級,每一個服務均可以沿着《Art of Scalability》一書定義的 X 軸和 Z 軸進行擴展;
  • 能夠異構 / 採用多種語言:每一個服務的實現細節都與其它服務無關,這使得服務之間可以解耦,團隊能夠針對每一個服務選擇最合適的開發語言、持久化存儲、工具和方法;
  • 輕量級通訊:服務通訊使用輕量級的通訊協議,例如,同步的 REST,異步的 AMQP、STOMP、MQTT 等。

相應地,微服務具備以下優勢:

  • 易於開發、理解和維護;
  • 比單體應用啓動快;
  • 局部修改很容易部署,有利於持續集成和持續交付;
  • 故障隔離,一個服務出現問題不會影響整個應用;
  • 不會受限於任何技術棧。

6.es的基本組成成分,怎麼使用,使用過程當中遇到了那些問題

Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON做爲文檔序列化的格式

一、Elasticsearch和MongoDB/Redis/Memcache同樣,是非關係型數據庫。是一個接近實時的搜索平臺,從索引這個文檔到這個文檔可以被搜索到只有一個輕微的延遲,企業應用定位:採用Restful API標準的可擴展和高可用的實時數據分析的全文搜索工具。

    二、可拓展:支持一主多從且擴容簡易,只要cluster.name一致且在同一個網絡中就能自動加入當前集羣;自己就是開源軟件,也支持不少開源的第三方插件。

    三、高可用:在一個集羣的多個節點中進行分佈式存儲,索引支持shards和複製,即便部分節點down掉,也能自動進行數據恢復和主從切換。

    三、採用RestfulAPI標準:經過http接口使用JSON格式進行操做數據。

    四、數據存儲的最小單位是文檔,本質上是一個JSON 文本:

 

7.redis經常使用類型用途

適用場景:

  1. 數據高併發的讀寫

  2. 海量數據的讀寫

  3. 對擴展性要求高的數

redis存儲數據的基本類型有:string(字符串類型)、hash(散列類型)、list(列表類型)、set(集合類型)、zset(有序集合類型)。

https://www.cnblogs.com/shoren/p/redis-types.html

一、String

String 數據結構是簡單的key-value類型,value其實不只是String,也能夠是數字。

經常使用命令:get、set、整數遞增:incr、整數遞減:decr、獲取多個鍵值:mget等。

二、Hash

經常使用命令:讀取單個:hget,hset,讀取所有:hgetall 等。

三、List

經常使用命令:lpush,rpush,移除左邊第一個元素:lpop,rpop,獲取列表片斷:lrange等。

四、Set

經常使用命令:

添加元素sadd,spop,獲取所有元素:smembers,並運算:sunion 等。

五、有序集合類型 zset(sorted set:有序集合)

經常使用命令:

添加集合元素:zadd,元素小到大:zrange,zrem,zcard等

http://www.javashuo.com/article/p-dqijbonw-mo.html

8.public @interface SpringBootApplication

9.編程:輸入abb,egg輸出true,輸入title ,返回false

輸入的字符串數組中,全部單詞都有疊字返回true,不然返回false

10.get和post區別

11.給定一個n*m矩陣,求從左上角格子到右下角格子總共存在多少條路徑,每次只能向右走或者向下走

12.25匹馬,5個賽道,最少比賽幾回找出前三名

7次

13.給一堆字符串,找出他們前面相同的字符串出來

14.找出字符串中字符個數大於字符串長度一半的字符

15.堆棧

16.hashmap實現

在JDK1.6,JDK1.7中,HashMap採用位桶+鏈表實現,即便用鏈表處理衝突,同一hash值的鏈表都存儲在一個鏈表裏。可是當位於一個桶中的元素較多,即hash值相等的元素較多時,經過key值依次查找的效率較低。而JDK1.8中,HashMap採用位桶+鏈表+紅黑樹實現,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減小了查找時間。

簡單說下HashMap的實現原理:

首先有一個每一個元素都是鏈表(可能表述不許確)的數組,當添加一個元素(key-value)時,就首先計算元素key的hash值,以此肯定插入數組中的位置,可是可能存在同一hash值的元素已經被放在數組同一位置了,這時就添加到同一hash值的元素的後面,他們在數組的同一位置,可是造成了鏈表,同一各鏈表上的Hash值是相同的,因此說數組存放的是鏈表。而當鏈表長度太長時,鏈表就轉換爲紅黑樹,這樣大大提升了查找的效率。

     當鏈表數組的容量超過初始容量的0.75時,再散列將鏈表數組擴大2倍,把原鏈表數組的搬移到新的數組中

17.sql索引

18,算法題 一個迭代查找類似的url

19.nginx405錯誤

同事給了一個json請求,在HTTP接口測試工具中post請求結果返回405狀態,get請求則返回數據。搜了一番發現返回405是由於Apache、IIS、Nginx等絕大多數web服務器,都不容許靜態文件響應POST請求。 

 

 HTTP 狀態碼

1.信息代碼:1xx,

2.成功代碼:2xx,

3.重定向:3xx,

4.客戶端錯誤:4xx,

5.服務器錯誤:5xx

200:正確的請求返回正確的結果,若是不想細分正確的請求結果均可以直接返回200。

201:表示資源被正確的建立。好比說,咱們 POST 用戶名、密碼正確建立了一個用戶就能夠返回 201。

202:請求是正確的,可是結果正在處理中,這時候客戶端能夠經過輪詢等機制繼續請求。

203:請求的代理服務器修改了源服務器返回的 200 中的內容,咱們經過代理服務器向服務器 A 請求用戶信息,服務器 A 正常響應,但代理服務器命中了緩存並返回了本身的緩存內容,這時候它返回 203 告訴咱們這部分信息不必定是最新的,咱們能夠自行判斷並處理。

300:請求成功,但結果有多種選擇。

301:請求成功,可是資源被永久轉移。好比說,咱們下載的東西不在這個地址須要去到新的地址。

303:使用 GET 來訪問新的地址來獲取資源。

304:請求的資源並無被修改過。

308:使用原有的地址請求方式來經過新地址獲取資源。

400:請求出現錯誤,好比請求頭不對等。

401:沒有提供認證信息。請求的時候沒有帶上 Token 等。

402:爲之後須要所保留的狀態碼。

403:請求的資源不容許訪問。就是說沒有權限。

404:請求的內容不存在。

406:請求的資源並不符合要求。

408:客戶端請求超時。

413:請求體過大。

415:類型不正確。

416:請求的區間無效。

500:服務器錯誤。

501:請求尚未被實現。

502:網關錯誤。

503:服務暫時不可用。服務器正好在更新代碼重啓。

505:請求的 HTTP 版本不支持。

 

巧達數據

1.畫界面

2.畫流程

3.自動化怎麼作的

4.性能怎麼作的

5.讀取txt取出type爲hidden的name的值

 

小米

1.python輸出

2.java輸出

3.http協議方法

  HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。

  HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

4.drw-r--r--碼爲多少?

r4 w2 r1

5.linux查看磁盤空間 df -lh

查看內存佔用狀況 top free

查看RAM使用狀況 cat /proc/meminfo

(查詢指定目錄磁盤的使用狀況) du -h

先查看進程pid

ps -ef | grep 進程名

經過pid查看佔用端口

netstat -nap | grep 進程pid

linux經過端口查看進程:

netstat -nap | grep 端口號

6.sql三條查詢

6.臺階問題

7.設計用例,電影票活動,原票價的20%1000張,

 

360

1.selenium瀏覽器兼容怎麼作的

2.接口併發怎麼作的

3.codereview 的sql注入怎麼作的

4.沒時間編寫用例怎麼測試

 

字節跳動

1.畫項目的流程圖

怎麼測試的

異常校驗

2.微信發朋友圈編寫用例

3。1分鐘介紹本身,亮點

4.java 數據類型

基本類型

1)四種整數類型(byte、short、int、long)

2)兩種浮點數類型(float、double)

3)一種字符類型(char)

4)一種布爾類型(boolean)

 

引用類型

 

5.java 弱引用和強引用

Java四種引用包括強引用,軟引用,弱引用,虛引用

 

強引用:

 

只要引用存在,垃圾回收器永遠不會回收
Object obj = new Object();
//可直接經過obj取得對應的對象 如obj.equels(new Object());
而這樣 obj對象對後面new Object的一個強引用,只有當obj這個引用被釋放以後,對象纔會被釋放掉,這也是咱們常常所用到的編碼形式。

 

 

 

軟引用:

 

非必須引用,內存溢出以前進行回收,能夠經過如下代碼實現
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時候會返回null
這時候sf是對obj的一個軟引用,經過sf.get()方法能夠取到這個對象,固然,當這個對象被標記爲須要回收的對象時,則返回null;
軟引用主要用戶實現相似緩存的功能,在內存足夠的狀況下直接經過軟引用取值,無需從繁忙的真實來源查詢數據,提高速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。

 

 

 

弱引用:

 

第二次垃圾回收時回收,能夠經過以下代碼實現
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有時候會返回null
wf.isEnQueued();//返回是否被垃圾回收器標記爲即將回收的垃圾
弱引用是在第二次垃圾回收時回收,短期內經過弱引用取對應的數據,能夠取到,當執行過第二次垃圾回收時,將返回null。
弱引用主要用於監控對象是否已經被垃圾回收器標記爲即將回收的垃圾,能夠經過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。

 

 

 

虛引用:

 

垃圾回收時回收,沒法經過引用取到對象值,能夠經過以下代碼實現
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永遠返回null
pf.isEnQueued();//返回是否從內存中已經刪除
虛引用是每次垃圾回收的時候都會被回收,經過虛引用的get方法永遠獲取到的數據爲null,所以也被成爲幽靈引用。
虛引用主要用於檢測對象是否已經從內存中刪除。

⑴強引用(StrongReference)
強引用是使用最廣泛的引用。若是一個對象具備強引用,那垃圾回收器毫不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具備強引用的對象來解決內存不足的問題。  ps:強引用其實也就是咱們平時A a = new A()這個意思。

⑵軟引用(SoftReference)
若是一個對象只具備軟引用,則內存空間足夠,垃圾回收器就不會回收它;若是內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟引用可用來實現內存敏感的高速緩存(下文給出示例)。
軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

⑶弱引用(WeakReference)
弱引用與軟引用的區別在於:只具備弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它所管轄的內存區域的過程當中,一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。不過,因爲垃圾回收器是一個優先級很低的線程,所以不必定會很快發現那些只具備弱引用的對象。
弱引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

⑷虛引用(PhantomReference)「虛引用」顧名思義,就是形同虛設,與其餘幾種引用都不一樣,虛引用並不會決定對象的生命週期。若是一個對象僅持有虛引用,那麼它就和沒有任何引用同樣,在任什麼時候候均可能被垃圾回收器回收。虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在回收對象的內存以前,把這個虛引用加入到與之 關聯的引用隊列中。

相關文章
相關標籤/搜索