A. 架構圖匯總
一,java內存模型
由於java1.8對java內存模型進行了改動,我們這里分開來說明,首先來看java1.8之前的java內存模型。
1,java1.8之前的內存模型
關於java內存模型,有一點,要提一下,那就是,線程之間的通信機制。也就是說:線程之間是如何通信的?
答:共享內存和消息傳遞。
共享內存通信,指的是各線程之間通過共享內存這一塊區域,來進行隱式通信。線程之間通過讀寫共享內存來進行通信。在java中,典型的應用就是通過共享對象來進行通信。這里要搞清楚2個概念,共享內存和本地內存。共享內存是各線程共享的公共區域。本地內存是線程獨享的,其他線程不能訪問。
消息傳遞通信,指的是線程之間必須通過明確的發送消息來進行顯示通信。這種通信方式,線程之間沒有共享對象,而是通過wait()、notify()等方法,顯式的告訴其他線程來進行通信。
2,java1.8的內存模型
java1. 8移出了內存模型中的方法區,引入了元空間的概念。元空間使用的是操作系統的內存,而不是jvm內存。指定元空間的大小,通過下面這個jvm參數:
-XX:MetaspaceSize
還有一個關鍵點,就是常量池。在java1.7之前,常量池位於方法區。從java1.7開始,常量池位於堆中。
二,java對象的結構
java對象的結構
對象頭的結構
Mark Word
三,雙親委派模型
什麼是雙親委派模型?
為什麼叫雙親委派模型?
雙親指的是誰?
四,類的生命周期
java類的生命周期:載入->連接->初始化->使用->卸載。
如下圖:
五,Eureka架構圖
這個架構圖是結合源碼畫出的,個人覺得還是很不錯的。
六,Kafka架構圖
注意:只有broker和consumer需要向Zookeeper集群注冊。生產者無需注冊到Zookeeper。
七,Spring Cloud微服務架構圖
B. java.util 包中有哪幾種類
下圖給出了java.util包的基本層次結構圖。下面我們將具體介紹其中幾個重要的類。
┌java.util.BitSet
│java.util.Calendar
│└java.util.GregorianCalendar
│java.util.Date
│java.util.Dictionary
│└java.util.Hashtable
│└java.util.Properties
│java.util.EventObject
│java.util.ResourceBundle
┌普通類┤├java.util.ListResourceBundle
││└java.util.PropertyResourceBundle
││java.util.Local
││java.util.Observable
││java.util.Random
││java.util.StringTokenizer
││java.util.Vector
││└java.util.Stack
Java.util┤└java.util.TimeZone
│└java.util.SimpleTimeZone
│┌java.util.Enumeration
├介面┤java.util.EventListener
│└java.util.Observer
│┌java.util.EmptyStackException
└異常類┤java.util.MissingResourceException
│java.util.NoSuchElementException
└java.util.TooManyListenersException
C. java的類圖
1.list應該是list的實現類吧
public class DataRowCollection<E> implements List<E>...
public class DataColunmConnection<E> implements List<E>...
2.{leaf}是繼承?不太清楚
D. Java類的基本組成和使用是怎樣的
通過對實例化對象的使用來進行行為。
E. java有哪些圖結構
鏈表,線性表,棧,隊列,hash表!
數據結構:
①數組 (Array)
在程序設計中,為了處理方便, 把具有相同類型的若干變數按有序的形式組織起來。這些按序排列的同類數
據元素的集合稱為數組。在C語言中, 數組屬於構造數據類型。一個數組可以分解為多個數組元素,這些數組
元素可以是基本數據類型或是構造類型。因此按數組元素的類型不同,數組又可分為數值數組、字元數組、指
針數組、結構數組等各種類別。
②棧 (Stack)
棧是只能在某一端插入和刪除的特殊線性表。它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後
的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。
③隊列 (Queue)
一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行
插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。
④鏈表 (Linked List)
一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:
一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
⑤樹 (Tree)
樹是包含n(n>0)個結點的有窮集合K,且在K中定義了一個關系N,N滿足 以下條件:
(1)有且僅有一個結點 k0,他對於關系N來說沒有前驅,稱K0為樹的根結點。簡稱為根(root)
(2)除K0外,k中的每個結點,對於關系N來說有且僅有一個前驅。
(3)K中各結點,對關系N來說可以有m個後繼(m>=0)。
⑥堆 (Heap)
在計算機科學中,堆是一種特殊的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指
二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
⑦圖 (Graph)
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,
邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
⑧散列表 (Hash)
若結構中存在關鍵字和K相等的記錄,則必定在f(K)的存儲位置上。由此,不需比較便可直接取得所查記錄。稱
這個對應關系f為散列函數(Hash function),按這個思想建立的表為散列表。
F. JAVA數據結構有哪幾種
JAVA數據結構有以下幾種:
1、List:
List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似於數組下 >標)來訪問List中的元素,這類似於Java的數組。
2、Vector:
基於數組(Array)的List,其實就是封裝了數組所不具備的一些功能方便我們使用,所以它難易避免數組的限制,同時性能也不可能超越數組。
另外很重要的一點就是Vector是線程同步的(sychronized)的,這也是Vector和ArrayList 的一個的重要區別。
3、ArrayList:
同Vector一樣是一個基於數組上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。
4、LinkedList:
LinkedList不同於前面兩種List,它不是基於數組的,所以不受數組性能的限制。 它每一個節點(Node)都包含兩方面的內容:節點本身的數據(data),下一個節點的信息(nextNode)。
所以當對LinkedList做添加,刪除動作的時候就不用像基於數組的ArrayList一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了,這是LinkedList的優勢。
5、HashSet:
雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。
但是Set則是在 HashMap的基礎上來實現的,這就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。
6、HashMap:
基於哈希表的 Map 介面的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恆久不變。
7、HashTable:
Hashtable 是一個散列表,它存儲的內容是鍵值對(key-value)映射。Hashtable 繼承於Dictionary,實現了Map、Cloneable、java.io.Serializable介面。
Hashtable 的函數都是同步的,這意味著它是線程安全的。它的key、value都不可以為nul
G. Java語言中的類的基本結構是什麼
1.類是JAVA程序得的基本組成單位,定義了對象的屬性和方法,是具有共同屬性和行為的對象的集合。
2.對象的實質:屬性+行為。
3.類的基本結構:屬性,方法,構造方法,內部類,塊。屬性是對數據的描述。方法是對象的行為。構造方法用於實例化對象。
4.方法重載:
1)方法重載的原則:函數名相同,參數類型不同,參數個數不同,參數順序不同,在同一作用域。
2)方法重載跟方法的返回值類型沒有關系,只有返回值不同的方法不能構成重載。
5.方法的調用:類名.方法
6.對象的創建:假設存在一個類Person,創建對象語句為Person p=new Person();
下面是一個例子,參考理解
public class Cat {
public static void main(String[] args) {
Kitty K1=new Kitty();//創建一個對象K1
Kitty K2=new Kitty("小貓咪",3);//創建一個對象K2,名字為小貓咪,年齡為3
System.out.println("Kitty的名字:"+K1.name+K1.age+"歲");//輸出對象K1的名字和年齡
K1.play();//調用play方法
K1.eat();//調用eat方法
System.out.println("Kitty2的名字:"+K2.name+K2.age+"歲");//輸出對象K2的名字和年齡
K2.play();//調用play方法
K2.eat();//調用eat方法
}
}
class Kitty{
String name="小貓";
int age=1;
//無參數的構造方法
Kitty(){
}
//有參數的構造方法
Kitty(String name,int age){
this.name=name;
this.age=age;
}
//玩的方法
void play() {
System.out.println("玩橡皮泥");
}
//吃的方法
void eat() {
System.out.println("吃蘋果");
}
}
H. java集合類框架中類的組織結構,並說明它們之間的聯系與區別。
結構圖一樓給出來了,
聯系:list是可重復的有順序的;set是不重復的無序的;map中的key是不重復的,value是和key一一對應的。
區別:
1.
ArrayList是用動態數組實現的,有數組隨機訪問的優點,但插入和刪除操作過多時效率低;LinkedList是用雙向鏈表實現的,插入和刪除操作效率高,但隨機訪問數據不如ArrayList速度快。
2.
HashSet是用散列實現的,TreeSet是用紅黑樹(基於二叉平衡樹的變種)實現的,
TreeSet是有序的(這可能與數學中純粹的集合概念不一致,但似乎這世上本就沒有純粹的東西吧),所以放入TreeSet中的對象必須是可比較的,即實現Compareble介面。
3.
HashMap和TreeMap,與HashSet、TreeSet類似。
I. Java 7.1 系統類結構圖該怎麼畫
J. 介紹下Java程序的結構
Java語言是面向對象的程序設計語言,Java程序的基本組成單元是類,類體中又可包括屬性與方法兩部分。而每一個應用程序都必須包含一個main()方法,含有main()方法的類稱之為主類。
一: Java程序的主類及其格式
作為一個可以獨立運行的Java程序,在它的眾多類中必須要有一個類作為程序的起始類,為了方便,本書把這個類稱為主類。當需要執行一個程序時,人們在java命令後面輸入的便是這個主類的文件名(也是主類名),因此主類文件是Java運行環境建立起來之後第一個被裝入虛擬機的用戶文件。為了使虛擬機可以找到程序運行的起始入口,主類必須為public類,並含有一個在格式上符合約定的入口方法main(),其格式如下:
public static void main(String[] args){
…
}
其中各參數含義如下。
main:入口方法名稱。
args:命令行參數,這是一個String對象數組。
static:修飾字,說明main()是一個靜態方法(類方法)。
public:修飾字,說明main()具有公有訪問屬性。
於是,主類框架的源代碼如下:
public class 主類名{
…
public static void main(String[] args){
…
}
}
Java程序的主類常常使熟悉C/C++的讀者感到迷惑:main()方法不就相當於C/C++程序中的主函數嗎,為什麼非得把它放到一個類里,難道它有什麼不同嗎?
沒錯,Java類中main()方法就相當於C/C++程序中的主函數,是一個入口函數。之所以把它封裝到一個類里,而不像C/C++那樣單獨作為一個函數來處理,就本書作者的理解,大概Java的設計者們有如下幾個方面的考慮。
1)Java既然把所有事物都看成了對象,那麼就沒有理由不把程序也看成對象,因為程序也是一種事物。既然是對象,那麼它就應該屬於某個類並以程序名來命名。既然程序是一種類,那麼main()就應該是這個類的一個方法,只不過它有些特殊,它是一個入口方法,並且對它有些特殊規定,例如其名稱必須為main(),必須是公有靜態方法,有命令行參數等。
2)如果把程序封裝成了類,那麼包括本程序在內的任何程序就都可以根據需要,隨時創建這個類的對象,並通過該對象使用這個類中的資源,這樣就便於資源共享,從而提高程序的靈活性。
3)Java程序是一種以類為基本單位的模塊化程序,程序被編譯後,每一個類會對應生成一個二進制位元組碼類文件。如果把程序也封裝成類,那麼它的文件就與其他類文件統一起來,而不會產生其他類型的文件,因而便於管理。
4)之所以把入口方法封裝到類中,其根本目的就是要盡可能平等地看待所有的類。因為Java的最終目的是要以類為基本模塊來實現可裝配軟體,如果把main()方法封裝到了一個類中,那麼就意味著main()與類的其他方法沒什麼本質區別,只不過是分工不同而已。下面很快就會看到,Java的所有類都可以含有一個入口方法而成為主類。也就是說,在Java程序中根本就沒有主類、次類之分,這里之所以把帶有main()方法的類稱為主類,是為了表達方便。
二: JAVA源程序在命令行下的運行
classBank{
publicvoidinit(){
System.out.println("Yes,Ican");
}
publicstaticvoidmain(Stringargs[]){
BankAccountba1=newBankAccount(100.00);
System.out.print("Beforetransactions,");
ba1.display();
ba1.deposit(74.35);
ba1.withdraw(20.00);
System.out.print("Aftertransactions,");
ba1.display();
Bankb=newBank();
b.init();
}
}
classBankAccount{
privatedoublebalance;
publicBankAccount(doubleopeningBalance){
balance=openingBalance;
}
publicvoiddeposit(doubleamount){
balance+=amount;
}
publicvoidwithdraw(doubleamount){
balance-=amount;
}
publicvoiddisplay(){
System.out.println("balance="+balance);
}
}
三:完整的java源程序應該包括下列部分
package語句;
import語句;
public classDefinition; // 公共的類定義部分,至多隻有一個公共類的定義
// java語言規定該java源程序的文件名必須與該公共類名完全一致
classDefinition; // 類定義部分,可以有0個或多個
interfaceDefinition; // 介面定義部分,可以有0個或多個
package:java編譯器為每個類生成一個位元組碼文件,且文件名與類名相同,這就會帶來一個問題:同名的類會發生沖突。package便可管理類命名空間。
一般地,具有相同功能的類放在一個package中。
一個java源程序至多隻能有一個公共類的定義。
若java源程序有一個公共類的定義,則該源文件名字必須與該公共類的名字完全相同。
若源程序中不包含公共類的定義,則該文件名可以任意取名。
若一個源程序中有多個類定義,則在編譯時將為每個類生成一個。class文件。
三。java編程規范
包名:全小寫的名詞,中間可由點分割,eg:java.awt.event
類名:首字母大寫,多個單詞合成,每個單詞首字母也要大寫,eg: class HelloWorldApp
介面名: 同類名,eg: interface Collection
方法名: 由多個單詞合成,第一個單詞通常為動詞,首字母小寫,中間的每個單詞的首字母都要大寫,eg: balanceAccount, isButtonPressed
變數名: 全小寫,一般為名詞,eg: length
常量名: 基本數據類型的常量名為全大寫,如果由多個單詞構成,可以用下劃線隔開,eg: int YEAR, int WEEK_OF_MONTH
對象類型的常量,則是小寫混合,由大寫字母把單詞隔開