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

面試 | 高德地圖開獎了,什么水平?

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

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

大家好,我是小林。

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

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

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

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

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

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

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

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

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

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

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

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

26k x 16 = 41.6w

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

30k x 16 + ?6w 簽字費 = 54w

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

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

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

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

高德二面八股

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

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

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

    數(shù)值型:整數(shù)類型(byte、short、int、long)和浮點類型(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=3140,3.14E-3就是3.14/1000=0.00314

注意一下幾點:

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

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

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

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

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

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

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

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

hashmap為什么紅黑樹?

如果多個鍵映射到同一個槽位,hashmap會以鏈表的形式存儲在同一個槽位上,因為鏈表的查詢時間是O(n),所以沖突很嚴(yán)重,一個索引上的鏈表非常長,效率就很低了。

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

線程間通信方式有哪些?

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

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

notify():喚醒在此對象監(jiān)視器上等待的單個線程。

notifyAll():喚醒在此對象監(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 更靈活的鎖機制,Condition 接口則配合 Lock 實現(xiàn)線程間的等待 / 通知機制。

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

signal():喚醒一個等待在該Condition上的線程。

signalAll():喚醒所有等待在該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)一個變量被聲明為 volatile 時,它會保證對該變量的寫操作會立即刷新到主內(nèi)存中,而讀操作會從主內(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 是一個同步輔助類,它允許一個或多個線程等待其他線程完成操作。

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

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

await():使當(dāng)前線程等待,直到計數(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 是一個同步輔助類,它允許一組線程相互等待,直到所有線程都到達某個公共屏障點。

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

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

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("所有線程都到達屏障點");
????????});

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

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

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

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

release():釋放一個許可。

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)鍵字來同步代碼塊或方法,確保同一時刻只有一個線程可以訪問這些代碼。對象鎖是通過synchronized關(guān)鍵字鎖定對象的監(jiān)視器(monitor)來實現(xiàn)的。

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

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

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

public?volatile?int?sharedVariable;

Lock接口和ReentrantLock類:java.util.concurrent.locks.Lock接口提供了比synchronized更強大的鎖定機制,ReentrantLock是一個實現(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類可以為每個線程提供獨立的變量副本,這樣每個線程都擁有自己的變量,消除了競爭條件。

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

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

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

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

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

鎖的對象不同:

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

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

作用范圍不同:

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

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

多實例場景影響不同:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#?du 命令的參數(shù):
#??-a:顯示所有文件和目錄的磁盤使用情況,而不僅僅是目錄。
#??-h:以人類可讀的格式顯示文件大小(如 K、M、G)。
#? .:表示當(dāng)前目錄。
#?sort 命令的參數(shù):
#??-r:以降序排序。
#??-h:按照人類可讀的數(shù)字大小進行排序。
#?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題:查某個班級下所有學(xué)生的選課情況

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

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

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

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

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

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

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

要查詢某個班級(例如班級名稱為 '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ì)介紹下實習(xí),根據(jù)實習(xí)隨便問了問閑聊,喜歡的業(yè)務(wù),導(dǎo)師情況,實習(xí)時間等等。
高德地圖

高德地圖

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

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

查看更多

相關(guān)推薦