• 正文
    • Java基礎(chǔ)類型有哪些?
    • Java常用數(shù)據(jù)結(jié)構(gòu)有哪些?
    • hashmap為什么紅黑樹?
    • 線程間通信方式有哪些?
    • 如何保證線程安全?
    • synchronized鎖靜態(tài)方法和普通方法區(qū)別?
    • jvm內(nèi)存模型介紹一下?
    • linux命令 如何查看當(dāng)前目錄下大文件?
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

面試 | 高德地圖開獎(jiǎng)了,什么水平?

02/06 11:10
743
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

圖解學(xué)習(xí)網(wǎng)站:https://xiaolincoding.com

大家好,我是小林。

春招會(huì)在這個(gè)月陸陸續(xù)續(xù)開始了,等到 3 月份的時(shí)候,就會(huì)有大量的公司開啟春招了。

社招有金三銀四,25 屆校招有春季校園招聘,26 屆有春招實(shí)習(xí)的招聘,想要備戰(zhàn)春招的同學(xué),得恢復(fù)學(xué)習(xí)的狀態(tài)了。

那到底如何準(zhǔn)備呢?Java 技術(shù)面試主要是考察三大方向:八股+項(xiàng)目+算法

    • Java八股:Java基礎(chǔ)、JUC、JVM、SSM、MySQL、Redis、消息隊(duì)列、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、微服務(wù)等基礎(chǔ)知識(shí),這些都是互聯(lián)網(wǎng)公司喜歡考察的知識(shí)點(diǎn),大家可以根據(jù)面經(jīng),去抓住這些技術(shù)專項(xiàng)里哪些是熱點(diǎn)題目,

以面試作為驅(qū)動(dòng)力

    • ,高效地復(fù)習(xí)八股文,擊破熱點(diǎn)題目,大家可能會(huì)遇到兩個(gè)問題:一個(gè)是感覺到很慌,認(rèn)為自己什么都不會(huì),看一個(gè)面經(jīng)慌一次;另一個(gè)是感覺到很枯燥但又不敢不看。不管是哪一個(gè)問題,都需要

靜下心來,戒驕戒躁,迅速調(diào)整心態(tài),不要亂了陣腳

    • ,那么面試八股這一關(guān)就沒什么問題了。項(xiàng)目:準(zhǔn)備的項(xiàng)目一定要是自己非常熟悉的項(xiàng)目,起碼寫到簡(jiǎn)歷當(dāng)中的功能點(diǎn)能夠經(jīng)得起面試官的盤問。一般面試官也不會(huì)問的特別復(fù)雜,只要準(zhǔn)備充分,都是可以回答上來的,比如最常問的幾個(gè)項(xiàng)目問題:「你項(xiàng)目最大的難點(diǎn)是什么?怎么解決的?」、「你項(xiàng)目的架構(gòu)是怎么樣的?」等等,不熟悉的功能點(diǎn)最好不要寫,不打無準(zhǔn)備之仗。準(zhǔn)備的項(xiàng)目最好是兩個(gè)以上,一個(gè)可以為Web前后端項(xiàng)目,另一個(gè)可以為框架開發(fā)、中間件開發(fā)。這樣一方面可以體現(xiàn)你業(yè)務(wù)能力okay,熟悉常見的開發(fā)場(chǎng)景,當(dāng)mentor或leader派活的時(shí)候,你知道如何下手去做,有自己的實(shí)現(xiàn)思路;另一方面可以體現(xiàn)你有一定的鉆研自學(xué)能力與解決問題能力,能夠啃動(dòng)硬骨頭。算法:對(duì)于算法題準(zhǔn)備,

沒有任何捷徑除非天賦加持,刷就完了

    ,時(shí)間長(zhǎng)且充裕的刷《代碼隨想錄]》就夠應(yīng)對(duì)絕大多數(shù)互聯(lián)網(wǎng)公司的算法手撕了,時(shí)間短且緊的刷 leetcode Top100 也可以,看題10分鐘沒思路的話就直接看題解,重復(fù)的刷題,反復(fù)不斷地刻意訓(xùn)練,直到背過為止。

之前帶大家拆解阿里巴巴的淘寶、螞蟻金服、餓了么、阿里云的崗位,這次我們來看看阿里旗下的高德地圖的!

先來看看高德地圖 25 屆開發(fā)崗的校招薪資,目前收集到的信息不多,就下面兩位同學(xué):

26k x 16 = 41.6w

    • ,同學(xué)背景碩士 211,工作地點(diǎn)北京

30k x 16 + ?6w 簽字費(fèi) = 54w

    (第一年的年包),同學(xué)背景碩士 985,工作地點(diǎn)北京

不過阿里系旗下的集團(tuán)校招薪資都差距不大,所以可以用淘寶、阿里云等阿里集團(tuán)開獎(jiǎng)的情況來作為參考,那么第一個(gè)同學(xué)估計(jì) sp offer、第二同學(xué)估計(jì)是 ssp offer。

那么接下來,咱們來看看阿里高德地圖的 Java 實(shí)習(xí)二面面經(jīng),算是比較簡(jiǎn)單和基礎(chǔ)的,就考察了這幾個(gè)方面:Java基礎(chǔ)、Java 并發(fā)、JVM、Linux 命令、SQL。

雖然簡(jiǎn)單,但是還是很經(jīng)典的問題,可以作為一個(gè)快速考察自己的基礎(chǔ)的面經(jīng),大家自己對(duì)照看看,如果是你面臨這場(chǎng)面試,是否能夠流暢的口述出來。

高德二面八股

Java基礎(chǔ)類型有哪些?

Java支持?jǐn)?shù)據(jù)類型分為兩類:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

基本數(shù)據(jù)類型共有8種,可以分為三類:

    數(shù)值型:整數(shù)類型(byte、short、int、long)和浮點(diǎn)類型(float、double)字符型:char布爾型:boolean

8種基本數(shù)據(jù)類型的默認(rèn)值、位數(shù)、取值范圍,如下表所示:

Float和Double的最小值和最大值都是以科學(xué)記數(shù)法的形式輸出的,結(jié)尾的“E+數(shù)字”表示E之前的數(shù)字要乘以10的多少倍。比如3.14E3就是3.14×1000=31403.14E-3就是3.14/1000=0.00314

注意一下幾點(diǎn):

    Java八種基本數(shù)據(jù)類型的字節(jié)數(shù):1字節(jié)(byte、boolean)、 2字節(jié)(short、char)、4字節(jié)(int、float)、8字節(jié)(long、double)浮點(diǎn)數(shù)的默認(rèn)類型為double(如果需要聲明一個(gè)常量為float型,則必須要在末尾加上f或F)整數(shù)的默認(rèn)類型為int(聲明Long型在末尾加上l或者L)八種基本數(shù)據(jù)類型的包裝類:除了char的是Character、int類型的是Integer,其他都是首字母大寫char類型是無符號(hào)的,不能為負(fù),所以是0開始的

Java常用數(shù)據(jù)結(jié)構(gòu)有哪些?

List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素的插入位置,用戶能根據(jù)索引訪問List中元素。常用的實(shí)現(xiàn)List的類有LinkedList,ArrayList,Vector,Stack。

    ArrayList 是容量可變的非線程安全列表,其底層使用數(shù)組實(shí)現(xiàn)。當(dāng)發(fā)生擴(kuò)容時(shí),會(huì)創(chuàng)建更大的數(shù)組,并把原數(shù)組復(fù)制到新數(shù)組。ArrayList支持對(duì)元素的快速隨機(jī)訪問,但插入與刪除速度很慢。LinkedList本質(zhì)是一個(gè)雙向鏈表,與ArrayList相比,其插入和刪除速度更快,但隨機(jī)訪問速度更慢。Vector 與 ArrayList 類似,底層也是基于數(shù)組實(shí)現(xiàn),特點(diǎn)是線程安全,但效率相對(duì)較低,因?yàn)槠浞椒ù蠖啾?synchronized 修飾

Map 是一個(gè)鍵值對(duì)集合,存儲(chǔ)鍵、值和之間的映射。Key 無序,唯一;value 不要求有序,允許重復(fù)。Map 沒有繼承于 Collection 接口,從 Map 集合中檢索元素時(shí),只要給出鍵對(duì)象,就會(huì)返回對(duì)應(yīng)的值對(duì)象。主要實(shí)現(xiàn)有TreeMap、HashMap、HashTable、LinkedHashMap、ConcurrentHashMap

    HashMap:JDK1.8 之前 HashMap 由數(shù)組+鏈表組成的,數(shù)組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的(“拉鏈法”解決沖突),JDK1.8 以后在解決哈希沖突時(shí)有了較大的變化,當(dāng)鏈表長(zhǎng)度大于閾值(默認(rèn)為 8)時(shí),將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間LinkedHashMap:LinkedHashMap 繼承自 HashMap,所以它的底層仍然是基于拉鏈?zhǔn)缴⒘薪Y(jié)構(gòu)即由數(shù)組和鏈表或紅黑樹組成。另外,LinkedHashMap 在上面結(jié)構(gòu)的基礎(chǔ)上,增加了一條雙向鏈表,使得上面的結(jié)構(gòu)可以保持鍵值對(duì)的插入順序。同時(shí)通過對(duì)鏈表進(jìn)行相應(yīng)的操作,實(shí)現(xiàn)了訪問順序相關(guān)邏輯。HashTable:數(shù)組+鏈表組成的,數(shù)組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的,HashTable 是線程安全的,其方法使用 synchronized 修飾,且不允許 null 鍵和 null 值。TreeMap:紅黑樹(自平衡的排序二叉樹)實(shí)現(xiàn),Key 按自然順序或 Comparator 排序。ConcurrentHashMap:采用 Node 數(shù)組 + 鏈表 + 紅黑樹實(shí)現(xiàn),是線程安全的。JDK1.8 以前使用 Segment 鎖(分段鎖),JDK1.8 以后使用 volatile + CAS 或者 synchronized 保證線程安全。其中,Segment 鎖是將整個(gè)數(shù)據(jù)結(jié)構(gòu)分成多個(gè)段,每個(gè)段有獨(dú)立的鎖,不同段的操作可以并發(fā)進(jìn)行;volatile 保證變量的可見性,CAS 是一種無鎖算法,synchronized 用于對(duì)鏈表或紅黑樹進(jìn)行加鎖操作。

Set不允許存在重復(fù)的元素,與List不同,Set中的元素是無序的(TreeSet 除外)。常用的實(shí)現(xiàn)有HashSet,LinkedHashSet和TreeSet。

    HashSet通過HashMap實(shí)現(xiàn),HashMap的Key即HashSet存儲(chǔ)的元素,所有Key都是用相同的Value,一個(gè)名為PRESENT的Object類型常量。使用Key保證元素唯一性,但不保證有序性。由于HashSet是HashMap實(shí)現(xiàn)的,因此線程不安全。LinkedHashSet繼承自HashSet,通過LinkedHashMap實(shí)現(xiàn),使用雙向鏈表維護(hù)元素插入順序。TreeSet通過TreeMap實(shí)現(xiàn)的,添加元素到集合時(shí)按照比較規(guī)則將其插入合適的位置,保證插入后的集合仍然有序。

hashmap為什么紅黑樹?

如果多個(gè)鍵映射到同一個(gè)槽位,hashmap會(huì)以鏈表的形式存儲(chǔ)在同一個(gè)槽位上,因?yàn)殒湵淼牟樵儠r(shí)間是O(n),所以沖突很嚴(yán)重,一個(gè)索引上的鏈表非常長(zhǎng),效率就很低了。

所以在 JDK 1.8 版本的時(shí)候做了優(yōu)化,當(dāng)一個(gè)鏈表的長(zhǎng)度超過8的時(shí)候就轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu),不再使用鏈表存儲(chǔ),而是使用紅黑樹,查找時(shí)使用紅黑樹,時(shí)間復(fù)雜度O(log n),可以提高查詢性能,但是在數(shù)量較少時(shí),即數(shù)量小于6時(shí),會(huì)將紅黑樹轉(zhuǎn)換回鏈表。

線程間通信方式有哪些?

1、Object 類的 wait()、notify() 和 notifyAll() 方法。這是 Java 中最基礎(chǔ)的線程間通信方式,基于對(duì)象的監(jiān)視器(鎖)機(jī)制。

wait():使當(dāng)前線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用該對(duì)象的notify()notifyAll()方法。

notify():?jiǎn)拘言诖藢?duì)象監(jiān)視器上等待的單個(gè)線程。

notifyAll():?jiǎn)拘言诖藢?duì)象監(jiān)視器上等待的所有線程。

class?SharedObject?{
????public?synchronized?void?consumerMethod()?throws?InterruptedException?{
????????while?(/*?條件不滿足?*/)?{
????????????wait();
????????}
????????//?執(zhí)行相應(yīng)操作
????}

????public?synchronized?void?producerMethod()?{
????????//?執(zhí)行相應(yīng)操作
????????notify();?//?或者?notifyAll()
????}
}

2、LockCondition 接口。Lock 接口提供了比 synchronized 更靈活的鎖機(jī)制,Condition 接口則配合 Lock 實(shí)現(xiàn)線程間的等待 / 通知機(jī)制。

await():使當(dāng)前線程進(jìn)入等待狀態(tài),直到被其他線程喚醒。

signal():?jiǎn)拘岩粋€(gè)等待在該Condition上的線程。

signalAll():?jiǎn)拘阉械却谠?code>Condition上的線程。

import?java.util.concurrent.locks.Condition;
import?java.util.concurrent.locks.Lock;
import?java.util.concurrent.locks.ReentrantLock;

class?SharedResource?{
????private?final?Lock?lock?=?new?ReentrantLock();
????private?final?Condition?condition?=?lock.newCondition();

????public?void?consumer()?throws?InterruptedException?{
????????lock.lock();
????????try?{
????????????while?(/*?條件不滿足?*/)?{
????????????????condition.await();
????????????}
????????????//?執(zhí)行相應(yīng)操作
????????}?finally?{
????????????lock.unlock();
????????}
????}

????public?void?producer()?{
????????lock.lock();
????????try?{
????????????//?執(zhí)行相應(yīng)操作
????????????condition.signal();?//?或者?signalAll()
????????}?finally?{
????????????lock.unlock();
????????}
????}
}

3、volatile 關(guān)鍵字。volatile 關(guān)鍵字用于保證變量的可見性,即當(dāng)一個(gè)變量被聲明為 volatile 時(shí),它會(huì)保證對(duì)該變量的寫操作會(huì)立即刷新到主內(nèi)存中,而讀操作會(huì)從主內(nèi)存中讀取最新的值。

class?VolatileExample?{
????private?volatile?boolean?flag?=?false;

????public?void?writer()?{
????????flag?=?true;
????}

????public?void?reader()?{
????????while?(!flag)?{
????????????//?等待
????????}
????????//?執(zhí)行相應(yīng)操作
????}
}

4、CountDownLatch。CountDownLatch 是一個(gè)同步輔助類,它允許一個(gè)或多個(gè)線程等待其他線程完成操作。

CountDownLatch(int count):構(gòu)造函數(shù),指定需要等待的線程數(shù)量。

countDown():減少計(jì)數(shù)器的值。

await():使當(dāng)前線程等待,直到計(jì)數(shù)器的值為 0。

import?java.util.concurrent.CountDownLatch;

public?class?CountDownLatchExample?{
????public?static?void?main(String[]?args)?throws?InterruptedException?{
????????int?threadCount?=?3;
????????CountDownLatch?latch?=?new?CountDownLatch(threadCount);

????????for?(int?i?=?0;?i?<?threadCount;?i++)?{
????????????new?Thread(()?->?{
????????????????try?{
????????????????????//?執(zhí)行任務(wù)
????????????????????System.out.println(Thread.currentThread().getName()?+?"?完成任務(wù)");
????????????????}?finally?{
????????????????????latch.countDown();
????????????????}
????????????}).start();
????????}

????????latch.await();
????????System.out.println("所有線程任務(wù)完成");
????}
}

5、CyclicBarrier。CyclicBarrier 是一個(gè)同步輔助類,它允許一組線程相互等待,直到所有線程都到達(dá)某個(gè)公共屏障點(diǎn)。

CyclicBarrier(int parties, Runnable barrierAction):構(gòu)造函數(shù),指定參與的線程數(shù)量和所有線程到達(dá)屏障點(diǎn)后要執(zhí)行的操作。

await():使當(dāng)前線程等待,直到所有線程都到達(dá)屏障點(diǎn)。

import?java.util.concurrent.CyclicBarrier;

public?class?CyclicBarrierExample?{
????public?static?void?main(String[]?args)?{
????????int?threadCount?=?3;
????????CyclicBarrier?barrier?=?new?CyclicBarrier(threadCount,?()?->?{
????????????System.out.println("所有線程都到達(dá)屏障點(diǎn)");
????????});

????????for?(int?i?=?0;?i?<?threadCount;?i++)?{
????????????new?Thread(()?->?{
????????????????try?{
????????????????????//?執(zhí)行任務(wù)
????????????????????System.out.println(Thread.currentThread().getName()?+?"?到達(dá)屏障點(diǎn)");
????????????????????barrier.await();
????????????????????//?繼續(xù)執(zhí)行后續(xù)任務(wù)
????????????????}?catch?(Exception?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????}).start();
????????}
????}
}

6、Semaphore。Semaphore 是一個(gè)計(jì)數(shù)信號(hào)量,它可以控制同時(shí)訪問特定資源的線程數(shù)量。

Semaphore(int permits):構(gòu)造函數(shù),指定信號(hào)量的初始許可數(shù)量。

acquire():獲取一個(gè)許可,如果沒有可用許可則阻塞。

release():釋放一個(gè)許可。

import?java.util.concurrent.Semaphore;

public?class?SemaphoreExample?{
????public?static?void?main(String[]?args)?{
????????int?permitCount?=?2;
????????Semaphore?semaphore?=?new?Semaphore(permitCount);

????????for?(int?i?=?0;?i?<?5;?i++)?{
????????????new?Thread(()?->?{
????????????????try?{
????????????????????semaphore.acquire();
????????????????????System.out.println(Thread.currentThread().getName()?+?"?獲得許可");
????????????????????//?執(zhí)行任務(wù)
????????????????????Thread.sleep(1000);
????????????????}?catch?(InterruptedException?e)?{
????????????????????e.printStackTrace();
????????????????}?finally?{
????????????????????semaphore.release();
????????????????????System.out.println(Thread.currentThread().getName()?+?"?釋放許可");
????????????????}
????????????}).start();
????????}
????}
}

如何保證線程安全?

synchronized關(guān)鍵字:可以使用synchronized關(guān)鍵字來同步代碼塊或方法,確保同一時(shí)刻只有一個(gè)線程可以訪問這些代碼。對(duì)象鎖是通過synchronized關(guān)鍵字鎖定對(duì)象的監(jiān)視器(monitor)來實(shí)現(xiàn)的。

public?synchronized?void?someMethod()?{?/*?...?*/?}

public?void?anotherMethod()?{
synchronized?(someObject)?{
/*?...?*/
}
}

volatile關(guān)鍵字:volatile關(guān)鍵字用于變量,確保所有線程看到的是該變量的最新值,而不是可能存儲(chǔ)在本地寄存器中的副本。

public?volatile?int?sharedVariable;

Lock接口和ReentrantLock類:java.util.concurrent.locks.Lock接口提供了比synchronized更強(qiáng)大的鎖定機(jī)制,ReentrantLock是一個(gè)實(shí)現(xiàn)該接口的例子,提供了更靈活的鎖管理和更高的性能。

private?final?ReentrantLock?lock?=?new?ReentrantLock();

public?void?someMethod()?{
????lock.lock();
????try?{
????????/*?...?*/
????}?finally?{
????????lock.unlock();
????}
}

原子類:Java并發(fā)庫(java.util.concurrent.atomic)提供了原子類,如AtomicInteger、AtomicLong等,這些類提供了原子操作,可以用于更新基本類型的變量而無需額外的同步。

示例:

AtomicInteger?counter?=?new?AtomicInteger(0);

int?newValue?=?counter.incrementAndGet();

線程局部變量:ThreadLocal類可以為每個(gè)線程提供獨(dú)立的變量副本,這樣每個(gè)線程都擁有自己的變量,消除了競(jìng)爭(zhēng)條件。

ThreadLocal<Integer>?threadLocalVar?=?new?ThreadLocal<>();

threadLocalVar.set(10);
int?value?=?threadLocalVar.get();

并發(fā)集合:使用java.util.concurrent包中的線程安全集合,如ConcurrentHashMap、ConcurrentLinkedQueue等,這些集合內(nèi)部已經(jīng)實(shí)現(xiàn)了線程安全的邏輯。

JUC工具類: 使用java.util.concurrent包中的一些工具類可以用于控制線程間的同步和協(xié)作。例如:SemaphoreCyclicBarrier等。

synchronized鎖靜態(tài)方法和普通方法區(qū)別?

鎖的對(duì)象不同:

普通方法:鎖的是當(dāng)前對(duì)象實(shí)例(this)。同一對(duì)象實(shí)例的synchronized普通方法,同一時(shí)間只能被一個(gè)線程訪問;不同對(duì)象實(shí)例間互不影響,可被不同線程同時(shí)訪問各自的同步普通方法。

靜態(tài)方法:鎖的是當(dāng)前類的Class對(duì)象。由于類的Class對(duì)象全局唯一,無論多少個(gè)對(duì)象實(shí)例,該靜態(tài)同步方法同一時(shí)間只能被一個(gè)線程訪問。

作用范圍不同:

普通方法:僅對(duì)同一對(duì)象實(shí)例的同步方法調(diào)用互斥,不同對(duì)象實(shí)例的同步普通方法可并行執(zhí)行。

靜態(tài)方法:對(duì)整個(gè)類的所有實(shí)例的該靜態(tài)方法調(diào)用都互斥,一個(gè)線程進(jìn)入靜態(tài)同步方法,其他線程無法進(jìn)入同一類任何實(shí)例的該方法。

多實(shí)例場(chǎng)景影響不同:

普通方法多線程訪問不同對(duì)象實(shí)例的同步普通方法時(shí),可同時(shí)執(zhí)行。

靜態(tài)方法:不管有多少對(duì)象實(shí)例,同一時(shí)間僅一個(gè)線程能執(zhí)行該靜態(tài)同步方法。

jvm內(nèi)存模型介紹一下?

根據(jù) JDK 8 規(guī)范,JVM 運(yùn)行時(shí)內(nèi)存共分為虛擬機(jī)棧、堆、元空間、程序計(jì)數(shù)器、本地方法棧五個(gè)部分。還有一部分內(nèi)存叫直接內(nèi)存,屬于操作系統(tǒng)的本地內(nèi)存,也是可以直接操作的。

JVM的內(nèi)存結(jié)構(gòu)主要分為以下幾個(gè)部分:

元空間:元空間的本質(zhì)和永久代類似,都是對(duì) JVM 規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。

Java 虛擬機(jī)棧:每個(gè)線程有一個(gè)私有的棧,隨著線程的創(chuàng)建而創(chuàng)建。棧里面存著的是一種叫 “棧幀” 的東西,每個(gè)方法會(huì)創(chuàng)建一個(gè)棧幀,棧幀中存放了局部變量表(基本數(shù)據(jù)類型和對(duì)象引用)、操作數(shù)棧、方法出口等信息。棧的大小可以固定也可以動(dòng)態(tài)擴(kuò)展。

本地方法棧:與虛擬機(jī)棧類似,區(qū)別是虛擬機(jī)棧執(zhí)行 Java 方法,本地方法棧執(zhí)行 native 方法。在虛擬機(jī)規(guī)范中對(duì)本地方法棧中方法使用的語言、使用方法與數(shù)據(jù)結(jié)構(gòu)沒有強(qiáng)制規(guī)定,因此虛擬機(jī)可以自由實(shí)現(xiàn)它。

程序計(jì)數(shù)器:程序計(jì)數(shù)器可以看成是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。在任何一個(gè)確定的時(shí)刻,一個(gè)處理器(對(duì)于多內(nèi)核來說是一個(gè)內(nèi)核)都只會(huì)執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要一個(gè)獨(dú)立的程序計(jì)數(shù)器,我們稱這類內(nèi)存區(qū)域?yàn)?“線程私有” 內(nèi)存。

堆內(nèi)存:堆內(nèi)存是 JVM 所有線程共享的部分,在虛擬機(jī)啟動(dòng)的時(shí)候就已經(jīng)創(chuàng)建。所有的對(duì)象實(shí)例和數(shù)組都在堆上分配,這部分空間可通過 GC 進(jìn)行回收。當(dāng)申請(qǐng)不到空間時(shí)會(huì)拋出 OutOfMemoryError。堆是 JVM 內(nèi)存占用最大、管理最復(fù)雜的一個(gè)區(qū)域。JDK 1.8 后,字符串常量池和運(yùn)行時(shí)常量池從永久代中剝離出來,存放在堆中。

直接內(nèi)存:直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是 Java 虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。在 JDK 1.4 中新加入了 NIO 類,引入了一種基于通道 (Channel) 與緩沖區(qū)(Buffer)的 I/O 方式,它可以使用 native 函數(shù)庫直接分配堆外內(nèi)存,然后通過一個(gè)存儲(chǔ)在 Java 堆中的 DirectByteBuffer 對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作。這樣能在一些場(chǎng)景中顯著提高性能,因?yàn)楸苊饬嗽?Java 堆和 Native 堆中來回復(fù)制數(shù)據(jù)。

linux命令 查看當(dāng)前目錄下文件?

ls 命令是查看文件和目錄的命令,它能列出當(dāng)前目錄下的內(nèi)容。

帶上 -l 參數(shù),則以長(zhǎng)格式顯示文件和目錄的詳細(xì)信息,包括文件權(quán)限、所有者、組、大小、修改時(shí)間等。

linux命令 如何查看當(dāng)前目錄下大文件?

du(disk usage)命令用于估算文件空間使用量,sort 命令用于對(duì)文本進(jìn)行排序。結(jié)合這兩個(gè)命令可以找出當(dāng)前目錄下占用空間較大的文件。

下面的命令會(huì)列出當(dāng)前目錄下所有文件和子目錄的磁盤使用情況,并按文件大小降序排序,顯示前 10 個(gè)最大的文件或目錄:

#?du 命令的參數(shù):
#??-a:顯示所有文件和目錄的磁盤使用情況,而不僅僅是目錄。
#??-h:以人類可讀的格式顯示文件大小(如 K、M、G)。
#? .:表示當(dāng)前目錄。
#?sort 命令的參數(shù):
#??-r:以降序排序。
#??-h:按照人類可讀的數(shù)字大小進(jìn)行排序。
#?head 命令的參數(shù):
#??-n 10:只顯示前 10?行。
du?-ah?.?|?sort?-rh?|?head?-n?10

linux命令日志怎么查詢關(guān)鍵字?

可以用 grep 命令來查詢文件中的關(guān)鍵字。

比如,要在日志文件(如 example.log)中查找包含 “error” 關(guān)鍵字的行,可使用如下命令:

grep?"error"?example.log

SQL題:查某個(gè)班級(jí)下所有學(xué)生的選課情況

有三張表:學(xué)生信息表、學(xué)生選課表、學(xué)生班級(jí)表

學(xué)生信息表(students)結(jié)構(gòu)如下:

CREATE?TABLE?students?(
??student_id?INT?PRIMARY?KEY, //學(xué)生的唯一標(biāo)識(shí),主鍵。
??student_name?VARCHAR(50), //學(xué)生姓名。
??class_id?INT?//學(xué)生所屬班級(jí)的標(biāo)識(shí),用于關(guān)聯(lián)班級(jí)表。
);

學(xué)生選課表(course_selections)結(jié)構(gòu)如下:

CREATE?TABLE?course_selections?(
????selection_id?INT?PRIMARY?KEY, //選課記錄的唯一標(biāo)識(shí),主鍵。
????student_id?INT, //選課學(xué)生的標(biāo)識(shí),用于關(guān)聯(lián)學(xué)生信息表。
????course_name?VARCHAR(50), //所選課程的名稱。
);

學(xué)生班級(jí)表(classes)結(jié)構(gòu)如下:

CREATE?TABLE?classes?(
????class_id?INT?PRIMARY?KEY, //班級(jí)的唯一標(biāo)識(shí),主鍵。
????class_name?VARCHAR(50)?//班級(jí)名稱。
);

要查詢某個(gè)班級(jí)(例如班級(jí)名稱為 'Class A')下所有學(xué)生的選課情況,可以使用以下 SQL 查詢語句:

SELECT?
????s.student_id,
????s.student_name,
????cs.course_name
FROM?
????students?s
JOIN?
????course_selections?cs?ON?s.student_id?=?cs.student_id
JOIN?
????classes?c?ON?s.class_id?=?c.class_id
WHERE?
????c.class_name?=?'Class?A';

其他

    再詳細(xì)介紹下實(shí)習(xí),根據(jù)實(shí)習(xí)隨便問了問閑聊,喜歡的業(yè)務(wù),導(dǎo)師情況,實(shí)習(xí)時(shí)間等等。
高德地圖

高德地圖

高德地圖官方網(wǎng)站,提供全國地圖瀏覽,地點(diǎn)搜索,公交駕車查詢服務(wù)。可同時(shí)查看商家團(tuán)購、優(yōu)惠信息。高德地圖,您的出行、生活好幫手。

高德地圖官方網(wǎng)站,提供全國地圖瀏覽,地點(diǎn)搜索,公交駕車查詢服務(wù)??赏瑫r(shí)查看商家團(tuán)購、優(yōu)惠信息。高德地圖,您的出行、生活好幫手。收起

查看更多

相關(guān)推薦