第一次直接做機試:
題目:
實現(xiàn)一個點贊功能,要求:
任何一個用戶可以發(fā)布一串字符串內(nèi)容.
所有用戶都可以看發(fā)布的內(nèi)容,并進行點贊,蓋內(nèi)若能的點贊數(shù)需要累加統(tǒng)計
任何一個用戶,取消點贊的內(nèi)容,可以進行取消點贊,該內(nèi)容的點贊數(shù)需要扣減
自行設(shè)計數(shù)據(jù)庫以及項目框架搭建并且實現(xiàn)功能
點贊功能:小demo連接
過了一天晚上又打了個電話面試主要的問題我如下列出來:
1.自我介紹,項目介紹
2. sql索引以及原理
index
索引原理:B+樹
優(yōu)化:
主要是在所有的葉子結(jié)點中增加了指向下一個葉子節(jié)點的指針,因此InnoDB建議為大部分表使用自增的主鍵作為索引.
無法使用索引的場景(自己覺得比較重要的)
1.以"%"開頭的LIKE語句,模糊查詢
2.OR語句前后沒有同事使用索引
3.數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化(如varchar不加單引號的話可能自動轉(zhuǎn)換為int型)
索引:是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),他們包含著對數(shù)據(jù)有記錄的引用指針.
聯(lián)合索引(面試乘扇蹋客)
最左匹配原則,篩選數(shù)據(jù)最多的字段放在左側(cè).
(A,B,C) 這樣3列,mysql會首先匹配A鸣峭,abc ac ab ac 或者cba cab ca ba
就是一定要有最左邊的元素才會使用到索引
3. 介紹一下springboot
SpringBoot是一個快速開發(fā)的框架應(yīng)用,封裝了Maven常用依賴,能夠快速地整合第三方框架;簡化xml配置,全部采用注解形式,內(nèi)置Tomcat,Jetty,Undertow,幫助開發(fā)者能夠?qū)崿F(xiàn)快速開發(fā),SpringBoot的web組件,默認集成的是SpringMvc框架.
springboot原理:
1.能夠幫助開發(fā)者實現(xiàn)快速整合第三方框架.(原理:Maven依賴封裝)
2.去除xml配置完全采用注解化(原理:Spring體系中內(nèi)置注解方式)
3.無需外部Tomcat,內(nèi)部實現(xiàn)服務(wù)器(原理:Java語言支持創(chuàng)建Tomcat服務(wù)器)
4.常用git命令有哪些
在本地創(chuàng)建本地倉庫:git init [project-name]
從遠程倉庫克隆項目: git clone [url]
修改代碼一系列操作后查看狀態(tài): git status
添加到本地倉庫:git add
提交到本地倉庫:git commit
推代碼到遠程倉庫:git push
5.常用的集合類有哪些,然后延伸問hash map的原理以及hashtable的原理和concurrent haspmap的原理
集合類:
常用的集合類:
一, Collection接口
(1). collection接口的成員方法
增加: boolean add(E e)
刪除: boolean remove(Object o)
清空: void clear()
包含: boolean contains(Object o)
判斷為空: boolean isEmpty()
容量: int size()
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
(2). Object[] toArray()
把集合轉(zhuǎn)成數(shù)組摊溶,可以實現(xiàn)集合的遍歷.
(3). Iterator iterator()
迭代器,集合的專用遍歷方式.
使用方法iterator()要求容器返回一個Iterator
boolean hasNext() 檢查是否有下一個元素
E next() 獲取下一個元素
remove() 將迭代器新進返回的元素刪除
1, List接口(繼承Connection)
ArrayList(開發(fā)中用的很多)
底層數(shù)據(jù)結(jié)構(gòu)是一個自增長的數(shù)組莫换,查詢快,增刪慢.
線程不安全拉岁,效率高.
LinkedList
底層數(shù)據(jù)結(jié)構(gòu)是鏈表(存儲地址不連續(xù))坷剧,查詢慢,增刪快
線程不安全膛薛,效率高
LinkedList類特有功能
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
Vector
底層數(shù)據(jù)結(jié)構(gòu)是也是數(shù)組补鼻,查詢快,增刪慢.
線程安全风范,效率低.
Vector類特有功能:
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
2, Set接口(繼承Connection)
Set是一個不包含重復(fù)元素的 collection。Set中最常被使用的是測試歸屬性硼婿,你可以很容易的查詢某個對象是否在其中。正因如此寇漫,查找成了set中的重要操作刊殉,因此你通常都會選擇一個HashSet實現(xiàn)记焊,它專門進行了優(yōu)化。
Set具有與Collection完全一樣的接口栓撞,因此沒有任何額外的功能,不像List一樣有不同的list瓤湘。實際上Set就是Collection,只是行為不同弛说。加入Set的元素必須定義equals方法以確保對象的唯一性
HashSet:為快速查找而設(shè)計的Set。存入HashSet的元素必須定義hashCode()方法,不保證set的迭代順序,特別是它不保證該順序恒久不變木人。
HashSet如何保證元素唯一性?底層數(shù)據(jù)結(jié)構(gòu)是哈希表(元素是鏈表的數(shù)組)哈希表依賴于哈希值存儲添加功能底層依賴兩個方法: int hashCode()
boolean equals(Object obj)
LinkedHashSet:具有HashSet的查詢速度猎物,且內(nèi)部使用鏈表維護元素的順序(插入的次序)角塑。于是在使用迭代器遍歷Set時,結(jié)果會按元素插入的次序顯示圃伶。元素也必須定義hashCode()方法
元素有序唯一
由鏈表保證元素有序
由哈希表保證元素唯一
TreeSet:保持次序的set,底層為樹結(jié)構(gòu)窒朋。使用它可以從set中提取有序的序列。元素必須實現(xiàn)Comparable接口侥猩。
使用元素的自然順序?qū)υ剡M行排序
或者根據(jù)創(chuàng)建 set 時提供的 Comparator 進行排序
具體取決于使用的構(gòu)造方法。
必須提的一點:TreeSet是如何保證元素的排序和唯一性的欺劳?
底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹(紅黑樹是一種自平衡的二叉樹)!
各種set集合性能分析
HashSet和TreeSet是Set集合中用得最多的集合划提。HashSet總是比TreeSet集合性能好,因為HashSet不需要額外維護元素的順序鹏往。
LinkedHashSet需要用額外的鏈表維護元素的插入順序,因此在插入時性能比HashSet低伊履,但在迭代訪問(遍歷)時性能更高韩容。因為插入的時候即要計算hashCode又要維護鏈表群凶,而遍歷的時候只需要按鏈表來訪問元素。
EnumSet元素是所有Set元素中性能最好的座掘,但是它只能保存Enum類型的元素
3, Queue接口
Queue隊列,它主要分為兩大類柔滔,一類是阻塞式隊列,隊列滿了以后再插入元素則會拋出異常睛廊,主要包括ArrayBlockQueue、PriorityBlockingQueue咆霜、LinkedBlockingQueue。另一類則是雙端隊列光酣,支持在頭救军、尾兩端插入和移除元素,主要包括:ArrayDeque唱遭、LinkedBlockingDeque、
****LinkedList拷泽。
Queue用于模擬隊列這種數(shù)據(jù)結(jié)構(gòu),隊列通常是指“先進先出”的容器司致。隊列的頭部保存在隊列中時間最長的元素,隊列的尾部 保存在隊列中時間最短的元素虏辫。新元素插入到隊列的尾部锈拨,訪問元素操作會返回隊列頭部的元素。通常奕枢,隊列不允許隨機訪問隊列中的元素。
Queue接口中定義了如下操作方法:
void add(Object e): 將指定元素加入此隊列的尾部缝彬。
Object element(): 獲取隊列頭部的元素,但是不刪除該元素谷浅。
boolean offer(Object e): 將指定元素加入此隊列的尾部扒俯。當(dāng)使用有容量限制的隊列時撼玄,此方法通常比add(Object e)方法更好。
Object peek(): 獲取隊列頭部的元素墩邀,但是不刪除該元素。如果此隊列為空眉睹,則返回null废膘。
Object poll(): 獲取隊列頭部的元素慕蔚,并刪除該元素。如果此隊列為空孔飒,則返回null。
Object remove(): 獲取隊列頭部的元素十偶,并刪除該元素。
Queue有兩個常用的實現(xiàn)類:LinkedList和PriorityQueue惦积。
LinkedList類 是一個比較奇怪的類,它是List接口的實現(xiàn)類–這意味著它是一個List集合狮崩,可以根據(jù)索引來隨機訪問集合中的元素蛛勉。除此之外诽凌,LinkedList還實現(xiàn)了Deque接口,Deque接口是Queue接口的子接口坦敌,它代表一個雙向隊列Deque接口里定義了一些可以雙向操作隊列的方法。
LinkedList與ArrayList的實現(xiàn)機制完全不同狱窘,ArrayList內(nèi)部以數(shù)組的形式來保存集合中的元素,因此隨機訪問集合元素上有較好的性能蘸炸;而LinkedList內(nèi)部以鏈表的形式來保存集合中的元素,因此隨機訪問集合元素時性能較差搭儒,但在插入、刪除元素時性能非常出色(只需改變指針所指的地址即可)淹禾。
通常的編程過程中無須理會ArrayList和LinkedList之間的性能差異,只需知道LinkedList集合不僅提供了List的
功能稀拐,還額外提供了的雙向隊列、棧的功能。但在一些性能非常敏感的地方铲咨,可能需要慎重選擇哪個List實現(xiàn)。
4, Map接口(實現(xiàn)Connection)
Map的思想纤勒,映射表(也可以稱為關(guān)聯(lián)數(shù)組)的基本思想是它維護的鍵-值(對)關(guān)聯(lián),因此你可以使用鍵來查找值摇天。標準的Java類庫中包含了Map的集中基本實現(xiàn)類,包括HashMap泉坐,TreeMap、LinkedHashMap腕让、WeakHashMap,ConcurrentHashMap纯丸、IdentityHashMap偏形。它們都有同樣的基本接口Map俊扭,但是行為特效各不同,這表現(xiàn)在效率坠陈、鍵值對的保存及呈現(xiàn)次序、對象的保存周期畅姊、映射表如何在多線程程序中工作和判定“鍵”等價的策略等方面吹由。Map接口實現(xiàn)的數(shù)量應(yīng)該可以讓你感覺到這種工具的重要性。
Map接口成員方法:
V put(K key,V value)
V remove(Object key)
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
int size()
V get(Object key)
Set keySet()
Collection values()
Set<Map.Entry<K,V>> entrySet()
這里提一下Map的遍歷方式吧:
方式1:根據(jù)鍵找值
獲取所有鍵的集合
遍歷鍵的集合倾鲫,獲取到每一個鍵
根據(jù)鍵找值
方式2:根據(jù)鍵值對對象找鍵和值
獲取所有鍵值對對象的集合
遍歷鍵值對對象的集合,獲取到每一個鍵值對對象
根據(jù)鍵值對對象找鍵和值
HashMap:Map基于散列表的實現(xiàn)(它取代 了Hashtable)乌昔。插入和查詢“鍵值對”的開銷是固定的】牡溃可以通過構(gòu)造器設(shè)置容器和負載因子,以調(diào)整容器的性能。
LinkedHashMap:類似于HashMap伶丐,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序哗魂,或者是最近最少使用的(LRU)的次序。只是比HashMap慢一點录别,而在迭代訪問時,反而更快组题,因為它使用鏈表維護內(nèi)部次序。
TreeMap:基于紅黑樹的實現(xiàn)崔列,查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparable或Comparator決定)峻呕。TreeMap的特點在于所得到的結(jié)果是經(jīng)過排序的。TreeMap是唯一帶有subMap()方法的Map瘦癌,它可以返回一個子樹
WeakHashMap:弱鍵(weak key)映射,允許釋放映射所指向的對象讯私,這是為解決某類特殊問題而設(shè)計的热押。如果映射之外沒有引用指向某個“鍵”桶癣,則此鍵可以被垃圾回收器回收。
ConcurrentHashMap:一種線程安全的Map娘锁,它不涉及加同步鎖。
IdentityHashMap:使用==代替equals()對“鍵”進行比較的散列映射莫秆。專為解決特殊問題而設(shè)計的。
既然談到了HashMap那么就來總結(jié)一下與Hashtable的不同镊屎,最直觀的方法,看其底層實現(xiàn)的源碼缝驳。
1.它們的家族就不同归苍,雖然都實現(xiàn)了Map接口,但HashMap是繼承自AbstractMap霜医,Hashtable繼承自古老的Dictionary
2.HashMap是允許key為null的,而Hashtbale是不允許的
3.在Hashtable的源碼里肴敛,一眼我們就能看到一個關(guān)鍵字 -----synchronized ,所以其是線程同步的医男,HashMap不是線程同步的,所以效率會高上一些,簡而言之镀梭,HashMap是Hashtable的輕量級實現(xiàn)(非線程安全實現(xiàn))
最大的不同是,Hashtable的方法是Synchronize的踱启,而HashMap不是,在多個線程訪問Hashtable時埠偿,不需要自己為它的方法實現(xiàn)同步,而HashMap 就必須為之提供外同步(Collections.synchronizedMap)冠蒋。
二、各種集合的異同點
1抖剿、Vector和ArrayList
1,vector是線程同步的斩郎,所以它也是線程安全的,而arraylist是線程異步的缩宜,是不安全的。如果不考慮到線程的安全因素脓恕,一般用arraylist效率比較高膜宋。
2炼幔,如果集合中的元素的數(shù)目大于目前集合數(shù)組的長度時乃秀,vector增長率為目前數(shù)組長度的100%,而arraylist增長率為目前數(shù)組長度的50%.如果在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù)肛著,用vector有一定的優(yōu)勢跺讯。
3,如果查找一個指定位置的數(shù)據(jù)刀脏,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以愈污。而如果移動一個指定位置的數(shù)據(jù)花費的時間為0(n-i)n為總長度耀态,這個時候就應(yīng)該考慮到使用arraylist,因為它移動一個指定位置的數(shù)據(jù)所花費的時間為0(1),而查詢一個指定位置的數(shù)據(jù)時花費的時間為0(i)首装。
ArrayList 和Vector是采用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素杭跪,都允許直接序號索引元素,但是插入數(shù)據(jù)要涉及到數(shù)組元素移動等內(nèi)存操作涧尿,所以索引數(shù)據(jù)快插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差姑廉,LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行向前或向后遍歷庄蹋,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入數(shù)度較快限书!
2虫蝶、Aarraylist和Linkedlist
1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)能真,LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2.對于隨機訪問get和set扰柠,ArrayList絕對優(yōu)于LinkedList,因為LinkedList要移動指針卤档。
3.對于新增和刪除操作add和remove,LinkedList比較占優(yōu)勢劝枣,因為ArrayList要移動數(shù)據(jù)织鲸。
這一點要看實際情況的。若只對單條數(shù)據(jù)插入或刪除搂擦,ArrayList的速度反而優(yōu)于LinkedList。但若是批量隨機的插入刪除數(shù)據(jù)哗脖,LinkedList的速度大大優(yōu)于ArrayList. 因為ArrayList每插入一條數(shù)據(jù),要移動插入點及之后的所有數(shù)據(jù)才避。
3、HashMap與TreeMap
1工扎、 HashMap通過hashcode對其內(nèi)容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序肢娘,如果你需要得到一個有序的結(jié)果你就應(yīng)該使用TreeMap(HashMap中元素的排列順序是不固定的)。集合框架”提供兩種常規(guī)的Map實現(xiàn):HashMap和TreeMap (TreeMap實現(xiàn)SortedMap接口)橱健。
2、在Map 中插入拘荡、刪除和定位元素臼节,HashMap 是最好的選擇网缝。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好蟋定。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現(xiàn)。 TreeMap沒有這個調(diào)優(yōu)選項驶兜,因為該樹總處于平衡狀態(tài)。
4抄淑、hashtable與hashmap
1、歷史原因:Hashtable是基于陳舊的Dictionary類的肆资,HashMap是Java 1.2引進的Map接口的一個實現(xiàn) 矗愧。
2贱枣、同步性:Hashtable是線程安全的监署,也就是說是同步的纽哥,而HashMap是線程序不安全的,不是同步的 春塌。
3、值:只有HashMap可以讓你將空值作為一個表的條目的key或value 簇捍。
hashmap原理:數(shù)組+鏈表(1.8之后:鏈長超過8時 (將鏈表轉(zhuǎn)換成紅黑樹前會判斷,如果當(dāng)前數(shù)組的長度小于 64暑塑,那么會選擇先進行數(shù)組擴容,而不是轉(zhuǎn)換為紅黑樹)時事格,將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時間驹愚。Hashtable 沒有這樣的機制.
hashTable原理: 數(shù)組+鏈表,HashTable 是線程安全的,因為 HashTable 內(nèi)部的方法基本都經(jīng)過synchronized 修飾逢捺。
concurrenthashmap:jdk1.7:分組數(shù)組+鏈表(**** ① 在 JDK1.7 的時候,ConcurrentHashMap(分段鎖) 對整個桶數(shù)組進行了分割分段(Segment)劫瞳,每一把鎖只鎖容器其中一部分數(shù)據(jù)倘潜,多線程訪問容器里不同數(shù)據(jù)段的數(shù)據(jù)涮因,就不會存在鎖競爭,提高并發(fā)訪問率恨憎。 到了 JDK1.8 的時候已經(jīng)摒棄了 Segment 的概念,而是直接用 Node 數(shù)組+鏈表+紅黑樹的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)憔恳,并發(fā)控制使用 synchronized 和 CAS 來操作。)
6. Linux命令
常用命令:
cd 進入目錄
chmod 777 授權(quán)所有權(quán)限
./start.sh 運行
查看log(日志)的操作
cd ./XXXXX/log/catXXX.log
tail -f XXX.log 從下往上滾的查看
cat -n "日志名稱" | grep "要查詢的錯誤"
7. springboot的常用注解
springboot核心注解:
@SpringBootApplication= @SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
:開啟Springboot各項功能
**@EnableAutoConfiguration:允許自動配置注解 **
@SpringBootConfiguration
這個注解就是 @Configuration 注解的變體输硝,只是用來修飾是 Spring Boot 配置而已,或者可利于 Spring Boot 后續(xù)的擴展点把。
@ComponentScan
這是 Spring 3.1 添加的一個注解橘荠,用來代替配置文件中的 component-scan 配置郎逃,開啟組件掃描,即自動掃描包路徑下的 @Component 注解進行注冊 bean 實例到 context 中褒翰。
8.springboot打包的方式有哪些,區(qū)別是,如果只是把主類打包怎么加依賴
springboot打jar包有兩種方式:
1.通過Maven插件,將所有依賴都打成一個jar包,然后通過java -jar XXX.jar方式運行
2.將主程序打成jar包,然后和其他依賴包放在一起(包括Maven下載的和第三方j(luò)ar包),這樣也可以通過java -jar xxx.jar方式運行
jar方式運行的前提是主程序jar包中的META-INF文件夾下的MANIFEST.MF文件必須有正確的Class-Path、Main-Class优训。
Class-Path指定了主程序依賴的jar包,若配置錯誤揣非,運行jar時將報ClassNotFoundException;若新增或刪除了一些jar包早敬,需要刪除該文件忌傻,并重新生成搁嗓。
Main-Class指定了程序的運行入口,這里配置成SpringBoot的主函數(shù)腺逛。
MANIFEST.MF文件若配置不當(dāng),運行jar時將報xxxxxx.jar中沒有主清單屬性棍矛。
........