P1-JAVA
1. Java的跨平臺原理:
? ?Java通過不同的系統(tǒng)、不同的版本、不同位數(shù)的java虛擬機(JVM)來屏蔽不同的系統(tǒng)指令集差異而對外提供統(tǒng)一的接口(Java API),對于我們java開發(fā)而言,只需要按照接口開發(fā)即可;如果我們系統(tǒng)需要部署到不同的環(huán)境時,只需要在系統(tǒng)上面安裝對應(yīng)版本的虛擬機即可!
2. 搭建一個java的開發(fā)環(huán)境:
2.1適用于我們開發(fā)環(huán)境的JDK(配置JAVA_HOME環(huán)境變量)(JDK包括:JRE+java工具[編譯器javac.exe、執(zhí)行器java.exe]+java基礎(chǔ)類庫)
2.2對應(yīng)開發(fā)環(huán)境的eclipse
2.3(web應(yīng)用)web服務(wù)器(Tomcat服務(wù)器)
2.4版本控制器(SVN + Git)
3. Java的8種基本數(shù)據(jù)類型+對應(yīng)的包裝類型:
為什么要使用包裝類型?
1.因為java是一門面向?qū)ο蟮恼Z言,而基本數(shù)據(jù)類型不具備面向?qū)ο蟮奶匦?#xff09;;
2.緩存值:對象緩存(Integer i = 1; Integer z = 1; // i==z true);
4. 自動裝箱+自動拆箱(JDK1.5引入的特性)
裝箱:把基本的數(shù)據(jù)類型轉(zhuǎn)換成對應(yīng)的包裝類型
拆箱:把包裝類型轉(zhuǎn)換成對應(yīng)的基本數(shù)據(jù)類型
package com.yikuan.test;public class Test1 {public static void main(String[] args) {/*** 自動裝箱* 在編譯時實際上調(diào)用的是Integer的valueOf方法(Integer i = Integer.valueOf(1);)*/Integer i = 1;/*** 自動拆箱* 在編譯時實際上調(diào)用的是Integer的intValue方法((int j = i.intValue();))*/int j = i;System.out.println(i); //1System.out.println(j); //1 } }4. 面向?qū)ο?#xff1a;
封裝:把對象的屬性封裝成私有,對外提供set、get方法;
抽象:把現(xiàn)實生活中的對象抽象為類;
繼承:遺產(chǎn)的繼承;
多態(tài):所有子類型對象,都可以被當做一致的父類型來處理(向上轉(zhuǎn)型、向下轉(zhuǎn)型)
5. “==” 和?equals的區(qū)別:
==:是用來判斷兩個變量的值是否相等,變量可以分為基本數(shù)據(jù)類型和引用類型;
如果是基本數(shù)據(jù)類型的變量就直接比較值,而引用類型需要比較對應(yīng)的內(nèi)存地址;
equals:用來比較兩個對象長的是否一樣,判斷兩個對象的某些特征是否一樣;
對象一般做比較時,實際上就是調(diào)用對象的equals方法進行比較;
6. 解釋String和StringBuilder、StringBuffer的區(qū)別:
在java中,提供了3個類,String、StringBuilder、StringBuffer來表示和操作字符串,字符串就是多個字符的集合;
String:是內(nèi)容不可變的字符串;?String a = new String("aaa");
因為String底層使用了一個不可變的字符數(shù)組(private final char value[];);
StringBuilder和StringBuffer是內(nèi)容可以改變的字符串(可以使用append方法進行追加內(nèi)容);
StringBuilder和StringBuffer底層沒有使用final修飾;?(?char[] value;)
經(jīng)典案例就是:拼接字符串(不能使用String進行拼接,要使用StringBuilder或者StringBuffer);
StringBuilder sb = new StringBuilder(); sb.append("a").append("b");String c = "a"+"b"; //創(chuàng)建了很多的中間對象StringBuilder:線程不安全,效率較高;
?
StringBuffer:線程安全,效率較低;
?7. Java中的集合有哪些:
7.1)java中的集合分為值(value)和 key-value 兩種格式;
7.2)存儲值的又分為List 和 Set,存儲key-value的為Map;
7.3)List 和 Set的區(qū)別:
List是有序的,可以重復(fù)的;(常用的有ArrayList 和 LinkedList)
Set是無序的,不可以重復(fù)的;
重復(fù)與否:是根據(jù)equals 和 hashCode來判斷的,也就是說如果一個對象要存儲在Set里,必須重寫equals?和 hashCode方法;
8. ArrayList 和 LinkedList的區(qū)別和使用場景:
8.1)ArrayList 底層使用的是數(shù)組;LinkedList底層使用的是鏈表;
數(shù)組的特點:因為具有索引,所以查詢特定元素比較快;而插入、刪除比較慢(因為數(shù)組在內(nèi)存中是一塊連續(xù)的內(nèi)存,在插入和刪除時需要移動內(nèi)存);
鏈表的特點:鏈表不要求內(nèi)存是連續(xù)的,在當前元素中存放下一個或上一個元素的地址,查詢時需要從頭部開始,一個一個的開始找索引,所以查詢效率低;
而插入時不需要移動內(nèi)存,只需改變引用指向即可,所以插入或者刪除的效率高;
ArrayList 使用在查詢比較多,插入和刪除比較少的情況;
LinkedList使用在查詢比較少,插入和刪除比較多的情況;
9. 解釋HashMap和HashTable的區(qū)別:
9.1 HashMap和HashTable他們都可以用來存儲key-value的數(shù)據(jù),但是他們也有區(qū)別;
9.2 HashMap是可以把null作為key或者value的,而HashTable是不可以的;
9.3 HashMap是線程不安全的,效率較高,而HashTable是線程安全的,效率較低;
問題:即想線程安全,又想效率高?怎么解決?
ConcurrentHashMap(jdk1.5后引入的):通過把整個Map分為N個Segment(類似HashTable),可以提供相同的線程安全,但是效率提升N倍,默認提升16倍;
?
10. 實現(xiàn)一個拷貝文件的工具類使用字節(jié)流還是字節(jié)流?
10.1我們拷貝的文件不確定時,只包含字符流,有可能有字節(jié)流(拷貝圖片、聲音、圖像等);為了考慮到通用性,要使用字節(jié)流;
11. 談一下線程的幾種實現(xiàn)方式?
11.1繼承Thread類實現(xiàn);
11.2通過實現(xiàn)Runable接口實現(xiàn);
優(yōu)缺點:繼承擴展性不強,java中只支持單繼承,如果一個類繼承Thread就不能繼承其他的類了;
11.3怎么啟動?(啟動線程使用start,而啟動了以后執(zhí)行的是run方法)
package com.yikuan.test;public class MyThread{public static void main(String[] args) {Thread thread = new Thread(new TestThread());thread.setName("aaa");thread.start();Thread th = new Thread(new TestThread2());
thread.setName("bbb");th.start();} }class TestThread extends Thread{@Overridepublic void run() {System.out.println("Thread-Demo");} }class TestThread2 implements Runnable{@Overridepublic void run() {System.out.println("實現(xiàn)Runable接口");} }
11.4怎么區(qū)分線程?在一個系統(tǒng)中有很多線程,每個線程都會打印日志,我想?yún)^(qū)分是哪個線程打印的?
設(shè)置一個線程名(“線程名稱”);這是一種規(guī)范,在創(chuàng)建線程完成后都需要設(shè)置名稱;
11.5線程并發(fā)庫?
簡單了解過;JDK1.5增加的,這一引進給java線程的管理和使用提供了強大的便利性;
java.util.concurrent包中提供了對線程的優(yōu)化、管理等各項操作,這個包提供了線程的運行,線程池的創(chuàng)建,線程生命周期的控制;
java通過Executors提供了四個靜態(tài)方法創(chuàng)建線程池;
可以緩存的線程池:newCacheThreadPool;
創(chuàng)建一個定長的線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待;newFixedThreadPool;
創(chuàng)建一個定長的線程池,支持定時及周期性任務(wù)執(zhí)行,newScheduledThreadPool;
創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO、LIFO、優(yōu)先級)執(zhí)行,newSingleThreadExecutor;
線程池的作用:(連接池也是一樣!)
1.限定線程的個數(shù),不會導(dǎo)致由于線程過多而系統(tǒng)運行緩慢或崩潰;
2.線程池不需要每次都去創(chuàng)建或銷毀,節(jié)約了資源,響應(yīng)時間更快;
12. 講一下什么是設(shè)計模式?常用的設(shè)計模式有哪些?
12.1設(shè)計模式就是經(jīng)過前人無數(shù)次的實踐總結(jié)出的,在設(shè)計過程中可以反復(fù)使用的,可以解決特定問題的設(shè)計方法;
12.2常用的設(shè)計模式:
單例設(shè)計模式:
三部曲:1.構(gòu)造方法私有化,讓除了自己類能創(chuàng)建外,其他地方都不能創(chuàng)建;
2.在自己的類中創(chuàng)建一個單實例;
3.提供一個方法獲取該實例對象;
飽漢模式:是一出來就創(chuàng)建單實例;
饑漢模式:需要的時候才創(chuàng)建;創(chuàng)建時需要進行方法同步;
工廠設(shè)計模式:
Spring IOC(我們專門提供一個工廠,來創(chuàng)建某一個對象的實例,也就是說對象的創(chuàng)建交給一個工廠去創(chuàng)建)
代理設(shè)計模式
Spring AOP(動態(tài)代理)
包裝設(shè)計模式
單例Demo:
package com.yikuan.test; /*** 單例模式之---經(jīng)典飽漢模式* @author Administrator**/ public class PersonFactory {//構(gòu)造方法私有化private PersonFactory(){}//提供一個實例 private static PersonFactory instance = new PersonFactory();//提供方法獲取public static PersonFactory getInstance(){return instance;}public static void main(String[] args) {//獲取實例就可以調(diào)用對應(yīng)的方法 PersonFactory.instance.toString();} } package com.yikuan.test; /*** 單例模式之---經(jīng)典饑漢模式* @author Administrator**/ public class PersonFactorys {//構(gòu)造方法私有化private PersonFactorys() {}//提供一個實例private static PersonFactorys instance = null;//提供方法獲取public synchronized static PersonFactorys getInstance(){if(instance == null){instance = new PersonFactorys();}return instance;}public static void main(String[] args) {//獲取實例就可以調(diào)用對應(yīng)的方法 PersonFactorys.instance.toString();} }?
轉(zhuǎn)載于:https://www.cnblogs.com/yikuan-919/p/9902921.html
總結(jié)
- 上一篇: 利用js-xlsx.js插件实现Exce
- 下一篇: 我应该采用 Java 12 还是坚持使用