天天看點

知識點小結--20200807

2020年8月7号

1. Java面向對象程式設計的三大特性。

  • 封裝

    封裝是把一個對象屬性私有化,同時提供一些可以被外界通路的屬性的方法,如果屬性不想被外界通路,我們大可不必提供方法給外界通路。但是如果一個類沒有提供外界的通路方法,那這個類也沒有什麼意義

  • 繼承

    繼承是使用存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能。也可以用父類的功能,但不能選擇性的繼承父類,通過使用繼承,我們能夠非常友善的服用以前的代碼。

    關于繼承的三個點:

    • 子類擁有父類對象所有的屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法,子類是無法通路的,隻是擁有。
    • 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充。
    • 子類可以用自己的方式實作父類的方法。
  • 多态

    所謂多态就是指程式中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用,用在程式設計時并不确定,而是在程式運作期間才确定的,即一個引用變量到底會指向哪個類的執行個體對象,該引用變量發出的方法調用到底是哪個類中實作的方法,必須在有程式運作期間才能決定

    在Java中有兩種形式可以實作多态:繼承(多個子類對同一個方法的重寫)和接口(實作接口并覆寫接口中的統一方法)

2.String StringBuffer和StringBuilder的差別? String為什麼 是不可變的。

  • 可變性:

    簡單來說,String類中使用final關鍵字修飾字元數組來儲存字元串,private final char value[],是以String對象是不可變的

    (java9 之後改變成為bytep[]數組進行存儲字元串)

    而StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元數組儲存字元串char[]value,但是沒有用final關鍵字修飾,是以這兩個是可變的。

  • 線程安全性

    String中的對象是不可變的,也就可以了解為常量,線程安全,而AbstractStringBuilder 是 StringBuilder 與 StringBuffer的公共父類,定義了一些字元串的基本操作,如:expandCapacity、append、append、insert、indexof等公共方法。

    StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,是以是線程安全的。

    StringBuilder并沒有對方法進行加同步鎖,是以非線程安全的

  • 性能

    每次對String類型進行改變的時候,都會生成一個新的String對象,然後将指針向新的String對象。StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用StringBuilder相比使用StringBuffer僅能獲得10-15%左右的性能提升,但卻要冒線程不安全的風險

    • 操作少量資料:适用String
    • 單線程操作字元串緩沖區下操作大量資料:适用StringBuilder
    • 多線程操作字元串緩沖區下操作大量資料:使用StringBuffer

3.==與equals的差別

  • = = 他的作用是判斷兩個對象的位址是不是相等。即:判斷兩個對象是不是同一個對象(基本資料= =比較的是值,引用資料類型= =比較的是記憶體位址)
  • equals():他的作用是判斷兩個對象是否相等,但是一般有兩種使用情況:
    • 情況1:類沒有覆寫equals()方法。則通過equals()比較該類的兩個對象是,等價于通過“==”比較這兩個對象
    • 情況2:類覆寫了equals()方法。一般我們都覆寫equals()方法來比較兩個對象是否相等,若相等,則傳回true(認為這兩個對象相等)
    • String中的equals方法是被重寫過的,因為Objact的equals方法是比較的對象的記憶體位址,而String的equals方法比較的是兩個對象的值
    • 當建立String類型的對象時,虛拟機在常量池中查找有沒有已存在的值和要建立的值相同的對象,如果有則指派給目前引用,如果沒有則在常量池中重新建立一個String對象

4. 介紹hashCode與equals,為什麼要有hashCode,他們的相關規定是什麼。

  • Hashcode()

    Hashcode()的作用是擷取哈希碼,也成為散列碼;它實際上是傳回一個int整數。這個哈希碼的作用是确定該對象在哈希清單中的索引位置。Hashcode()定義在JDK的Object.java中,這就意味着Java中的任何類都包含有hashcode()函數。

    散清單存儲的是鍵值對,它的特點是:能根據“鍵”快速的檢索出對應的“值”。着其中就利用到了散列碼。(可以快速的找到需要的對象)

  • 為什麼要有hashcode

    先從“HashSet如何檢查重複為例子”說明為什麼要有哈希碼:當你把對象加入hashset時,它會先計算對象的哈希碼來判斷對象加入的位置,同時也會與該位置其他已經加入的對象的哈希碼值進行比較,如果沒有相符的哈希碼,HashSet會假設對象沒有重複出現。但是如果發現有相同的哈希碼值的對象,這時候會調用equals()方法來檢查哈希碼相等的對象是否真的相同。如果兩者相同,HashSet就不會讓其他加入操作成功。如果不同的話,就會重新散列到其他位置。(這樣做的好處是減少了equals的次數,提高了執行速度)

    可以看出,hashcode()的作用就是擷取哈希碼,也成為散列碼,它實際上是傳回一個int整數。這個哈希碼的作用是确定該對象在哈希表中的檢索位置。HashCode()在先清單中才有用,在其他的情況下是沒用的,在散清單中HashCode()的作用是擷取對象的散列碼,進而确認對象在散清單中的位置。

  • HashCode()與equals()的相關規定
    1. 如果兩個對象相等,則哈希碼一定也是相同的
    2. 兩個對象相等,對兩個對象調用equals方法都傳回true
    3. 兩個對象具有相同的哈希碼,他們也不一定相等的
    4. 如果equals方法又被覆寫過,那麼hashcode()方法也必須被覆寫
    5. Hashcod()的預設行為是對堆上的對象産生獨特值。如果沒有重寫hashCode(),則該class的兩個對象無論如何都不會相等,即這兩個對象指向相同的資料

5.簡述線程,程式,程序的基本概念,以及他們之間的關系。

線程與程序相似,但是線程是一個比程序更小的執行機關。一個程序在其執行的過程中可以産生多少個線程。與程序不同的是同類的多個線程共享同一塊記憶體空間和一組系統資源,是以系統在産生一個線程或是各個線程切換工作時,負擔要比程序小得多,也正因如此,線程也被成為輕量級程序

程式是含有指令和資料的檔案,被存儲在磁盤或其他的資料儲存設備中。也就是說程式是靜态的代碼。

程序是程式的一次執行過程,是系統運作程式的基本機關,是以程序是動态的。系統運作一個程式即是一個程序從建立,運作到消亡的過程。簡單來說,一個程序就是一個執行中的程式,它在計算機中一個指令接着一個指令地執行着,同時,每個程序還占有某些系統資源,如CPU時間,記憶體空間,檔案,輸入輸出裝置的使用權等等,換句話說,當程式在執行時,将會被作業系統載入記憶體中。線程是程序劃分成更小的運作機關。線程和程序最大的不同在于:基本上各個程序是獨立的,而各個線程咋不一定,因為統一程序中的線程極有可能互相影響。從另外一個角度來說,程序屬于作業系統範疇,主要同一段時間内,可以同時執行一個以上的程式,而線程則是在同一個程式内幾乎同時執行一個以上的程式段。

6.線程有哪些基本狀态。

  • NEW

    初始狀态,線程被建構,但是還沒有調用start()方法

  • RUNNABLE

    運作狀态,java線程将作業系統中的就緒和運作兩種狀态籠統的稱作‘運作中’

  • BLOCKED

    阻塞狀态,表示線程阻塞與鎖

  • WAITING

    等待狀态,表示線程進入等待狀态,進入該狀态表示目前線程需要等待其他線程做出一些特定動作(通知或者中斷)

  • TIME_WAITING

    逾時等待狀态,該狀态不同于WAITING,它是可以在指定的時間自行傳回的

  • TERMINATED

    終止狀态,表示線程已經執行完畢

線程建立之後它将處于NEW狀态,調用start()方法後開始運作,線程這時候處于READY(可運作)狀态。可運作狀态獲得了CPU時間片就處于RUNNING狀态。

當線程執行wait()方法之後,線程進入WAITING(等待)狀态。進入等待狀态的線程需要依靠其他線程的通知才能夠傳回到運作狀态,而TIME_WAITING(逾時等待)狀态相當于在等待狀态的基礎上增加逾時限制,比如通過sleep(long mills)方法或者wait(long mills)方法可以将Java線程至于TIMED WAITTING狀态,當逾時時間到達後JAVA線程将會傳回到RUNNABLE狀态。當線程調用同步方法時,在沒有擷取到鎖的情況下,線程将會進入到BLOCKED(阻塞)狀态。線程在執行Runnable的run()方法之後将會進入到TERMINATED(終止)狀态

7.Java中的異常處理。

在JAVA中,所有異常都有一個共同的祖先類,java.lang包中的Throwable類。Throwable:有兩個重要的子類:Exception(異常)和Error(錯誤),二者都是JAVA異常處理的重要子類,各自都包含大量子類。

  • Error(錯誤)

    是程式無法處理的錯誤,表示運作應用程式中較為嚴重的問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運作時的JVM(JAVA虛拟機)出現的問題。例如JAVA虛拟機運作錯誤,當JVM不再有繼續執行的操作所需的記憶體資源的時候,将出現OUTOFMEMORYERROR。這些異常發生時,JAVA虛拟機(JVM)一般會選擇線程終止。

    還有類似類定義錯誤、虛拟機運作錯誤,這些錯誤表示故常發生于虛拟機自身,或者發生在虛拟機視圖執行應用時,這些錯誤是不可查的,因為他們在應用程式的控制和處理能力之外,而且絕大多數是程式運作時不允許出現的狀況。對于設計合理的應用程式來說,即使确實發生了錯誤,本質上也不要試圖去處理他所引起的異常狀況。

  • Exception(異常)

    是成語本身可以處理的異常。Exception類又一個重要的子類RuntimeException。

    RuntimeException異常由JAVA虛拟機抛出。NullPointerException(要通路的變量沒有任何對象時,抛出該異常)、ArithmeticException算術異常(分母為0)和ArrayIndexOutOfBoundsException(數組下标越界)

    他們兩者的最大差別是,異常是可以被程式本身解決的,但是錯誤不可以,也不要嘗試去用程式解決‘錯誤’

8.Spring、spring boot、SpringMVC的聯系和差別

  • spring和springMvc:
  1. spring是一個一站式的輕量級的java開發架構,核心是控制反轉(IOC)和面向切面(AOP),針對于開發的WEB層(springMvc)、業務層(Ioc)、持久層(jdbcTemplate)等都提供了多種配置解決方案;
  2. springMvc是spring基礎之上的一個MVC架構,主要處理web開發的路徑映射和視圖渲染,屬于spring架構中WEB層開發的一部分;
  • springMvc和springBoot:
  1. springMvc屬于一個企業WEB開發的MVC架構,涵蓋面包括前端視圖開發、檔案配置、背景接口邏輯開發等,XML、config等配置相對比較繁瑣複雜;
  2. springBoot架構相對于springMvc架構來說,更專注于開發微服務背景接口,不開發前端視圖,同時遵循預設優于配置,簡化了插件配置流程,不需要配置xml,相對springmvc,大大簡化了配置流程;
  • springBoot和springCloud:
  1. spring boot使用了預設大于配置的理念,內建了快速開發的spring多個插件,同時自動過濾不需要配置的多餘的插件,簡化了項目的開發配置流程,一定程度上取消xml配置,是一套快速配置開發的腳手架,能快速開發單個微服務;
  2. spring cloud大部分的功能插件都是基于springBoot去實作的,springCloud關注于全局的微服務整合和管理,将多個springBoot單體微服務進行整合以及管理; springCloud依賴于springBoot開發,而springBoot可以獨立開發;
  3. Spring 架構就像一個家族,有衆多衍生産品例如 boot、security、jpa等等。但他們的基礎都是Spring的ioc、aop等. ioc 提供了依賴注入的容器, aop解決了面向橫切面程式設計,然後在此兩者的基礎上實作了其他延伸産品的進階功能;
  4. springMvc是基于Servlet 的一個MVC架構主要解決WEB開發的問題,因為Spring的配置非常複雜,各種XML、JavaConfig、servlet處理起來比較繁瑣;
  5. 為了簡化開發者的使用,進而創造性地推出了springBoot架構,預設優于配置,簡化了springMvc的配置流程;

    但差別于springMvc的是,springBoot專注于微服務方面的接口開發,和前端解耦,雖然springBoot也可以做成springMvc前背景一起開發,但是這就有點不符合springBoot架構的初衷了;

  6. 對于springCloud架構來說,它和springBoot一樣,注重的是微服務的開發,但是springCloud更關注的是全局微服務的整合和管理,相當于管理多個springBoot架構的單體微服務;

9.RPC服務和restful服務的差別

  • 一、RPC

    即遠端過程調用(Remote Procedure Call Protocol,簡稱RPC),像調用本地服務(方法)一樣調用伺服器的服務(方法)。通常的實作有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的隻是傳輸資料的格式.

RPC是分布式架構的核心,按響應方式分如下兩種:

  • 同步調用:用戶端調用服務方方法,等待直到服務方傳回結果或者逾時,再繼續自己的操作
  • 異步調用:用戶端把消息發送給中間件,不再等待服務端傳回,直接繼續自己的操作。

同步調用的實作方式有WebService和RMI。Web Service提供的服務是基于web容器的,底層使用http協定,因而适合不同語言異構系統間的調用。RMI實際上是Java語言的RPC實作,允許方法傳回 Java 對象以及基本資料類型,适合用于JAVA語言建構的不同系統間的調用。

異步調用的JAVA實作版就是JMS(Java Message Service),目前開源的的JMS中間件有Apache社群的ActiveMQ、Kafka消息中間件,另外有阿裡的RocketMQ。

RPC架構裡包含如下4個元件:

1、 用戶端(Client):服務調用方

2、 用戶端存根(Client Stub):存放服務端位址資訊,将用戶端的請求參數打包成網絡消息,再通過網絡發送給服務方

3、 服務端存根(Server Stub):接受用戶端發送過來的消息并解包,再調用本地服務

4、服務端(Server):真正的服務提供者。

  • 二、REST

      REST即表述性狀态傳遞(Representational State Transfer,簡稱REST),是一種軟體架構風格。REST通過HTTP協定定義的通用動詞方法(GET、PUT、DELETE、POST) ,以URI對網絡資源進行唯一辨別,響應端根據請求端的不同需求,通過無狀态通信,對其請求的資源進行表述。

      Rest架構的主要原則:

  1. 網絡上的所有事物都被抽象為資源
  2. 每個資源都有一個唯一的資源辨別符
  3. 同一個資源具有多種表現形式(xml,json等)
  4. 對資源的各種操作不會改變資源辨別符
  5. 所有的操作都是無狀态的

    其中表述性狀态,是指(在某個瞬間狀态的)資源資料的快照,包括資源資料的内容、表述格式(XML、JSON)等資訊。

    其中無狀态通信,是指服務端(響應端)不儲存任何與特定HTTP請求相關的資源,應用狀态必須由請求方在請求過程中提供。要求在網絡通信過程中,任意一個Web請求必須與其他請求隔離,當請求端提出請求時,請求本身包含了響應端為響應這一請求所需的全部資訊。

    REST使用HTTP+URI+XML /JSON 的技術來實作其API要求的架構風格:HTTP協定和URI用于統一接口和定位資源,文本、二進制流、XML、JSON等格式用來作為資源的表述。

10.什麼是SOA架構

面向服務的架構(SOA)是一個元件模型,它将應用程式的不同功能單元(稱為服務)進行拆分,并通過這些服務之間定義良好的接口和協定聯系起來。接口是采用中立的方式進行定義的,它應該獨立于實作服務的硬體平台、作業系統和程式設計語言。這使得構件在各種各樣的系統中的服務可以以一種統一和通用的方式進行互動。

面向服務架構,它可以根據需求通過網絡對松散耦合的粗粒度應用元件進行分布式部署、組合和使用。服務層是SOA的基礎,可以直接被應用調用,進而有效控制系統中與軟體代理互動的人為依賴性。

SOA是一種粗粒度、松耦合服務架構,服務之間通過簡單、精确定義接口進行通訊,不涉及底層程式設計接口和通訊模型。SOA可以看作是B/S模型、XML(标準通用标記語言的子集)/Web Service技術之後的自然延伸。

SOA将能夠幫助軟體工程師們站在一個新的高度了解企業級架構中的各種元件的開發、部署形式,它将幫助企業系統架構者以更迅速、更可靠、更具重用性架構整個業務系統。較之以往,以SOA架構的系統能夠更加從容地面對業務的急劇變化。

SOA系統是一種企業通用性架構。

附注:自己總結,大部分手敲,有錯誤請諒解。