成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM內(nèi)存分配及String常用方法

云計(jì)算 虛擬化
在介紹String類之前,先來簡(jiǎn)單分析一下在JVM中,對(duì)內(nèi)存的使用是如何進(jìn)行分配的。JVM將內(nèi)存分為多個(gè)不同的區(qū)域,這些區(qū)域都有各自的用途、創(chuàng)建和銷毀的時(shí)間,有些區(qū)域隨虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有些區(qū)域則是依賴用戶線程的啟動(dòng)和結(jié)束來建立和銷毀。

[[275905]]

 一,JVM內(nèi)存分配和常量池

​ 在介紹String類之前,先來簡(jiǎn)單分析一下在JVM中,對(duì)內(nèi)存的使用是如何進(jìn)行分配的。如下圖所示(注意:在jdk1.8之后便沒有方法區(qū)了):

 

​ 如上JVM將內(nèi)存分為多個(gè)不同的區(qū)域,這些區(qū)域都有各自的用途、創(chuàng)建和銷毀的時(shí)間,有些區(qū)域隨虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有些區(qū)域則是依賴用戶線程的啟動(dòng)和結(jié)束來建立和銷毀。

區(qū)域名稱的說明:

1.1,方法區(qū):

​ 屬于數(shù)據(jù)共享內(nèi)存區(qū)域,存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

1.2,虛擬機(jī)棧

​ 虛擬機(jī)棧就是我們通常說的棧,是Java執(zhí)行方法的內(nèi)存模型,每當(dāng)執(zhí)行一次方法時(shí),都會(huì)創(chuàng)建一個(gè)棧幀。把棧幀壓入棧,當(dāng)Java方法調(diào)用時(shí)返回正常的結(jié)果或者捕獲異常時(shí),棧幀出棧。

​ 棧幀:棧幀存儲(chǔ)方法的相關(guān)信息,包含局部變量數(shù)表、返回值、操作數(shù)棧、動(dòng)態(tài)鏈接。

1.3,本地方法棧

​ 從功能上來說與虛擬機(jī)棧類似,但是虛擬機(jī)棧執(zhí)行的是字節(jié)碼,而本地方法棧調(diào)用的是Native方法,并且它是線程獨(dú)享的。

1.4,程序計(jì)數(shù)器

​ 程序計(jì)數(shù)器是線程獨(dú)享的,它是記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)。在多線程執(zhí)行時(shí),CPU會(huì)來回在線程之間進(jìn)行切換,那么當(dāng)再次回到一條線程時(shí),是如何得知線程的存儲(chǔ)單元及執(zhí)行指令。而程序計(jì)數(shù)器便會(huì)進(jìn)行存儲(chǔ)下一條存儲(chǔ)單元的地址,執(zhí)行完畢后程序計(jì)數(shù)器自動(dòng)加 1 ,以此循環(huán)直到程序結(jié)束為止。

1.5,堆

​ 說到堆這個(gè)概念想必都不陌生,它是內(nèi)存中的重要角色。它主要是用來存儲(chǔ)被創(chuàng)建出來的對(duì)象,通過關(guān)鍵字new實(shí)例出來的,是所有線程共享的一塊最大的區(qū)域。

​ ==特別注意:在JDK1.7及以后,常量池移動(dòng)到堆內(nèi)存中。==

​ 堆還包括一個(gè)==常量池==,用來存儲(chǔ)編譯期間生成的==字面量和符號(hào)==引用。這部分內(nèi)容在類被加載后,都會(huì)存儲(chǔ)到方法區(qū)中。同時(shí),運(yùn)行時(shí)產(chǎn)生的新常量也可以被放入常量池中,比如 String 類中的 intern() 方法產(chǎn)生的常量。

​ 常量池就是這個(gè)類型用到的常量的一個(gè)有序集合。包括直接常量(基本類型,String)和對(duì)其他類型、方法、字段的符號(hào)引用。

二,常量池

2.1,什么是常量:

​ 常量是指被final修飾的變量,值一旦確定就無法改變。

​ final可以修飾靜態(tài)變量、方法、實(shí)例變量和局部變量。

​ 常量池分為兩種形式:靜態(tài)常量池和運(yùn)行時(shí)常量池

2.2,靜態(tài)常量池

​ 即*.class文件中的常量池,class文件中的常量池不僅僅包含字符串(數(shù)字)字面量,還包含類、方法的信息,占用class文件絕大部分空間。這種常量池用于存放字面量和符號(hào)引用量。

2.3,運(yùn)行時(shí)常量池

​ 指JVM虛擬機(jī)在完成類裝載操作后,將class文件中的常量池載入到內(nèi)存中,并保存在方法區(qū)中,我們常說的常量池,就是指方法區(qū)中的運(yùn)行時(shí)常量池。同樣運(yùn)行時(shí)常量池一個(gè)重要的特征就是具有動(dòng)態(tài)性,指并不需要常量只有在編譯期才會(huì)產(chǎn)生,在運(yùn)行期也會(huì)將新的常量保存到常量池中,如String類中的intern()方法。

三,== 和equals

3.1,兩者之間區(qū)邊

​ ==:

​ 對(duì)于基本類型來說:==表示數(shù)值的比較

​ 對(duì)于引用類型來說:==表示地址值的比較

​ equals:

​ 比較的是兩者之間值是否相等,但是Java中的類都是直接或者間接繼承Object類,而equals不也例外。其實(shí)在equals源碼中也是使用==進(jìn)行比較的,如下源碼:

  1. ![](https://img2018.cnblogs.com/blog/1655301/201909/1655301-20190902223856542-1095893842.png) 

​ 那么問題來了,這和==又有什么區(qū)別呢?

​ 上面說到equals也是繼承自java.lang.Object,因此可以對(duì)equals進(jìn)行重寫來定義我們自己的比較方式。

​ 請(qǐng)參看以下代碼:

  1. String str1 = "abc"
  2.         String str2 = "abc"
  3.  
  4.         char[] strArray = {'a','b','c'}; 
  5.         String str3 = new String(strArray); 
  6.  
  7.         String str4 = "abc"
  8.  
  9.         System.out.println(str1 == str2);    
  10.         System.out.println(str1 == str3);    
  11.         System.out.println(str2 == str3);    
  12.         System.out.println(str4.equals(str1));  

​ 以上運(yùn)行結(jié)果為:

  1. true 
  2. false 
  3. false 
  4. true 

​ 接下來我們依次分析上面的結(jié)果:

​ 1,str1與str2比較的是字符串對(duì)象地址,因?yàn)樗鼈兊闹凳窍嗤?,所以地址值也是相同的?/p>

​ 2,str3是new出來的示例對(duì)象,在堆內(nèi)存中會(huì)開辟一塊新的內(nèi)存地址,它并不在常量池中。所以返回結(jié)果為false。

​ 3,同理str2與str3比較也是一樣的結(jié)果。

​ 4,equals比較的是值是否相同,所以返回的結(jié)果為true。

如圖所示:

 

四,String常用方法

​ 首先聲明字符串:

  1. String str1 = "abc"

4.1,int length()

  1. int length = str1.length(); 
  2.  System.out.println(length); 

4.2,char charAt(值)

  1. String str= "abc"
  2. char c = str.charAt(1);   
  3. System.out.println(c);  

4.3,char toCharArray()

  1. String str= "abc"; 
  2. char c[] = str.toCharArray();   
  3. for (int i = 0; i < c.length; i++) { 
  4.       System.out.println("轉(zhuǎn)為數(shù)組輸出:" + c[i]); 

4.4,int indexOf("字符"); int lastIndexOf("字符")

  1. String str="axcdefgabc"
  2. int a1 = str.indexOf("a");  
  3. int a2 = str.indexOf("x",  2); 
  4. int a3 = str.lastIndexOf("c");  
  5. System.out.println("你的位置為:" + a1);  
  6. System.out.println("為的位置為:" + a2); 
  7. System.out.println("點(diǎn)最后出現(xiàn)的位置為:" + a3); 

4.5,字符串大小寫轉(zhuǎn)換

​ toUpperCase(); 轉(zhuǎn)換成大寫

​ toLowerCase();轉(zhuǎn)換成小寫

  1. String str = "hello world"
  2. String str1 = "HELLO WORD"
  3. System.out.println("將字符串轉(zhuǎn)大寫為:" + str.toUpperCase()); 
  4. System.out.println("將字符串轉(zhuǎn)換成小寫為:" + str1.toLowerCase()); 

4.6,String[] split("字符")

  1. String str = "abc,def,123"
  2. String[] arr1 = str.split(","); 

4.7,boolean equals(Object anObject)

  1. String str = "abc"
  2.  String str1= "123";   
  3.  if(str.equals(str1)) {   
  4.       System.out.println("相等");  
  5.  }   
  6.  else
  7.       System.out.println("不相等");   
  8.  } 

4.8,String trim()

  1. String str = "       abc         ";   
  2. System.out.println("去掉左右空格后:" + str.trim()); 

4.9,字符串替換

  1. String replace(char oldChar,char newChar) 
  2. ​ String replaceAll(String,String)將某個(gè)內(nèi)容全部替換成指定內(nèi)容 
  3. ​ String repalceFirst(String,String)將第一次出現(xiàn)的某個(gè)內(nèi)容替換成指定的內(nèi)容 
  4.  
  5. String str = "abcdefgabdc";   
  6. System.out.println("替換:" + str.replace("abc""123"));  
  7. System.out.println("替換全部:" + str.replaceAll("ab""12"));  
  8. System.out.println("替換第一次出現(xiàn):" + str.repalceFirst("a""a"));  

4.10,String substring(int beginIndex,int endIndex)

  1. String str = "abcdefg";   
  2.  // 截取0-3個(gè)位置的內(nèi)容, 不含3  
  3.  System.out.println("截取后的字符為:" + str.substring(0, 3)); 
  4.  // 從第3個(gè)位置開始截取, 含2 
  5.  System.out.println("截取后字符為:" + str.substring(2)); 

4.11,boolean equalsIgnoreCase(String)

  1. String str = "ABC"
  2. String str1 = "abc"
  3. if(str.equalsIgnoreCase(str1)){ 
  4.        System.out.println("相等"); 
  5. else
  6.        System.out.println("不相等"); 

4.12,boolean contains(String)

  1. String str = "ABCDEF"
  2. String str1 = "ABC"
  3. if(str.contains(str1)){ 
  4.        System.out.println("str內(nèi)容中包含ABC"); 
  5. else
  6.        System.out.println("str內(nèi)容中不包含ABC"); 

五,總結(jié)

​ 1,對(duì)于JVM內(nèi)存的分配,在jdk6中存在方法區(qū),jdk8中便沒有方法區(qū),改成元區(qū)域。

​ 2,jdk6中常量池存在方法區(qū)中,jdk7以后常量池移動(dòng)到堆中。

責(zé)任編輯:武曉燕 來源: 博客園
相關(guān)推薦

2012-01-11 10:45:57

JavaJVM

2010-09-25 15:40:52

配置JVM內(nèi)存

2018-04-08 08:45:53

對(duì)象內(nèi)存策略

2009-07-09 10:01:26

設(shè)置JVM內(nèi)存分配

2022-01-07 13:50:55

語言內(nèi)存代碼

2009-06-12 09:46:40

Java String

2021-10-15 08:51:09

Linux內(nèi)存 Kmalloc

2011-12-20 10:43:21

Java

2020-05-27 21:13:27

JavaJVM內(nèi)存

2010-10-19 14:48:09

Java String

2010-09-27 13:41:22

JVM內(nèi)存回收

2023-03-26 00:43:42

JVM對(duì)象測(cè)試

2021-07-30 07:22:51

JVM虛擬機(jī)棧 Stack

2018-12-20 10:17:35

JVM模型內(nèi)存溢出

2010-09-27 11:00:27

TomcatJVM內(nèi)存

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2010-09-26 15:38:33

JVM內(nèi)存泄漏

2009-08-27 18:04:01

c#擴(kuò)展方法string

2019-09-02 14:53:53

JVM內(nèi)存布局GC

2025-03-03 09:05:56

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 日韩精品一区二区三区在线观看 | 国产黄色免费网站 | 999久久久久久久 | 亚洲综合精品 | 色av一区二区 | 9999国产精品欧美久久久久久 | 欧美精品一区三区 | 亚洲精品99999 | 天堂一区二区三区四区 | av一二三区 | 老司机深夜福利网站 | 欧美嘿咻| 99国内精品久久久久久久 | 一级h片| 黑人巨大精品欧美一区二区免费 | 日韩黄色小视频 | 国产98在线 | 免费, | 日本午夜精品一区二区三区 | 一级特黄视频 | av性色全交蜜桃成熟时 | 久久久成人精品 | 国产成在线观看免费视频 | 亚洲成人一区二区 | 懂色一区二区三区免费观看 | 在线观看视频一区二区三区 | 天天干天天操天天看 | 99久久日韩精品免费热麻豆美女 | 福利网址 | 欧美成人a | 久久久精彩视频 | 天堂在线免费视频 | 日韩高清在线观看 | 男女免费观看在线爽爽爽视频 | 国产黑丝在线 | 操久久| 播放一级毛片 | 国产一区二区三区在线 | 视频一区中文字幕 | 免费观看成人鲁鲁鲁鲁鲁视频 | 成人精品久久日伦片大全免费 |