天天看點

java面試 - 對java的基礎資料結構和算法進行複習和練習

jvm的記憶體模型

java虛拟機記憶體運作時分為幾塊區域:方法區和堆是線程共有的,虛拟機棧、本地方法棧、程式計數器是線程私有的。

方法區的作用:用來存放加載類的資訊、常量、靜态變量、即時編譯後的代碼等資料。

堆的作用:存放執行個體對象。

虛拟機棧的作用:描述的是java方法執行的記憶體模型,存儲的是局部變量、操作數棧、動态連結、方法出口等資訊。每一個方法從開始執行到結束都對應着一個棧幀從入棧到出棧的過程。

本地方法棧的作用:和虛拟機棧的作用類似,本地方法棧是為了虛拟機的native方法服務。

程式計數器的作用:可以看做是目前線程執行的位元組碼的行号訓示器。通過改變計數器來确定吓一跳執行的位元組碼指令。

2、java記憶體溢出的種類 java堆溢出、虛拟機棧和本地方法棧溢出、方法區和運作時常量池溢出、本機直接記憶體溢出。

3、jvm參數配置 -Xmx –Xms:指定最大堆和最小堆

-Xmn 設定新生代的大小

-XX:NewRatio 設定兩個新生代Eden和老年代的比值

-XX:SurvivorRatio 設定兩個幸存帶和eden代的比值

-XX:PermSize -XX:MaxPermSize 設定永久區的廚師空間和最大空間

-Xss設定棧空間的大小,通常隻有幾百k

static

(1)、靜态方法

靜态方法不依賴于任何對象就能通路,是以在靜态方法中不能通路類的非靜态成員變量和非靜态成員方法。但是非靜态方法可以通路靜态方法和變量。

(2)、靜态代碼塊

static關鍵字還有一個比較關鍵的作用就是 用來形成靜态代碼塊以優化程式性能。static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且隻會執行一次 (3)、靜态變量 static變量也稱作靜态變量,靜态變量和非靜态變量的差別是:靜态變量被所有的對象所共享,在記憶體中隻有一個副本,它當且僅當在類初次加載時會被初始化。而非靜态變量是對象所擁有的,在建立對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響

多線程問題

(1)、synchronized和lock的差別:

synchronized是一個關鍵字,lock是一個類 ,lock比synchronized更加靈活。如果使用synchronized關鍵字,則不需要使用者去手動釋放鎖,方法或者代碼執行完畢後系統會讓線程自己釋放鎖。Lock則必須需要使用者去釋放鎖,如果沒有及時釋放鎖,就會造成死鎖現象。

lock可以讓等待的線程中斷響應,synchronized卻不能。

lock可以知道有沒有成功擷取到鎖。

lock可以提高多個線程的操作效率。

(2)、synchronized的使用方法和原理 synchronized可以修飾普通的方法,修飾靜态方法和代碼塊 實作原理:每個對象都有一個螢幕,當monitor被占用時就會處于鎖定狀态。線程執行開始時,如果monitor擷取到的值為0,則進入到該monitor,即該線程為monitor的所有者,如果檢測到其他線程占用monitor則會阻塞,等待monitor的進入數為0,再嘗試擷取monitor的所有權。

java的集合類:

1、ArrayList和LinkedList的差別:

ArrayList是基于動态數組的資料結構,LinkedList是基于連結清單的資料結構 對于随機的get和set操作,ArrayList要優于LinkedList,因為LinkedList要移動指針 對于删除和新增來說,LinkedList要優于ArrayList。

2、hashset和hashmap的差別 (1)HashSet是set的一個實作類,hashMap是Map的一個實作類,同時hashMap是hashTable的替代品(為什麼後面會講到). (2)HashSet以對象作為元素,而HashMap以(key-value)的一組對象作為元素,且HashSet拒絕接受重複的對象.HashMap可以看作三個視圖:key的Set,value的 Collection,Entry的Set。 這裡HashSet就是其實就是HashMap的一個視圖。 HashSet内部就是使用Hashmap實作的,和Hashmap不同的是它不需要Key和Value兩個值。 往hashset中插入對象其實隻不過是内部做了

3、hashmap和hashtable的差別

(1)、hashtable繼承的是dictonary類,hashmap繼承的是map類

(2)、hashtable是線程安全的,hashmap是非線程安全的

(3)、hashtable中不允許有空值。hashmap可以将null作為key,而且隻有一個。

spring相關

1、什麼是IOC

控制反轉,是将原本在程式中手動建立的對象的控制權,交給spring管理。包括構造器注入、注解注入和setter注入。

2、spring架構中五種bean的作用域:

singleton : bean在每個Spring ioc 容器中隻有一個執行個體。 prototype:一個bean的定義可以有多個執行個體。 request:每次http請求都會建立一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。 session:在一個HTTP Session中,一個bean定義對應一個執行個體。該作用域僅在基于web的Spring ApplicationContext情形下有效。 global-session:在一個全局的HTTP Session中,一個bean定義對應一個執行個體。該作用域僅在基于web的Spring ApplicationContext情形下有效。

3、AOP:面向切面,是一種程式設計思想,OOP的延續。将系統中非核心的業務提取出來,進行單獨處理。比如事務、日志和安全等。 AOP是面向切面程式設計,是通過動态代理的方式為程式添加統一功能,集中解決一些公共問題

4、spring的bean的生命周期

(1)、bean定義,在配置檔案中用去定義

(2)、bean初始化,有兩種方式,一種是通過init-method實作,還有是通過實作org.springframwork.beans.factory.InitializingBean接口

(3)、bean調用 有三種方式調用bean執行個體

(4)、bean銷毀 兩種方式,destroy-method實作,還有實作org.springframwork.beans.factory.DisposeableBean接口

hibernate相關

1.什麼是延遲加載

延遲加載是真正用到資料的時候才會加載資料,避免一些無謂的性能開銷。

springmvc

1、springmvc和struts2的差別 springmvc的入口是一個DispatcherServlet即前端控制器,strut2的入口是一個filter。

資料庫 

1.索引是通過B樹和變形的B+樹實作的。

2、建立索引的注意事項: (1).索引不與表放在同一個表空間内 (2).一個表的索引不要過多 (3).對于大而使用頻繁的表,在生産時不要添加索引,因為表的索引會加大删除修改增加的開銷。 (4).使用組合條件查詢的适合履歷組合索引。 (5).查詢時不要對索引的列進行處理,如對此列使用函數,否則索引相當于無效。

3.索引的優缺點 優點:索引可以保證每一行資料的唯一性。 可以大大加快資料的檢索速度 可以加快表與表之間的連結 在查詢的過程中使用優化隐藏器,提高系統性能 缺點:建立索引和維護索引會随着資料量的增加引發更多的消耗 索引會占用實體空間 當表中的資料進行維護時,索引也會維護。

4.mysql優化 在where和 order by涉及的列上加索引 會導緻全表掃描: 盡量避免在where的字句中使用 != 或<>操作符,否則會不使用索引對全表進行掃描。 盡量不使用null進行控制判斷,可以設定成預設值為0進行查詢。 盡量不使用or來連結where條件 in和not in也要少用 在where字句中使用參數也會導緻全表掃描

并發的悲觀鎖和樂觀鎖

悲觀鎖(Pessimistic Lock): 每次擷取資料的時候,都會擔心資料被修改,是以每次擷取資料的時候都會進行加鎖,確定在自己使用的過程中資料不會被别人修改,使用完成後進行資料解鎖。由于資料進行加鎖,期間對該資料進行讀寫的其他線程都會進行等待。

樂觀鎖(Optimistic Lock): 每次擷取資料的時候,都不會擔心資料被修改,是以每次擷取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被别人修改過。如果資料被其他線程修改,則不進行資料更新,如果資料沒有被其他線程修改,則進行資料更新。由于資料沒有進行加鎖,期間該資料可以被其他線程進行讀寫操作。 寫入頻繁用悲觀鎖,讀取頻繁使用樂觀鎖。

transient關鍵字的使用:

1)一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。

2)transient關鍵字隻能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是使用者自定義類變量,則該類需要實作Serializable接口。

3)被transient關鍵字修飾的變量不再能被序列化,一個靜态變量不管是否被transient修飾,均不能被序列化。

注解的原理:

 注解本質是一個繼承了Annotation的特殊接口,其具體實作類是Java運作時生成的動态代理類。而我們通過反射擷取注解時,傳回的是Java運作時生成的動态代理對象$Proxy1。通過代理對象調用自定義注解(接口)的方法,會最終調用AnnotationInvocationHandler的invoke方法。該方法會從memberValues這個Map中索引出對應的值。而memberValues的來源是Java常量池

java web response和request的差別:

request是用戶端向伺服器端發送的請求。主要包括了自己浏覽器的資訊,http變量,儲存在cookie中的資訊 response是伺服器對用戶端的相應。主要包括了頁面的資訊,和cookie。 cookie就是儲存在用戶端上的一些資訊,可以用來驗證使用者資訊,提高使用者的相應速度。

tcp黏包拆包

1、發送端給每個資料包添加包首部,首部中應該至少包含資料包的長度,這樣接收端在接收到資料後,通過讀取包首部的長度字段,便知道每一個資料包的實際長度了。

2、發送端将每個資料包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的資料就自然而然的把每個資料包拆分開來。

3、可以在資料包之間設定邊界,如添加特殊符号,這樣,接收端通過這個邊界就可以将不同的資料包拆分開。