1.相對路徑和絕對路徑的區(qū)別:
絕對路徑是指從根目錄開始的完整路徑
相對路徑是相對于當前工作目錄的路徑,不是唯一的,而是根據(jù)當前位置而變化的,
相對路徑是相對于java程序所在的目錄,或者相對于java程序運行時的工作目錄
2.代碼啟動時的運行順序拟枚,過程
JVM啟動,加載核心類庫以及用戶編寫的類
執(zhí)行main方法,開始運行程序
根據(jù)代碼中的語法和邏輯,執(zhí)行各種語句和表達式,包括創(chuàng)建對象绽快、調用方法羡铲、訪問變量等
當main方法執(zhí)行完畢或者調用了System.exit方法時,程序結束,JVM終止
3.java的執(zhí)行過程
先編譯后執(zhí)行,java首先通過編譯器將源代碼(java文件)編譯成字節(jié)碼文件(class文件),編譯器將源代碼轉換為字節(jié)代碼
java編譯器(javac)
字節(jié)碼文件啃憎,是誰執(zhí)行的?
任何支持Java虛擬機(JVM)的平臺上運行约谈。
JVM是什么?跨不跨平臺?
JVM是java虛擬機的縮寫,是java程序的運行時環(huán)境,JVM可以在不同的操作系統(tǒng)和硬件平臺上運行java程序,因此java程序具有很高的可移植性和跨平臺性
4.如何在小黑屏(CMD)中打印"Hello, World!"可以通過以下步驟實現(xiàn):
打開小黑屏(CMD)岛都,進入一個工作目錄蚤认,例如"C:\Users\YourUsername"。
使用文本編輯器(例如Notepad)創(chuàng)建一個新的文本文件限寞,將以下代碼復制并粘貼到該文件中:
echo Hello, World!
將該文件保存為"HelloWorld.bat"忍啸,注意文件后綴名為".bat"。
在小黑屏(CMD)中執(zhí)行該批處理文件履植,可以通過以下兩種方式:
雙擊該文件计雌,在小黑屏(CMD)中執(zhí)行。
在小黑屏(CMD)中切換到該文件所在的目錄静尼,輸入文件名并按回車鍵執(zhí)行白粉。
程序將會在小黑屏(CMD)中打印出"Hello, World!"。
注意鼠渺,批處理文件是一種批處理腳本,可以在Windows操作系統(tǒng)中運行眷细。該方法只是一種簡單的展示如何在小黑屏(CMD)中打印"Hello, World!"的方法拦盹,如果您需要在Java中打印"Hello, World!",則需要編寫Java程序并使用Java編譯器(javac)來編譯該程序并在小黑屏(CMD)中運行溪椎。
程序開始的入口
在java中程序的入口是main方法,main方法是程序開始執(zhí)行的地方,它是java程序的最初入口點.在java中,main方法的定義必須滿足以下兩個條件:
1.main方法必須是public和static
2.main方法的返回值類型必須是void,并接受一個String類型的數(shù)組作為參數(shù)
四類八種普舆,取值范圍
四類
基本數(shù)據(jù)類型:包括整型(int)恬口、短整型(short)、長整型(long)沼侣、字節(jié)型(byte)祖能、單精度浮點型(float)、雙精度浮點型(double)蛾洛、字符型(char)养铸、布爾型(boolean)等。
引用數(shù)據(jù)類型:包括類(class)轧膘、接口(interface)钞螟、數(shù)組(array)、枚舉(enum)等谎碍。
自定義數(shù)據(jù)類型:包括自定義類鳞滨、接口、枚舉等蟆淀。
空類型(void):表示沒有返回值的方法拯啦。
八種
四種基本數(shù)據(jù)類型:
byte < short < int < long < float < double < char < boolean
字節(jié)型(byte):8位有符號整數(shù),取值范圍為-128到127熔任。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1個字節(jié)
短整型(short):16位有符號整數(shù)提岔,取值范圍為-32,768到32,767。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2個字節(jié)
整型(int):32位有符號整數(shù)笋敞,取值范圍為-2,147,483,648到2,147,483,647碱蒙。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4個字節(jié)
長整型(long):64位有符號整數(shù),取值范圍為-9,223,372,036,854,775,808到? ? ? ? 4個字節(jié)9,223,372,036,854,775,807夯巷。? ? ? ? ? ? ?
單精度浮點型(float):32位浮點數(shù)赛惩,取值范圍為1.4E-45到3.4028235E38。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4個字節(jié)
雙精度浮點型(double):64位浮點數(shù)趁餐,取值范圍為4.9E-324到1.7976931348623157E308喷兼。? ? 8個字節(jié)? ?
字符型(char):16位Unicode字符,取值范圍為0到65,535后雷。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2個字節(jié)
布爾型(boolean):true或false季惯。? ? ? ? ? ? 1個字節(jié)
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
存儲位置:基本數(shù)據(jù)類型的值直接存儲在內存中,而引用數(shù)據(jù)類型的值存儲在堆(heap)中臀突,它們的地址存儲在棧(stack)中勉抓。
占用空間:基本數(shù)據(jù)類型占用的空間是固定的,而引用數(shù)據(jù)類型占用的空間大小取決于對象的大小候学。
默認值:基本數(shù)據(jù)類型有默認值藕筋,例如int類型的默認值是0,而引用數(shù)據(jù)類型的默認值是null梳码。
參數(shù)傳遞方式:基本數(shù)據(jù)類型在方法調用時采用值傳遞方式隐圾,即將實際參數(shù)的值復制一份傳遞給形式參數(shù)伍掀,而引用數(shù)據(jù)類型在方法調用時采用引用傳遞方式,即將實際參數(shù)的地址傳遞給形式參數(shù)暇藏。
比較方式:基本數(shù)據(jù)類型比較值是否相等蜜笤,而引用數(shù)據(jù)類型比較地址是否相等。如果需要比較引用數(shù)據(jù)類型的值是否相等盐碱,需要重寫equals()方法把兔。
整型和浮點型默認是哪種類型
整型和浮點型默認是int和double類型。
標識符命名規(guī)范
在Java中甸各,標識符是指用來標識程序中各種變量垛贤、方法、類等的名稱趣倾。標識符的命名規(guī)則如下:
標識符必須以字母聘惦、下劃線(_)或美元符號($)開頭,不能以數(shù)字開頭儒恋。
標識符可以包含字母善绎、數(shù)字、下劃線(_)或美元符號($)诫尽。
標識符是區(qū)分大小寫的禀酱。
標識符不能使用Java中的關鍵字和保留字。
需要注意的是牧嫉,雖然Java中允許使用下劃線(_)和美元符號($)作為標識符的一部分剂跟,但是在實際編程中,建議使用駝峰命名法來命名標識符酣藻,這樣可以提高代碼的可讀性和可維護性曹洽。
大小駝峰命名法? ? ?
通常使用小駝峰命名法來命名變量、方法辽剧、屬性等成員變量送淆,而使用大駝峰命名法來命名類和接口。
大駝峰命名法(也稱為大寫駝峰命名法或帕斯卡命名法)是一種命名規(guī)范怕轿,它主要用于命名類偷崩、接口、枚舉等 Java 元素撞羽。具體來說阐斜,大駝峰命名法是指將多個單詞組合起來構成一個復合詞,其中每個單詞的首字母都大寫放吩,以此類推智听。
以下是一些使用大駝峰命名法的示例:
類名:Person, Student, Book, CustomerOrder
接口名:Runnable, Comparable, Serializable
枚舉名:DayOfWeek, Color, Size
小駝峰命名法(也稱為小寫駝峰命名法)是一種命名規(guī)范,它主要用于命名變量渡紫、方法到推、屬性等 Java 元素。具體來說惕澎,小駝峰命名法是指將多個單詞組合起來構成一個復合詞莉测,其中第一個單詞的首字母小寫,后面的每個單詞的首字母大寫唧喉,以此類推捣卤。
以下是一些使用小駝峰命名法的示例:
變量名:firstName, lastName, age, emailAddress
方法名:getFirstName(), setLastName(String lastName), calculateAge(int birthYear), sendEmail(String recipient, String subject, String body)
屬性名:firstName, lastName, age, emailAddress
類,對象八孝,包的命名
類的命名:類名應該以大寫字母開頭董朝,采用大駝峰命名法,例如:Person干跛、Student子姜、Account。類名應該具有描述性楼入,能夠清晰地表達類的作用和含義哥捕。
對象的命名:對象的命名應該以小寫字母開頭,采用小駝峰命名法嘉熊,例如:person遥赚、student、account阐肤。對象的命名應該具有描述性凫佛,能夠清晰地表達對象的作用和含義。
包的命名:包名應該全部小寫孕惜,采用點(.)分隔符分隔各級包名愧薛,包名一般采用公司或組織的域名倒序命名,例如:com.example诊赊、org.apache厚满。如果是個人或者小團隊開發(fā)的項目,也可以使用自己的域名作為包名的一部分? 例如:io.github.username
? ? ? 包名的命名應該具有唯一性碧磅,能夠清晰地表達包的作用和含義碘箍。
常量定義,規(guī)范
在Java中鲸郊,常量是指在程序執(zhí)行過程中其值不會發(fā)生改變的量丰榴。
常量名規(guī)范:
常量名應該全部大寫,單詞之間用下劃線(_)分隔秆撮,例如:MAX_VALUE四濒、PI。
常量名應該具有描述性,能夠清晰地表達常量的含義和作用盗蟆。
常量必須在定義時進行初始化戈二,且初始化后不能再次修改其值。
常量可以定義在類中或者接口中喳资,一般使用static final修飾觉吭。
轉義符
轉義符是一種特殊的字符序列,用來表示一些無法直接輸入的字符或者在字符中表示的一些特殊的含義.
轉義符以反斜杠(\)開頭,后面跟著一個或多個字符仆邓。以下是常見的轉義符:
\n:表示換行符
\t:表示制表符
\r:表示回車符
\b:表示退格符
\f:表示換頁符
\’:表示單引號(’)
\”:表示雙引號(")
\:表示反斜杠(\)
例如鲜滩,在字符串中表示雙引號(")可以使用轉義符":
String message = "She said, \"Hello!\"";
需要注意的是,轉義符也可以用于表示Unicode字符节值,例如:\u0020表示空格符徙硅。
轉義符的使用可以使得Java程序更易于編寫和閱讀,但是也需要注意轉義符的正確使用搞疗,避免出現(xiàn)編譯錯誤和運行時錯誤嗓蘑。
數(shù)據(jù)類型轉換關系
數(shù)據(jù)類型轉換分為兩種
1.隱式類型轉換(自動類型轉換)。
從小范圍數(shù)據(jù)類型到大范圍數(shù)據(jù)類型的轉換贴汪,例如:
int a = 10;
double b = a; // int類型自動轉換為double類型
2.顯式類型轉換(強制類型轉換)脐往。
顯式類型轉換:當需要將一個大范圍數(shù)據(jù)類型轉換為小范圍數(shù)據(jù)類型時,需要進行強制類型轉換扳埂。這種轉換可能會導致精度損失或數(shù)據(jù)溢出业簿,因此需要謹慎使用,例如:
ouble c = 3.14;
int d = (int)c; // double類型強制轉換為int類型
需要注意的是阳懂,在數(shù)據(jù)類型轉換時梅尤,應該避免數(shù)據(jù)溢出或失真的情況發(fā)生。在進行強制類型轉換時岩调,應該進行范圍檢查巷燥,以確保所轉換的值在目標數(shù)據(jù)類型的取值范圍內。
以下是Java中常用數(shù)據(jù)類型轉換的關系:
byte -> short -> int -> long -> float -> double
char -> int
自動裝箱:基本數(shù)據(jù)類型 -> 對應的包裝類
自動拆箱:包裝類 -> 對應的基本數(shù)據(jù)類型
在Java中号枕,自動裝箱(Autoboxing)是指將基本數(shù)據(jù)類型自動轉換為對應的包裝類的過程缰揪。自動裝箱是Java語言的一個語法糖,使得程序員可以更方便地進行基本數(shù)據(jù)類型和包裝類之間的轉換葱淳。
例如钝腺,將一個int類型的值賦給Integer類型的變量時,可以直接進行賦值操作赞厕,無需手動創(chuàng)建Integer對象:
int a = 10;
Integer b = a; // 自動裝箱艳狐,將int類型的值轉換為Integer對象
自動裝箱的過程是編譯器自動進行的,其實質是將基本數(shù)據(jù)類型的值包裝成對應的包裝類對象皿桑。在自動裝箱時毫目,編譯器會自動調用對應的包裝類的valueOf()方法蔬啡,例如:Integer.valueOf()、Double.valueOf()等镀虐。
需要注意的是箱蟆,自動裝箱和自動拆箱(Unboxing)是Java語言的兩個特性,它們通常會共同出現(xiàn)粉私。自動拆箱是指將包裝類自動轉換為對應的基本數(shù)據(jù)類型的過程顽腾。
例如氢架,將一個Integer類型的值賦給int類型的變量時棒卷,可以直接進行賦值操作漂佩,無需手動調用intValue()方法:
Integer a = 10;
int b = a; // 自動拆箱,將Integer對象轉換為int類型的值
自動裝箱和自動拆箱可以使得程序員更加方便地進行基本數(shù)據(jù)類型和包裝類之間的轉換窖杀,同時也可以提高代碼的可讀性和可維護性。
字符串轉整型的方法?
Integer類(valueOf(String s))
在Java中裙士,Integer是一個包裝類(Wrapper Class)入客,用于將int類型的基本數(shù)據(jù)類型封裝成一個對象。Integer類提供了一些方法用于對整數(shù)進行操作和轉換腿椎,例如:字符串轉整型桌硫、整型轉字符串、比較大小等啃炸。
Integer類是Java語言中常用的包裝類之一铆隘,它繼承自Number類,實現(xiàn)了Serializable和Comparable接口南用。在Java中膀钠,所有的包裝類都提供了相應的方法來實現(xiàn)基本數(shù)據(jù)類型和包裝類之間的轉換,以方便程序員進行數(shù)據(jù)類型的轉換和操作裹虫。
需要注意的是肿嘲,由于Integer是一個對象類型,因此在進行操作時會產(chǎn)生額外的內存開銷和對象創(chuàng)建的開銷筑公,相對于int類型的基本數(shù)據(jù)類型雳窟,效率會稍低。因此匣屡,在處理大量整數(shù)數(shù)據(jù)時封救,應該優(yōu)先使用int類型的基本數(shù)據(jù)類型。
另外耸采,需要注意的是兴泥,Integer類和int類型有一些重要的區(qū)別,例如:Integer類的對象可以為null虾宇,而int類型的變量不能為null搓彻。在進行操作時需要避免空指針異常的發(fā)生,同時也需要根據(jù)具體的需求選擇合適的數(shù)據(jù)類型進行操作。
Integer.parseInt(String s):將字符串轉換為int類型旭贬。例如:
String str = "123";
int num = Integer.parseInt(str);
Integer.valueOf(String s):將字符串轉換為Integer類型怔接。例如:
String str = "123";
Integer num = Integer.valueOf(str);
需要注意的是,以上兩種方法在轉換過程中稀轨,如果字符串不是合法的整數(shù)格式(例如包含非數(shù)字字符或超出整數(shù)范圍等)扼脐,會拋出NumberFormatException異常。因此奋刽,在進行字符串轉換時瓦侮,應該進行異常處理,以保證程序的穩(wěn)定性佣谐。
同時肚吏,需要注意的是,以上方法只能將字符串轉換為整數(shù)類型狭魂,如果需要將字符串轉換為其他數(shù)據(jù)類型罚攀,需要使用對應的數(shù)據(jù)類型轉換方法。例如雌澄,將字符串轉換為浮點數(shù)類型可以使用Double.parseDouble()或Double.valueOf()方法斋泄,將字符串轉換為長整型可以使用Long.parseLong()或Long.valueOf()方法等。
一元镐牺、二元炫掐、三元運算符
在Java中,根據(jù)操作數(shù)的數(shù)量任柜,運算符可以分為一元卒废、二元、三元運算符宙地。
一元運算符:只需要一個操作數(shù)即可完成運算的運算符摔认。常見的一元運算符有:
正負號運算符:+、-
自增自減運算符:++宅粥、--
邏輯非運算符:!
例如:
int a = 10;
int b = -a; // 負號運算符
int c = ++a; // 自增運算符
boolean d = !true; // 邏輯非運算符
二元運算符:需要兩個操作數(shù)才能完成運算的運算符参袱。常見的二元運算符有:
算術運算符:+、-秽梅、*抹蚀、/、%
關系運算符:>企垦、<环壤、>=、<=钞诡、==郑现、!=
邏輯運算符:&&湃崩、||、&
賦值運算符:=接箫、+=攒读、-=、*=辛友、/=薄扁、%=
例如:
int a = 10;
int b = 20;
int c = a + b; // 算術運算符
boolean d = a > b; // 關系運算符
boolean e = true && false; // 邏輯運算符
a += 5; // 賦值運算符
三元運算符:需要三個操作數(shù)才能完成運算的運算符,也稱為條件運算符(Conditional Operator)
它的語法格式為:
(條件表達式) ? 表達式1 : 表達式2
如果條件表達式為真废累,則執(zhí)行表達式1邓梅,否則執(zhí)行表達式2。
例如:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // 三元運算符
需要注意的是九默,在使用運算符時震放,需要遵循運算符的優(yōu)先級和結合性規(guī)則,以便正確地進行運算和計算驼修。
i++,++i的區(qū)別,運算符的優(yōu)先級
i++和++i都是一元運算符,用于將變量i的值加1.它們的區(qū)別在于他們的運算順序和返回值
i++是后綴遞增運算符,它首先返回變量i的原始值,然后將變量i的值加1.(先用后加)
++i是前綴遞增運算符,它首先將變量i的值加1,然后返回變量i的新值.? ? (先加后用)
在表達式中使用這些運算符時诈铛,需要注意它們的優(yōu)先級乙各。++i的優(yōu)先級高于i++,因此在表達式中使用時幢竹,需要根據(jù)需要使用括號來控制運算的順序耳峦。
運算符的分類
圓括號(())
一元運算符(+、-焕毫、++蹲坷、--、!邑飒、~)
乘除模運算符(*循签、/、%)
加減運算符(+疙咸、-)
移位運算符(<<县匠、>>、>>>)
關系運算符(<撒轮、<=乞旦、>、>=题山、instanceof)
相等運算符(==兰粉、!=)
按位與運算符(&)
按位異或運算符(^)
按位或運算符(|)
邏輯與運算符(&&)
邏輯或運算符(||)
三元運算符(? :)
賦值運算符(=、+=顶瞳、-=玖姑、*=崖蜜、/=、%=客峭、<<=豫领、>>=、>>>=舔琅、&=等恐、^=、|=)
位運算符(& |? ^? ~? <<? >>? >>>? <<<)
常見的位運算符
按位與運算符(&):將兩個操作數(shù)的每一個二進制位進行“與”操作备蚓,如果兩個二進制位都為1课蔬,則結果為1,否則為0郊尝。
按位或運算符(|):將兩個操作數(shù)的每一個二進制位進行“或”操作二跋,如果兩個二進制位都為0,則結果為0流昏,否則為1扎即。
按位異或運算符(^):將兩個操作數(shù)的每一個二進制位進行“異或”操作,如果兩個二進制位相同况凉,則結果為0谚鄙,否則為1。
按位取反運算符(~):將操作數(shù)的每一個二進制位進行取反操作刁绒,即0變成1闷营,1變成0。
左移運算符(<<):將操作數(shù)的二進制位向左移動指定的位數(shù)知市,右側用0填充傻盟。
右移運算符(>>):將操作數(shù)的二進制位向右移動指定的位數(shù),左側用符號位填充(即正數(shù)用0填充嫂丙,負數(shù)用1填充)娘赴。
無符號右移運算符(>>>):將操作數(shù)的二進制位向右移動指定的位數(shù),左側用0填充奢入。
位運算符只能用于整型數(shù)據(jù)類型筝闹,例如byte、short腥光、int和long等关顷。在使用位運算符時,需要注意運算符的優(yōu)先級和結合性武福,以及數(shù)據(jù)類型的兼容性和運算順序议双。
按位與(&)的例子:
int a = 5; // 二進制表示為 101
int b = 3; // 二進制表示為 011
int c = a & b; // 按位與運算,結果為 1(二進制表示為 001)
System.out.println(c); // 輸出 1
按位或(|)的例子:
int a = 5; // 二進制表示為 101
int b = 3; // 二進制表示為 011
int c = a | b; // 按位或運算捉片,結果為 7(二進制表示為 111)
System.out.println(c); // 輸出 7
按位異或(^)的例子:
int a = 5; // 二進制表示為 101
int b = 3; // 二進制表示為 011
int c = a ^ b; // 按位異或運算平痰,結果為 6(二進制表示為 110)
System.out.println(c); // 輸出 6
按位取反(~)的例子:
int a = 5; // 二進制表示為 101
int b = ~a; // 按位取反運算汞舱,結果為 -6(二進制表示為 11111111 11111111 11111111 11111010)
System.out.println(b); // 輸出 -6
左移(<<)的例子:
int a = 5; // 二進制表示為 101
int b = a << 2; // 左移 2 位,結果為 20(二進制表示為 10100)
System.out.println(b); // 輸出 20
右移(>>)的例子:
int a = 5; // 二進制表示為 101
int b = a >> 2; // 右移 2 位宗雇,結果為 1(二進制表示為 1)
System.out.println(b); // 輸出 1
以上是一些具體的位運算符的例子昂芜,它們可以用于各種計算任務,例如掩碼操作赔蒲、位操作泌神、位移操作等。需要注意的是舞虱,在實際編程中欢际,要確保對位運算符的正確理解和使用,以避免出現(xiàn)意外的錯誤矾兜。
StringBuilder和StringBuffer了解多少?和String的區(qū)別
StringBuilder和StringBuffer都是數(shù)組容器
StringBuilder只是一個容器,需要轉化成字符串類型的
StringBuilder是一個創(chuàng)建好的類,打印的不是地址值,是自己里面改的,打印的是數(shù)據(jù)值
其中的方法:append(添加)? reverse(反轉)? .length()獲取長度
StringBuilder底層擴展:
默認創(chuàng)建一個長度為16的字節(jié)數(shù)組
添加的內容長隊小于16,直接存
添加的內容大于16會擴容(原來的容量*2+2)
如果擴容之后還不夠,以實際長度為準
StringBuilder和StringBuffer是Java中用于字符串拼接和操作的類损趋,它們都繼承自抽象類AbstractStringBuilder。StringBuilder是在Java 1.5中引入的椅寺,它與StringBuffer類似浑槽,但是StringBuilder的方法沒有被synchronized修飾,因此在多線程環(huán)境下效率更高配并。
String和StringBuilder/StringBuffer的區(qū)別在于:
String是不可變的字符序列括荡,一旦創(chuàng)建就不能被修改。因此溉旋,每次對String進行修改操作時,都會創(chuàng)建一個新的String對象嫉髓,這可能會導致頻繁的對象創(chuàng)建和銷毀观腊,從而降低程序的性能。而StringBuilder和StringBuffer都是可變的字符序列算行,可以在原對象的基礎上進行修改操作梧油,避免了頻繁的對象創(chuàng)建和銷毀,因此在對字符串進行頻繁的修改操作時州邢,使用StringBuilder和StringBuffer會更加高效儡陨。
注:StringBuilder底層其實是數(shù)組存儲元素,鏈表處理擴容,并且是頭插法
String、StringBuilder和StringBuffer都有各自的優(yōu)缺點量淌,需要根據(jù)實際的需求來選擇合適的類骗村。
如果需要對字符串進行頻繁的修改操作,并且不需要考慮多線程同步問題呀枢,建議使用StringBuilder胚股;
如果需要考慮多線程同步問題,可以使用StringBuffer裙秋;
如果字符串不需要修改琅拌,那么使用String即可缨伊。
三種定義數(shù)組的方法
.靜態(tài)初始化方式:
使用靜態(tài)初始化方式,可以在定義數(shù)組時直接為數(shù)組的每個元素賦值.具體語法如下:
數(shù)據(jù)類型[] 數(shù)組名 = {元素1, 元素2, ...};
int[] numbers = {1, 2, 3, 4, 5};
動態(tài)初始化方式:
使用動態(tài)初始化方式,可以在定義數(shù)組時指定數(shù)組的長度进宝,并為數(shù)組分配內存空間刻坊。具體語法如下:
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
int[] numbers = new int[5];
匿名數(shù)組方式:
使用匿名數(shù)組方式,可以創(chuàng)建一個沒有名稱的數(shù)組党晋,并直接為數(shù)組的每個元素賦值谭胚。具體語法如下:
new 數(shù)據(jù)類型[]{元素1, 元素2, ...};
int[] numbers = new int[]{1, 2, 3, 4, 5};
需要注意的是,數(shù)組在定義時需要指定數(shù)據(jù)類型和數(shù)組的長度隶校,數(shù)組的長度是固定的漏益,一旦定義,就無法再改變深胳。如果需要存儲多個元素绰疤,并且元素的數(shù)量是可變的,可以考慮使用Java中的集合類舞终。
寫一個三維數(shù)組
以下是一個三維數(shù)組的完整代碼示例:
public class Main {
? ? public static void main(String[] args) {
? ? ? ? // 定義一個 3 × 3 × 3 的三維數(shù)組
? ? ? ? int[][][] array = new int[3][3][3];
? ? ? ? // 初始化三維數(shù)組
? ? ? ? for (int i = 0; i < 3; i++) {
? ? ? ? ? ? for (int j = 0; j < 3; j++) {
? ? ? ? ? ? ? ? for (int k = 0; k < 3; k++) {
? ? ? ? ? ? ? ? ? ? array[i][j][k] = i + j + k;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 遍歷三維數(shù)組并輸出其中的元素
? ? ? ? for (int i = 0; i < 3; i++) {
? ? ? ? ? ? for (int j = 0; j < 3; j++) {
? ? ? ? ? ? ? ? for (int k = 0; k < 3; k++) {
? ? ? ? ? ? ? ? ? ? System.out.print(array[i][j][k] + " ");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? System.out.println();
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();
? ? ? ? }
? ? }
}
在上面的代碼中轻庆,我們定義了一個 3 × 3 × 3 的三維數(shù)組,并使用三重循環(huán)初始化了其中的元素敛劝。然后余爆,我們又使用三重循環(huán)遍歷了整個三維數(shù)組,并輸出其中的元素夸盟。
運行結果:
0 1 2
1 2 3
2 3 4
1 2 3
2 3 4
3 4 5
2 3 4
3 4 5
4 5 6
==和equals的區(qū)別
在Java中蛾方,==和equals()都是用于比較兩個對象是否相等的操作符,但它們的比較方式有所不同上陕。
==操作符用于比較兩個對象的引用(內存地址)是否相等桩砰。如果兩個對象的引用相同,則返回true释簿,否則返回false亚隅。例如:
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // true,因為str1和str2引用的是同一個對象
System.out.println(str1 == str3); // false庶溶,因為str1和str3引用的是不同的對象
上面例子中為什么str1和str2引用的同一個對象?
在Java中煮纵,字符串常量池是一塊特殊的內存區(qū)域,用于存儲所有字符串常量偏螺。當程序中出現(xiàn)一個字符串常量時行疏,JVM會首先檢查字符串常量池中是否已經(jīng)存在該字符串,如果存在砖茸,則直接返回該字符串的引用隘擎;如果不存在,則在字符串常量池中創(chuàng)建一個新的字符串凉夯,并返回該字符串的引用货葬。這樣采幌,只要字符串的內容相同,不同的字符串變量在使用時都可以引用到同一個字符串對象震桶。
在上面的例子中休傍,str1和str2都是字符串常量,它們的值都為"hello"蹲姐,因此它們引用的是同一個字符串對象磨取。而str3使用了new關鍵字創(chuàng)建了一個新的字符串對象,因此str1和str3引用的是不同的字符串對象柴墩。
equals()方法用于比較兩個對象的內容是否相等忙厌。
默認情況下,equals()方法與==操作符的作用相同江咳,即比較兩個對象的引用是否相等逢净。但是,對于一些類(如String歼指、Integer等)爹土,它們重寫了equals()方法,使其用于比較對象內容是否相等踩身。例如:
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2)); // true胀茵,因為str1和str2的內容相同
System.out.println(str1.equals(str3)); // true,因為str1和str3的內容相同
需要注意的是挟阻,如果自定義類沒有重寫equals()方法琼娘,則默認使用父類Object的equals()方法,
面向對象的三大特性
封裝附鸽、繼承轨奄、多態(tài)
封裝(Encapsulation):將數(shù)據(jù)和操作數(shù)據(jù)的方法(即行為)包裝在一起,對外部隱藏對象的內部細節(jié)拒炎,只開放有限的接口供外部使用。封裝可以提高程序的安全性和可靠性挨务,降低程序的耦合度击你,方便代碼重用和維護。在Java中谎柄,封裝可以通過訪問修飾符(public丁侄、private、protected等)來實現(xiàn)朝巫。
繼承(Inheritance):通過繼承鸿摇,可以創(chuàng)建新的類渐逃,這些類具有父類的屬性和方法等浊,并可以添加自己的屬性和方法。繼承可以提高代碼的復用性和可維護性,避免重復編寫相似的代碼相叁。在Java中,繼承可以通過extends關鍵字來實現(xiàn)姐仅,可以使用super關鍵字來調用父類的構造方法和方法刊头。
多態(tài)(Polymorphism):指同一種行為具有多種不同的表現(xiàn)形式或狀態(tài)的能力。在Java中佛舱,多態(tài)可以通過方法重載(Overloading)和方法重寫(Overriding)來實現(xiàn)椎例。
方法重載指在同一個類中定義多個同名但參數(shù)列表不同的方法,編譯器根據(jù)參數(shù)列表的不同來決定調用哪個方法请祖。
overload(重載)
1订歪、參數(shù)類型、個數(shù)肆捕、順序至少有一個不相同刷晋。
2、不能重載只有返回值不同的方法名福压。
3掏秩、存在于父類和子類、同類中荆姆。
方法重寫指子類覆蓋父類的同名方法蒙幻,實現(xiàn)多態(tài)性。多態(tài)可以提高代碼的靈活性和可擴展性胆筒,使代碼更易于維護和拓展邮破。
override(重寫)
1、方法名仆救、參數(shù)抒和、返回值相同。
2彤蔽、子類方法不能縮小父類方法的訪問權限摧莽。
3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)顿痪。
4镊辕、存在于父類和子類之間。
5蚁袭、方法被定義為final不能被重寫征懈。
訪問權限修飾符,權限范圍揩悄。
在Java中卖哎,訪問權限修飾符用于控制類、變量、方法等成員的可見性(即可以被哪些類或對象訪問)亏娜。
Java中有四種訪問權限修飾符:
public:公共的焕窝,可以被任何類或對象訪問。使用public修飾的類照藻、變量袜啃、方法等成員可以被其他類或對象訪問。
protected:受保護的幸缕,可以被當前類群发、同一個包中的類或該類的子類訪問。使用protected修飾的成員可以在當前類发乔、同一個包中的類或該類的子類中訪問熟妓,但不能在其他包中訪問。
默認(即不使用任何修飾符):默認的栏尚,可以被當前類起愈、同一個包中的類訪問。使用默認訪問權限修飾的成員可以在當前類译仗、同一個包中的類中訪問抬虽,但不能在其他包中訪問。
private:私有的纵菌,只能被當前類訪問阐污。使用private修飾的成員只能在當前類中訪問,其他類或對象不能訪問咱圆。
需要注意的是笛辟,訪問權限修飾符只能控制成員的可見性,而不能控制成員的訪問方式(如讀寫權限等)序苏。如果需要控制成員的訪問方式手幢,可以使用讀寫方法(getter和setter方法)來實現(xiàn)。
構造方法的返回值類型?:?無
沒有返回值類型
在Java中忱详,構造方法是一種特殊的方法围来,用于創(chuàng)建對象并初始化對象的成員變量。構造方法與普通方法的區(qū)別在于匈睁,構造方法的名字必須與類名相同管钳,沒有返回值類型,并且在創(chuàng)建對象時自動被調用软舌。
因此,構造方法沒有返回值類型牛曹,也不需要使用return語句來返回值佛点。在構造方法中,我們可以使用this關鍵字來引用當前對象,從而為對象的成員變量賦初值超营。例如:
public class Person {
? ? private String name;
? ? private int age;
? ? // 構造方法
? ? public Person(String name, int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? // getter和setter方法
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
}
在上面的例子中鸳玩,Person類有一個構造方法,用于初始化對象的name和age成員變量演闭。
構造方法的名字與類名相同不跟,沒有返回值類型。在構造方法中米碰,我們使用this關鍵字來引用當前對象窝革,并為對象的成員變量賦初值。
成員變量和局部變量的區(qū)別
作用范圍不同
生命周期不同
初始化方式不同
可見性和訪問權限不同
成員變量(Instance Variable)是定義在類中吕座、方法外的變量虐译,它們屬于對象的屬性,每個對象都擁有一份獨立的成員變量副本吴趴。成員變量可以使用訪問修飾符(public漆诽、private、protected或默認)來控制其可見性和訪問權限锣枝。成員變量在對象創(chuàng)建時被初始化厢拭,它們的值可以通過對象訪問或者通過對象的方法來修改。
局部變量(Local Variable)是定義在方法或代碼塊內部的變量撇叁,它們只在定義它們的方法或代碼塊中有效供鸠,超出這個范圍就不能被訪問。局部變量不需要使用訪問修飾符來控制其可見性和訪問權限税朴。局部變量必須在使用之前被初始化回季,否則編譯器會報錯。
成員變量和局部變量的區(qū)別主要有以下幾點:
作用范圍不同:成員變量的作用范圍是整個類正林,而局部變量的作用范圍僅限于方法或代碼塊內部泡一。
生命周期不同:成員變量的生命周期與對象的生命周期相同,對象銷毀時成員變量也會被銷毀觅廓,而局部變量的生命周期僅限于方法或代碼塊的執(zhí)行期間鼻忠,方法或代碼塊結束時局部變量會被銷毀。
初始化方式不同:成員變量在對象創(chuàng)建時會被自動初始化杈绸,而局部變量必須在使用之前被手動初始化帖蔓。
可見性和訪問權限不同:成員變量可以使用訪問修飾符來控制其可見性和訪問權限,而局部變量不需要使用訪問修飾符來控制其可見性和訪問權限瞳脓。
需要注意的是塑娇,如果在方法或代碼塊內部定義了與成員變量同名的局部變量,局部變量會覆蓋成員變量的值劫侧。
如果需要訪問成員變量而不是局部變量埋酬,可以使用this關鍵字來引用當前對象的成員變量哨啃。
重載和重寫
重載(Overloading)和重寫(Overriding)是Java中兩個重要的概念,它們都是實現(xiàn)多態(tài)性的重要手段写妥,但是它們的含義和使用場景不同拳球。
重載(Overloading)是指在同一個類中定義多個方法,它們具有相同的名字但參數(shù)列表不同(參數(shù)類型珍特、參數(shù)個數(shù)或參數(shù)順序不同)祝峻,編譯器會根據(jù)調用時的實參類型和數(shù)量來自動選擇相應的方法。重載可以提高代碼的復用性和可讀性扎筒,但是方法的簽名必須不同才能進行重載莱找。
例如:
public class Calculator {
? ? public int add(int a, int b) {
? ? ? ? return a + b;
? ? }
? ? public double add(double a, double b) {
? ? ? ? return a + b;
? ? }
}
在上面的例子中,Calculator類中定義了兩個名為add的方法砸琅,它們的參數(shù)列表不同(一個是int類型宋距,一個是double類型),因此它們可以共用同一個方法名症脂。在調用add方法時谚赎,編譯器會根據(jù)傳入的參數(shù)類型自動選擇調用哪個方法。
重寫(Overriding)是指子類覆蓋父類的同名方法诱篷,實現(xiàn)多態(tài)性壶唤。重寫要求子類方法與父類方法的方法名、返回類型和參數(shù)列表完全相同棕所,訪問權限不能更低闸盔,拋出的異常類型不能更多。
重寫可以實現(xiàn)子類對父類方法的修改或擴展琳省,但是不能改變方法的基本特征迎吵。
例如:
public class Animal {
? ? public void eat() {
? ? ? ? System.out.println("Animal is eating.");
? ? }
}
public class Cat extends Animal {
? ? @Override
? ? public void eat() {
? ? ? ? System.out.println("Cat is eating.");
? ? }
}
在上面的例子中,Cat類繼承了Animal類针贬,并重寫了其eat方法击费。在調用eat方法時,如果對象是Cat類型桦他,則會調用Cat類中的eat方法蔫巩;
如果對象是Animal類型,則會調用Animal類中的eat方法快压。由于Cat類重寫了Animal類的eat方法圆仔,因此Cat類的對象調用eat方法時會輸出“Cat is eating.”。
靜態(tài)方法能不能使用this和super蔫劣,為什么坪郭?
靜態(tài)方法是屬于類的方法,不屬于任何對象脉幢,因此不能使用this關鍵字來引用當前對象截粗。this關鍵字表示當前對象的引用信姓,而靜態(tài)方法不需要通過對象來調用,因此不能使用this關鍵字绸罗。
另外,靜態(tài)方法也不能使用super關鍵字來調用父類的靜態(tài)方法豆瘫。super關鍵字用于引用父類的成員變量和方法珊蟀,但是靜態(tài)方法沒有重寫(Override)的概念,因此不存在父類和子類的靜態(tài)方法的關系外驱。
需要注意的是育灸,靜態(tài)方法只能訪問靜態(tài)成員變量和靜態(tài)方法,不能訪問非靜態(tài)成員變量和非靜態(tài)方法昵宇。
這是因為靜態(tài)方法在對象創(chuàng)建之前就已經(jīng)存在磅崭,而非靜態(tài)成員變量和非靜態(tài)方法必須在對象創(chuàng)建之后才能訪問。
如果需要訪問非靜態(tài)成員變量和非靜態(tài)方法瓦哎,可以通過創(chuàng)建對象來實現(xiàn)砸喻。
總之,靜態(tài)方法不能使用this關鍵字來引用當前對象蒋譬,也不能使用super關鍵字來調用父類的靜態(tài)方法割岛。靜態(tài)方法只能訪問靜態(tài)成員變量和靜態(tài)方法,不能訪問非靜態(tài)成員變量和非靜態(tài)方法犯助。
抽象類和接口
抽象類和接口是Java中兩種不同的機制癣漆,它們都可以用于實現(xiàn)面向對象編程中的多態(tài)性和封裝性,但是它們的用途和特點有所不同剂买。
抽象類(Abstract Class)是一種不能被實例化的類惠爽,它通常用于作為其他類的基類,其中可能包含一些已經(jīng)實現(xiàn)的方法和一些待實現(xiàn)的抽象方法瞬哼。抽象方法沒有方法體婚肆,由子類來實現(xiàn)。抽象類可以包含實例變量倒槐、構造方法和非抽象方法旬痹,但是不能被實例化。
抽象類的特點包括:
抽象類不能被實例化讨越,只能被繼承两残;
抽象類可以包含一些已經(jīng)實現(xiàn)的方法和一些待實現(xiàn)的抽象方法;
抽象方法只有方法簽名把跨,沒有方法體人弓,由子類來實現(xiàn);
子類必須實現(xiàn)父類中的所有抽象方法着逐,否則子類也必須聲明為抽象類崔赌;
抽象類可以包含實例變量意蛀、構造方法和非抽象方法;
抽象類不能被final修飾健芭,因為它需要被繼承县钥。
接口(Interface)是一種特殊的抽象類,它定義了一組方法的簽名慈迈,但是沒有任何實現(xiàn)若贮。接口中的方法都是抽象方法,沒有方法體痒留,由實現(xiàn)接口的類來實現(xiàn)谴麦。接口可以包含常量和默認方法(帶有默認實現(xiàn)的方法),但是不能包含實例變量和構造方法伸头。
接口的特點包括:
接口定義了一組方法的簽名匾效,所有實現(xiàn)該接口的類都必須實現(xiàn)這些方法;
接口中的方法都是抽象方法恤磷,沒有方法體面哼,由實現(xiàn)接口的類來實現(xiàn);
接口可以包含常量和默認方法(帶有默認實現(xiàn)的方法)碗殷,但是不能包含實例變量和構造方法精绎;
類可以實現(xiàn)多個接口,從而具有多種行為锌妻;
接口可以被擴展代乃,一個接口可以繼承另一個接口。
抽象類和接口都是用于實現(xiàn)多態(tài)性和封裝性的重要機制仿粹,它們的使用場景和特點有所不同搁吓。通常情況下,如果需要定義一些已經(jīng)實現(xiàn)的方法和一些待實現(xiàn)的抽象方法吭历,可以使用抽象類堕仔;如果需要定義一組方法的簽名,但是不關心具體實現(xiàn)晌区,可以使用接口摩骨。需要根據(jù)具體情況來選擇合適的機制來實現(xiàn)代碼的設計。
方法的簽名
在Java中朗若,方法的簽名(Signature)是指方法名和參數(shù)類型組成的信息恼五,用于區(qū)分不同的方法。
方法的簽名包括方法名和參數(shù)列表的類型和順序哭懈,但不包括方法的返回類型和訪問修飾符灾馒。
例如,以下是兩個簽名不同的方法:
public void print(int num, String text) {
? ? // ...
}
public void print(String text, int num) {
? ? // ...
}
這兩個方法的方法名都是print遣总,但是它們的參數(shù)列表的類型和順序不同睬罗。因此轨功,這兩個方法的簽名是不同的,它們可以共用同一個方法名容达,但是它們是不同的方法古涧。
在Java中,方法的簽名在重載(Overloading)中起到重要的作用花盐。如果在同一個類中定義了多個方法名相同但參數(shù)列表不同的方法蒿褂,編譯器會根據(jù)調用時傳入的實參類型和數(shù)量來自動選擇相應的方法。因此卒暂,方法的簽名必須不同才能進行重載。如果兩個方法的簽名相同娄帖,編譯器會報錯也祠。
需要注意的是,方法的返回類型和訪問修飾符不屬于方法的簽名范疇近速,因此不同的方法可以有相同的返回類型和訪問修飾符诈嘿。
單繼承,多繼承
單繼承(Single Inheritance)和多繼承(Multiple Inheritance)是面向對象編程中的兩種繼承方式削葱,它們的主要區(qū)別在于一個類是否可以同時繼承多個父類奖亚。
單繼承(Single Inheritance)是指一個類只能繼承一個父類。在Java中析砸,每個類都隱式繼承自Object類昔字,因此Java中所有的類都是單繼承的。單繼承可以簡化類之間的關系首繁,減少類之間的耦合度作郭,使繼承關系更加清晰。
例如:
public class Animal {
? ? // ...
}
public class Cat extends Animal {
? ? // ...
}
在上面的例子中弦疮,Cat類繼承自Animal類夹攒,它只繼承了一個父類。
多繼承(Multiple Inheritance)是指一個類可以同時繼承多個父類胁塞。多繼承可以實現(xiàn)代碼的復用和靈活性咏尝,但是也增加了類之間的耦合度和復雜性,容易導致歧義和沖突啸罢。
在Java中编检,由于多繼承可能導致歧義和沖突,因此Java不支持多繼承伺糠。但是Java可以通過接口來實現(xiàn)類似于多繼承的效果蒙谓。一個類可以實現(xiàn)多個接口,從而具有多種行為训桶。
例如:
public interface Flyable {
? ? void fly();
}
public interface Swimmable {
? ? void swim();
}
public class Duck implements Flyable, Swimmable {
? ? public void fly() {
? ? ? ? // ...
? ? }
? ? public void swim() {
? ? ? ? // ...
? ? }
}
在上面的例子中累驮,Duck類實現(xiàn)了Flyable和Swimmable接口酣倾,從而具有飛行和游泳的行為。盡管Duck類沒有直接繼承任何父類谤专,但是通過實現(xiàn)接口躁锡,它可以具有多種行為,實現(xiàn)了類似于多繼承的效果置侍。
總之映之,單繼承和多繼承是面向對象編程中的兩種繼承方式,它們的主要區(qū)別在于一個類是否可以同時繼承多個父類蜡坊。在Java中杠输,所有的類都是單繼承的,但是可以通過實現(xiàn)接口來實現(xiàn)類似于多繼承的效果秕衙。
集合框架??list??set??Map
集合框架(Collections Framework)是Java中提供的一個用于存儲和操作數(shù)據(jù)的框架蠢甲,它包括了一系列接口和類,用于表示和操作不同類型的數(shù)據(jù)集合据忘。其中鹦牛,List、Set和Map是三個常用的接口勇吊,分別代表了列表曼追、集合和映射撰洗。
List(是Java集合框架中表示列表(List)的接口叶堆。)
List是一個有序的集合,它可以存儲重復的元素茸时。List中的元素可以根據(jù)索引(下標)進行訪問和操作鲫忍。List的實現(xiàn)類包括ArrayList膏燕、LinkedList和Vector等。
例如:
List<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
list.add("orange");
System.out.println(list.get(1)); // 輸出 "banana"
List的常用實現(xiàn)類包括:
ArrayList:基于數(shù)組實現(xiàn)的List悟民,支持快速隨機訪問和增刪操作坝辫,適用于大量隨機訪問和尾部增刪的場景;
LinkedList:基于鏈表實現(xiàn)的List射亏,支持快速的頭部和尾部增刪操作近忙,適用于大量頭部和尾部增刪的場景;
Vector:與ArrayList類似智润,但是是線程安全的及舍,支持同步訪問。
例如窟绷,可以用以下代碼創(chuàng)建一個ArrayList锯玛,并向其中添加一些元素:
List<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
list.add("orange");
這樣就創(chuàng)建了一個包含三個元素的列表,可以通過get()方法來訪問其中的元素:
System.out.println(list.get(1)); // 輸出 "banana"
Set(是Java集合框架中表示集合(Set)的接口。)
Set是一個無序的集合攘残,它不允許存儲重復的元素拙友。Set中的元素沒有順序,不能根據(jù)索引進行訪問和操作歼郭。Set的實現(xiàn)類包括HashSet遗契、TreeSet和LinkedHashSet等。
例如:
Set<String> set = new HashSet<String>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set.contains("banana")); // 輸出 "true"
Set的常用實現(xiàn)類包括:
HashSet:基于哈希表實現(xiàn)的Set病曾,不保證元素的順序牍蜂,元素存儲的順序取決于哈希值的分布,具有快速查找的優(yōu)點泰涂;
TreeSet:基于紅黑樹實現(xiàn)的Set鲫竞,可以按照元素的自然排序或指定的比較器進行排序,具有有序性的優(yōu)點逼蒙;
LinkedHashSet:基于哈希表和鏈表實現(xiàn)的Set贡茅,保證元素的插入順序,具有快速訪問和有序性的優(yōu)點其做。
例如,可以用以下代碼創(chuàng)建一個HashSet赁还,并向其中添加一些元素:
Set<String> set = new HashSet<String>();
set.add("apple");
set.add("banana");
set.add("orange");
這樣就創(chuàng)建了一個包含三個元素的集合妖泄,可以通過contains()方法來判斷一個元素是否在集合中:
System.out.println(set.contains("banana")); // 輸出 "true"
Map(是Java集合框架中表示集合(Set)的接口。)
Map是一種鍵值對(Key-Value)的映射艘策,它允許存儲重復的值蹈胡,但是不允許重復的鍵。Map中的元素可以根據(jù)鍵進行訪問和操作朋蔫。Map的實現(xiàn)類包括HashMap罚渐、TreeMap和LinkedHashMap等。
例如:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
System.out.println(map.get("banana")); // 輸出 2
Map的常用實現(xiàn)類包括:
HashMap:基于哈希表實現(xiàn)的Map驯妄,不保證元素的順序荷并,可以快速的通過鍵查找值;
TreeMap:基于紅黑樹實現(xiàn)的Map青扔,可以按照鍵的自然排序或指定的比較器進行排序源织,具有有序性的優(yōu)點;
LinkedHashMap:基于哈希表和鏈表實現(xiàn)的Map微猖,保證元素的插入順序谈息,具有快速訪問和有序性的優(yōu)點。
例如凛剥,可以用以下代碼創(chuàng)建一個HashMap侠仇,并向其中添加一些鍵值對:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
這樣就創(chuàng)建了一個包含三個鍵值對的Map,可以通過get()方法來根據(jù)鍵獲取對應的值:
System.out.println(map.get("banana")); // 輸出 2
需要注意的是犁珠,List逻炊、Set和Map是三個不同的接口互亮,它們的實現(xiàn)類有所不同,具有不同的特點和用途嗅骄。在使用集合框架時胳挎,需要根據(jù)具體的需求來選擇合適的接口和實現(xiàn)類來存儲和操作數(shù)據(jù)集合。