欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java數(shù)組與堆棧相關(guān)知識(shí)總結(jié)

 更新時(shí)間:2021年06月29日 11:26:31   作者:吼吼權(quán)  
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java數(shù)組與堆棧展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、數(shù)組創(chuàng)建

1.1 聲明并賦值

int[] a = {1,2,3};

1.2 聲明數(shù)組名開辟空間并且賦值

int[] a;
a = new int[]{1,2,3};

1.3 聲明數(shù)組時(shí)指定元素個(gè)數(shù)然后賦值

int[] a= new int[3];

這里Java會(huì)默認(rèn)數(shù)組元素值為0

1.4 在以上的基礎(chǔ)上創(chuàng)建多維數(shù)組

int[][] a = {{1,2,3},{4,5,6},{7,8,9}}; //每個(gè)子數(shù)組元素個(gè)數(shù)不要求均相同
int[][] a = new int[m][n]; //其中n可以省略,在創(chuàng)建的時(shí)候可以指定
int[][][] a = new int[m][n][q]; //同樣其中n、q可以省略

同樣的,在new一個(gè)數(shù)組時(shí),如不初始化,Java會(huì)默認(rèn)數(shù)組元素值為0。

二、數(shù)據(jù)類型

Java中的數(shù)據(jù)類型有兩種:

2.1 八種基本數(shù)據(jù)類型

  • int
  • short
  • long
  • byte
  • float
  • double
  • boolean
  • char

這種類型的定義是通過諸如int a = 3; long b = 255L;的形式來定義的,稱為自動(dòng)變量。
自動(dòng)變量存的是字面值,這些字面值固定定義在某個(gè)程序塊里面,程序塊退出后,字段值就消失了,出于追求速度的原因,就存在于棧中。

2.2 包裝類數(shù)據(jù)

包裝類的數(shù)據(jù)是如 Integer, String, Double等將相應(yīng)的基本數(shù)據(jù)類型包裝起來的類。這些類數(shù)據(jù)全部存在于堆中,Java用new()語(yǔ)句來顯式地告訴編譯器,在運(yùn)行時(shí)才根據(jù)需要?jiǎng)討B(tài)創(chuàng)建,因此比較靈活,但缺點(diǎn)是要占用更多的時(shí)間。
String是一個(gè)特殊的包裝類數(shù)據(jù)。即可以用String str = "abc";的形式來創(chuàng)建,也可以用String str = new String("abc");的形式來創(chuàng)建。String str = "abc";中,并沒有通過new()來創(chuàng)建實(shí)例,因?yàn)?code>String str = "abc"; 是存儲(chǔ)在字符串常量池中。 字符串常量池則存在于方法區(qū)。
JVM為了提高性能和減少內(nèi)存開銷,在實(shí)例化字符串常量的時(shí)候進(jìn)行了一些優(yōu)化。

1.為字符串開辟一個(gè)字符串常量池,類似于緩存區(qū)。

2.創(chuàng)建字符串常量時(shí),首先堅(jiān)持字符串常量池是否存在該字符串。存在該字符串,

3.返回引用實(shí)例,不存在,實(shí)例化該字符串并放入池中。

String str1 = "abc"; 
String str2 = "abc";
System.out.println(str1==str2); //true

可以看到結(jié)果是true,結(jié)果說明,JVM創(chuàng)建了兩個(gè)引用str1和str2,但只創(chuàng)建了一個(gè)對(duì)象,而且兩個(gè)引用都指向了這個(gè)對(duì)象。

String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
System.out.println(str1 + "," + str2); //bcd, abc
System.out.println(str1==str2); //false

參考上面的代碼可以知道,賦值的變化導(dǎo)致了類對(duì)象引用的變化,str1指向了另外一個(gè)新對(duì)象!而str2仍舊指向原來的對(duì)象。上例中,當(dāng)我們將str1的值改為"bcd"時(shí),JVM發(fā)現(xiàn)在棧中沒有存放該值的地址,便開辟了這個(gè)地址,并創(chuàng)建了一個(gè)新的對(duì)象,其字符串的值指向這個(gè)地址。
事實(shí)上,String類被設(shè)計(jì)成為不可改變(immutable)的類。如果你要改變其值,可以,但JVM在運(yùn)行時(shí)根據(jù)新值悄悄創(chuàng)建了一個(gè)新對(duì)象,然后將這個(gè)對(duì)象的地址返回給原來類的引用。這個(gè)創(chuàng)建過程雖說是完全自動(dòng)進(jìn)行的,但它畢竟占用了更多的時(shí)間。在對(duì)時(shí)間要求比較敏感的環(huán)境中,會(huì)帶有一定的不良影響。
因此,并沒有與String是不可變的相矛盾。
繼續(xù)修改代碼:

String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
String str3 = str1;
System.out.println(str3); //bcd
String str4 = "bcd";
System.out.println(str1 == str4); //true

可以看出,str3 這個(gè)對(duì)象的引用直接指向str1所指向的對(duì)象(注意,str3并沒有創(chuàng)建新對(duì)象)。當(dāng)str1改完其值后,再創(chuàng)建一個(gè)String的引用str4,并指向因str1修改值而創(chuàng)建的新的對(duì)象??梢园l(fā)現(xiàn),這回str4也沒有創(chuàng)建新的對(duì)象,從而再次實(shí)現(xiàn)棧中數(shù)據(jù)的共享。
繼續(xù)修改代碼:

String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false

可以發(fā)現(xiàn)此時(shí)返回false,這是因?yàn)橥ㄟ^new出來的放在了中,而第二個(gè)存于棧中,所以不相等。
另外:數(shù)據(jù)類型包裝類的值不可修改。不僅僅是String類的值不可修改,所有的數(shù)據(jù)類型包裝類都不能更改其內(nèi)部的值。

三、棧、棧、方法區(qū)

是一種連續(xù)儲(chǔ)存的數(shù)據(jù)結(jié)構(gòu),具有先進(jìn)后出的性質(zhì)。
是一種非連續(xù)的樹形儲(chǔ)存數(shù)據(jù)結(jié)構(gòu),每個(gè)節(jié)點(diǎn)有一個(gè)值,整棵樹是經(jīng)過排序的。特點(diǎn)是根結(jié)點(diǎn)的值最?。ɑ蜃畲螅?,且根結(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆。常用來實(shí)現(xiàn)優(yōu)先隊(duì)列,存取隨意。
(stack)與(heap)都是Java用來在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投?,程序員不能直接地設(shè)置?;蚨?。

3.1 棧

1.每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對(duì)象和自定義對(duì)象的引用(不是對(duì)象)。

2.每個(gè)棧中的數(shù)據(jù)(原始類型和對(duì)象引用)都是私有的。

3.棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)

4.數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就會(huì)自動(dòng)消失。

通常的操作有入棧(壓棧),出棧和棧頂元素。想要讀取棧中的某個(gè)元素,就是將其之間的所有元素出棧才能完成。

棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。
另外,棧數(shù)據(jù)可以共享
類似于int a = 3;等都是存放于棧中,當(dāng)新創(chuàng)建值時(shí)Java會(huì)判斷棧中是否已存在,若存在則引用該地址,不存在則創(chuàng)建。例如:

 int a = 3; int b = 3;

編譯器先處理int a = 3;首先它會(huì)在棧中創(chuàng)建一個(gè)變量為a的引用,然后查找有沒有字面值為3的地址,沒找到,就開辟一個(gè)存放3這個(gè)字面值的地址,然后將a指向3的地址。接著處理int b = 3;在創(chuàng)建完b的引用變量后,由于在棧中已經(jīng)有3這個(gè)字面值,便將b直接指向3的地址。這樣,就出現(xiàn)了a與b同時(shí)均指向3的情況。
特別注意的是,這種字面值的引用與類對(duì)象的引用不同。假定兩個(gè)類對(duì)象的引用同時(shí)指向一個(gè)對(duì)象,如果一個(gè)對(duì)象引用變量修改了這個(gè)對(duì)象的內(nèi)部狀態(tài),那么另一個(gè)對(duì)象引用變量也即刻反映出這個(gè)變化。相反,通過字面值的引用來修改其值,不會(huì)導(dǎo)致另一個(gè)指向此字面值的引用的值也跟著改變的情況。如上例,我們定義完a與 b的值后,再令a=4;那么,b不會(huì)等于4,還是等于3。在編譯器內(nèi)部,遇到a=4;時(shí),它就會(huì)重新搜索棧中是否有4的字面值,如果沒有,重新開辟地址存放4的值;如果已經(jīng)有了,則直接將a指向這個(gè)地址。因此a值的改變不會(huì)影響到b的值。

3.2 堆

的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

1.存儲(chǔ)的是對(duì)象,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class。

2.JVM只有一個(gè)堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對(duì)象引用,只存放對(duì)象本身。

3.對(duì)象的由垃圾回收器負(fù)責(zé)回收,因此大小和生命周期不需要確定。

3.3 方法區(qū)

1.靜態(tài)區(qū),跟堆一樣,被所有的線程共享。

2.方法區(qū)中包含的都是在整個(gè)程序中永遠(yuǎn)唯一的元素,如class,static變量

字符串常量池則存在于方法區(qū)

在這里插入圖片描述 字

符串對(duì)象的創(chuàng)建 面試題

面試題:String str4 = new String(“abc”) 創(chuàng)建多少個(gè)對(duì)象?

1、在常量池中查找是否有“abc”對(duì)象。

1)有則返回對(duì)應(yīng)的引用實(shí)例;

2)沒有則創(chuàng)建對(duì)應(yīng)的實(shí)例對(duì)象。

2、在堆中 new 一個(gè) String(“abc”) 對(duì)象。

3、將對(duì)象地址賦值給str4,創(chuàng)建一個(gè)引用。

所以,常量池中沒有“abc”字面量則創(chuàng)建兩個(gè)對(duì)象,否則創(chuàng)建一個(gè)對(duì)象,以及創(chuàng)建一個(gè)引用。

到此這篇關(guān)于Java數(shù)組與堆棧相關(guān)知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Java數(shù)組與堆棧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA報(bào)錯(cuò)war?exploded?is?not?valid問題

    解決IDEA報(bào)錯(cuò)war?exploded?is?not?valid問題

    在使用IntelliJ?IDEA時(shí)遇到'[projectname]warexploded'無效的問題,可以通過清除項(xiàng)目列表、重新導(dǎo)入項(xiàng)目和配置新的Tomcat來解決,確保在Tomcat配置中,將ApplicationContext修改為僅包含一個(gè)'/',這一方法或許能幫助遇到相似問題的開發(fā)者
    2024-09-09
  • java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)

    java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)

    下面小編就為大家?guī)硪黄猨ava-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Spring實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)

    Spring實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了一種Spring實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • JAVA使用quartz添加定時(shí)任務(wù),并依賴注入對(duì)象操作

    JAVA使用quartz添加定時(shí)任務(wù),并依賴注入對(duì)象操作

    這篇文章主要介紹了JAVA使用quartz添加定時(shí)任務(wù),并依賴注入對(duì)象操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑

    詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑

    這篇文章主要介紹了詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • Java類初始化和實(shí)例化中的2個(gè)“雷區(qū)”

    Java類初始化和實(shí)例化中的2個(gè)“雷區(qū)”

    這篇文章主要介紹了Java類初始化和實(shí)例化中的2個(gè)“雷區(qū)”,大家要注意,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 詳解Android中的Toast源碼

    詳解Android中的Toast源碼

    這篇文章主要介紹了詳解Android中的Toast源碼,Toast使用Java語(yǔ)言實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07
  • java實(shí)現(xiàn)肯德基收銀系統(tǒng)

    java實(shí)現(xiàn)肯德基收銀系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)肯德基收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解

    Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解,CGLIB是強(qiáng)大的、高性能的代碼生成庫(kù),被廣泛應(yīng)用于AOP框架,它底層使用ASM來操作字節(jié)碼生成新的類,為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問,需要的朋友可以參考下
    2023-11-11
  • springboot與redis的簡(jiǎn)單整合實(shí)例

    springboot與redis的簡(jiǎn)單整合實(shí)例

    Redis是一個(gè)緩存、消息代理和功能豐富的鍵值存儲(chǔ)。StringBoot提供了基本的自動(dòng)配置。這篇文章主要介紹了springboot與redis的簡(jiǎn)單整合實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01

最新評(píng)論