1.java基本數據類型:html
先說明兩個詞彙的基本概念:
bit (位):位是計算機中存儲數據的最小單位,指二進制數中的一個位數,其值爲「0」或「1」。java
byte (字節):字節是計算機存儲容量的基本單位,一個字節由8位二進制數組成。在計算機內部,一個字節能夠表示一個數據或者一個英文字母,可是一個漢字須要兩個字節表示。
1B=8bit
1Byte=8bit
1KB=1024Byte(字節)=8*1024bit
1MB=1024KB
1GB=1024MB
1TB=1024GBmysql
第二類、浮點數類型
float:單精度類型,32 位,後綴 F 或 f,1 位符號位,8 位指數,23 位有效尾數。算法
double:64 位,最經常使用,後綴 D 或 d,1 位符號位,11 位指數,52 位有效尾數。sql
java浮點型默認爲double型,因此要聲明一個變量爲float型時,須要在數字後面加F或者f:數據庫
例如:double d = 88888.8; float f = 88888.8f; //不加f的話會報錯數組
第三類、字符類型安全
char:16位,java字符使用Unicode編碼,性能優化
第四類、布爾類型服務器
boolean:true 真 和 false 假
簡單數據類型之間的轉換
在Java中整型、實型、字符型被視爲簡單數據類型,這些類型由低級到高級分別爲
(byte,short,char)--int--long--float--double
更多可看:http://www.javashuo.com/article/p-rsvrhzgw-bc.html
2.工廠模式有什麼好處?
工廠模式的做用,爲何要用工廠模式?
工廠模式是爲了解耦:把對象的建立和使用的過程分開。就是Class A 想調用Class B,那麼只是調用B的方法,而至於B的實例化,就交給工廠類。
工廠模式能夠下降代碼重複。若是建立B過程都很複雜,須要必定的代碼量,並且不少地方都要用到,那麼就會有不少的重複代碼。能夠把這些建立對象B的代碼放到工廠裏統一管理。既減小了重複代碼,也方便之後對B的維護。
工廠模式能夠減小錯誤,由於工廠管理了對象的建立邏輯,使用者不須要知道具體的建立過程,只管使用便可,減小了使用者由於建立邏輯致使的錯誤。
工廠模式的一些適用場景:
對象的建立過程/實例化準備工做很複雜,須要不少初始化參數,查詢數據庫等
類自己有好多子類,這些類的建立過程在業務中容易發生改變,或者對類的調用容易發生改變
能夠參考,計算器例子。
3.二維數組的初始化
int [][] a=new int[][]{{1,2,3},{2,3}};
int [][] a=new int[4][4];
int [][]a=new int[3][];
4.一維數組初始化
int[] arr = new int[3];
int[] arr = null;
int[] arr = {1, 2, 3};
int[] arr = new int[]{1, 2, 3};
5.多態:
多態是同一個行爲具備多個不一樣表現形式或形態的能力。
它包括兩種類型:
靜態多態性:包括變量的隱藏、方法的重載(指同一個類中,方法名相同[方便記憶],可是方法的參數類型、個數、次序不一樣,本質上是多個不一樣的方法);
動態多態性:是指子類在繼承父類(或實現接口)時重寫了父類(或接口)的方法,程序中用父類(或接口)引用去指向子類的具體實例,從代碼形式上看是父類(或接口)引用去調用父類(接口)的方法,可是在實際運行時,JVM可以根據父類(或接口)引用所指的具體子類,去調用對應子類的方法,從而表現爲不一樣子類對象有多種不一樣的形態。
6.封裝:
封裝的好處:
實現封裝的方式:使用訪問控制符
java提供了三種訪問權限,準確的說還有一種是默認的訪問權限,加上它一共四種。
7.把一個整數反轉過來,這道你查一下,要注意正負數的狀況
public class demo_exp_2 { public int reverse(int x) { int rev = 0; while (x != 0) { int pop = x % 10; x /= 10; if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; rev = rev * 10 + pop; } return rev; } public static void main(String[] args){ demo_exp_2 a = new demo_exp_2(); System.out.println(a.reverse(-13232)); } }
簡單代碼以下:
public class Solution { public int reverse(int x) { int result = 0; while (x != 0) { result = result * 10 + x % 10; // 每一次都在原來結果的基礎上變大10倍,再加上餘數 x = x / 10; // 對x不停除10 } return result; }
8.一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在 第10次落地時,共通過多少米?第10次反彈多高?
public static void main(String[] args) { int total = 0; int height = 100; for (int i = 0; i < 10; i++) { System.out.print("第" + (i + 1) + "次落下時候高度:" + height + " "); total = total + height; height = height / 2; System.out.println("第" + (i + 1) + "次落下通過距離:" + total); } }
8.Mysql的數據類型
主要包括如下五大類:
整數類型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮點數類型:FLOAT、DOUBLE、DECIMAL
字符串類型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期類型:Date、DateTime、TimeStamp、Time、Year
其餘數據類型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
9.Mysql索引
爲何不實用二叉查找樹或者紅黑樹做爲數據庫索引。
二叉樹在處理海量數據時,樹的高度過高,雖然索引效率很高,達到logN,但會進行大量磁盤io,得不償失。並且刪除或者插入數據可能致使數據結構改變變成鏈表,須要增進平衡算法。而紅黑樹,插入刪除元素的時候會進行頻繁的變色和旋轉(左旋,右旋),很浪費時間。可是當數據量很小的時候,徹底能夠放入紅黑樹中,此時紅黑樹的時間複雜性比b樹低。所以,綜上考慮,數據庫最後選擇了b樹做爲索引。
B tree和B+ tree應用場景:
1.B樹經常使用於文件系統,和少部分數據庫索引,好比mongoDB。
2.B+樹主要用於mysql數據庫索引。
B+ tree對比B tree的優勢
B樹的每一個節點除了存儲指向 子節點的索引外,還要存儲data域,所以單一節點指向子節點的索引並非不少,樹的高度較高,磁盤io次數較多。B+樹的高度更低,且全部data都存儲在葉子節點,葉子節點都處於同一層,所以查詢性能穩定,便於範圍查找。
12.關係型數據庫三大範式
要想知足第二範式必須先知足第一範式,想知足第三範式必須先知足第二範式。
第一範式:是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。(列數據的不可分割)
第二範式:要求數據庫表中的每一個行必須能夠被惟一地區分,爲實現區別一般須要爲表加上一個列,以存儲各個實例的惟一標識(主鍵)
第三範式:須要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
簡單總結就是:第一範式的關鍵詞是列的原子性
第二範式的關鍵詞是不能包含部分依賴
第三範式的關鍵詞是不能包含傳遞依賴
更多:http://www.javashuo.com/article/p-dngvthpy-em.html
13.list<T>、 list<?>、list<Object>的區別?
List<T>、List<?>、List<Object>這三者均可以容納全部的對象,
但使用的順序應該是首選List<T>,次之List<?>,最後選擇List<Object>
緣由以下:
(1) List<T>是肯定的某一個類型
List<T>表示的是List集合中的元素都爲T類型,具體類型在運行期決定;List<?>表示任意類型,與List<T>相似,而List<Object>則表示List集合中的全部元素爲Object類型,由於Object是全部類的父類,因此List<Object>也能夠容納全部的類類型,從這一字面意義上分析,List<T>更符合習慣:編碼者知道它是某一個類型,只是在運行期才肯定而已。
(2) List<T>能夠進行讀寫操做
List<T>能夠進行諸如add、remove等操做,由於它的類型是固定的T類型,在編碼期 不須要進行任何的轉型操做。
List<?>是隻讀類型的,不能進行增長、修改操做,由於編譯器不知道List中容納的是 什麼類型的元素,也就無畢校驗類型是否安全了,並且List<?>讀取出的元素都是Object類 型的,須要主動轉型,因此它常常用於泛型方法的返回值。注意,List<?>雖然沒法增長、修 改元素,可是卻能夠刪除元素,好比執行remove、clear等方法,那是由於它的刪除動做與泛型類型無關。
List<Object>也能夠讀寫操做,可是它執行寫入操做時須要向上轉型(Upcast),在讀 取數據後須要向下轉型(Downcast),而此時已經失去了泛型存在的意義了。
14.數據庫優化
MySQL性能優化的一些經驗 a.爲查詢優化你的查詢 b.學會使用EXPLAIN c.當只要一行數據時使用LIMIT 1 當你查詢表的有些時候只須要一條數據,請使用 limit 1。 d.正確的使用索引 索引並不必定就是給主鍵或是惟一的字段。若是在你的表中,有某個字段你總要會常常用來作搜索、拍下、條件,那麼,請爲其創建索引吧。 e.不要ORDER BY RAND() 效率很低的一種隨機查詢。 f.避免SELECT * 從數據庫裏讀出越多的數據,那麼查詢就會變得越慢。而且,若是你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增長網絡傳輸的負載。必須應該養成一個須要什麼就取什麼的好的習慣。 g.使用 ENUM 而不是 VARCHAR ENUM 類型是很是快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示爲字符串。這樣一來,用這個字段來作一些選項列表變得至關的完美。 若是你有一個字段,好比「性別」,「國家」,「民族」,「狀態」或「部門」,你知道這些字段的取值是有限並且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。 h.使用 NOT NULL k.垂直分割 「垂直分割」是一種把數據庫中的表按列變成幾張表的方法,這樣能夠下降表的複雜度和字段的數目,從而達到優化的目的。須要注意的是,這些被分出去的字段所造成的表,你不會常常性地去Join他們,否則的話,這樣的性能會比不分割時還要差,並且,會是極數級的降低。 l.拆分大的 DELETE 或 INSERT 語句 m.越小的列會越快 對於大多數的數據庫引擎來講,硬盤操做多是最重大的瓶頸。因此,把你的數據變得緊湊會對這種狀況很是有幫助,由於這減小了對硬盤的訪問。 n.選擇正確的存儲引擎 在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每一個引擎都有利有弊。 MyISAM 適合於一些須要大量查詢的應用,但其對於有大量寫操做並非很好。甚至你只是須要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都沒法操做直到讀操做完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。 InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持「行鎖」 ,因而在寫操做比較多的時候,會更優秀。而且,他還支持更多的高級應用,好比:事務。
9.兩個list查找相同元素!除了遍歷外你還想到什麼方法?
從兩個list中找到重複元素,很容易就想到兩個for循環嵌套來實現,可是若是兩個list都很是大的話,時間複雜度將很是大。因此這裏介紹一種以空間換時間的方法。
1.由於list中是能夠存在相同元素的,可是想以2來獲得重複的元素,因此須要進行去重
2.將list中的元素放入map中,並對元素個數進行一個統計
3.將hashmap中value爲2的key存入list
代碼以下:
public class TestList { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList<String>(); list1.add("a"); list1.add("b"); list1.add("b"); list1.add("c"); list2.add("b"); list2.add("c"); list2.add("d"); String duplicate = findDuplicate(list1, list2); System.out.println("duplicate element: " + duplicate); } private static String findDuplicate(List<String> list1, List<String> list2) { List<String> duplicate = new ArrayList<String>(); Map<String, Integer> map = new HashMap<String, Integer>(); //1.去重 List<String> list3 = new ArrayList<String>(new HashSet<String>(list1)); List<String> list4 = new ArrayList<String>(new HashSet<String>(list2)); //2.將list中的元素加入map中並進行統計 for (String s1 : list3) { map.put(s1, 1); } //3.將list中的元素加入map中並進行統計 for (String s2 : list4) { map.put(s2, (map.get(s2) == null ? 1 : 2)); } //4.將重複的元素放入list中 for (Map.Entry<String, Integer> m : map.entrySet()) { if (m.getValue() == 2) { duplicate.add(m.getKey()); } } return duplicate.toString(); } }
15.複習一下mybatis
16.數據庫若是有某個字段突然增大到幾萬的長度怎麼辦
能夠另外建一個表來存儲這段數據,再有就是把字段切割成幾段,原先的表裏存對應的id ,避免原先的表數據量過大