首頁 > 觀察 >

          String內存模型和Java常用方法

          2023-07-09 15:25:04 博客園

          一、String內存模型

          1、直接賦值創建string對象內存原理:

          StringTable(串池):字符串常量池,用來存儲字符串,只能是在直接賦值中使用才會存在串池當中(JDK7前串池是在方法區里面,StringTable(串池)在JDK7版本開始從方法區中挪到了堆內存,但是運行機制沒有發生變化)

          eg:


          (資料圖片)

          首先mian方法進棧,創建變量s1,查看串池里面有沒有abc,此時串池內沒有,就創建了一個新的abc,然后將地址值賦值給s1;

          創建變量s2,等號右邊直接賦值,查看串池里面有沒有abc,此時,串池里面已經存在abc,就不會創建abc,而是去復用已經存在的abc。

          2、小結:

          當使用雙引號直接賦值時,系統會檢查該字符串在串池中是否存在,如果不存在,創建新的,如果存在,就會復用

          3、特點:代碼簡單,節約內存

          4、、new關鍵字創建string對象內存原理

          這里以字符數據為例:

          首先main方法進棧,執行第一行代碼,此時在堆內存當中產生一個char類型的數組,地址值為0011;再把0011賦值給變量chs;創建s1對象,在堆內存創建一個字符數組內容的小空間,地址值為002,再把002賦值給s1;創建s2對象,在堆內存創建一個字符數組內容的小空間,地址值為003,再把003賦值給s2。

          注意:每new一次就會開辟一個新的空間,而且地址值都不相同,所以,這種方式創建的字符串不會復用

          特點:會浪費內存空間

          二、Java常用方法(比較)

          1、==號比的是什么?

          (1)基本數據類型:

          基本數據類型比較的是數據值

          (2)引用數據類型:

          引用數據類型比較的是地址值

          2、字符串比較

          3、直接賦值:

          創建變量s1,查看串池里面有沒有abc,此時串池內沒有,就創建了一個新的abc,然后將地址值賦值給s1;

          創建變量s2,等號右邊直接賦值,查看串池里面有沒有abc,此時,串池里面已經存在abc,就不會創建abc,而是去復用已經存在的abc。此時s1和s2指向的是同一個地址值,所以是True

          new關鍵字賦值:

          s1記錄的是堆里面的地址值,s2記錄的是串池中(也是在堆里面)的地址值

          4、用字符串比較內容:

          字符串比較:

          (1)boolean equals方法(要比較的字符串) :完全一樣的結果才是true,否則為false

          (2)boole equakslgnoreCase(要比較的字符串) :忽略大小寫的比較

          package com.itheima03.String;public class StringDemo02 {    public static void main(String[] args) {        //1、創建兩個字符串對象        String s1 = new String("abc");        String s2 = "ABc";        //2、==號比較        //引用數據類型:比的是地址值        //基本數據類型:比的是數據值        System.out.println(s1==s2);//false s1記錄的是堆里面的地址值,s2記錄的是串池里面的地址值        //3、比較字符串對象中的內容是否相等        boolean result = s1.equals(s2);        System.out.println(result);//false        //4、比較字符串對象中的內容是否相等,忽略大小寫(忽略大小寫,只能是英文狀態下的a和A,漢字的大小寫無法使用)        boolean result1 = s1.equalsIgnoreCase(s2);        System.out.println(result1);//true    }}

          運行結果:

          falsefalsetrue

          鍵盤錄入的字符串與賦值的字符串比較:

          package com.itheima03.String;import java.util.Scanner;public class StringDemo03 {    public static void main(String[] args) {        //從鍵盤錄入一個abc        Scanner sc = new Scanner(System.in);        System.out.println("請輸入一個字符串");        String s1 = sc.next();        //代碼中再定義一個字符串abc        String s2 = "abc";        //用==后比較S1和S2是否一樣        System.out.println(s1==s2);    }}

          運行結果:

          請輸入一個字符串abcfalse

          5、### 注意:

          字符串錄入的字符串是new出來的,s1與s2的地址值不同,s1是new出來的,是在堆內存里面,而s2直接賦值也是在堆內存里面,但是是在堆內存的串池里面,所以是false

          結論:以后只要想比較字符串的內容,就必須使用string里面的方法(equals和equakslgnoreCase)

          練習:用戶登錄

          需求:

          已知正確的用戶名和密碼,請用程序實現模擬用戶登錄,總共給三次機會,登錄之后,給出相應的提示

          package com.itheima03.String;import java.util.Scanner;/*練習:用戶登錄需求:已知正確的用戶名和密碼,請用程序實現模擬用戶登錄,總共給三次機會,登錄之后,給出相應的提示 */public class StringDemo04 {    public static void main(String[] args) {        //1、定義兩個變量記錄正確的用戶名和密碼        String rightName = "張三";        String rightPassword = "123456";        Scanner sc = new Scanner(System.in);        for (int i = 0; i < 3; i++) {            //2、鍵盤輸入用戶名和密碼            System.out.println("請輸入用戶名:");            String userName = sc.next();//提示和接受錄入的變量一定要在for循環里面            System.out.println("請輸入密碼:");            String password = sc.next();            //3、比較            if (rightName.equals(userName) && rightPassword.equals(password)) {                System.out.println("登陸成功!");                break;            } else {                if (i == 2) {                    System.out.println("賬號" + userName + "已被鎖定,請聯系管理員");                } else {                    System.out.println("用戶登錄失敗,用戶名或密碼有誤,您還剩" + (2 - i) + "次機會");                }            }        }    }}

          運行結果:

          請輸入用戶名:張三請輸入密碼:123用戶登錄失敗,用戶名或密碼有誤,您還剩2次機會請輸入用戶名:張三請輸入密碼:1234用戶登錄失敗,用戶名或密碼有誤,您還剩1次機會請輸入用戶名:張三請輸入密碼:12345賬號張三已被鎖定,請聯系管理員

          關鍵詞

          相關推薦

          精品日韩亚洲AV无码一区二区三区 | 亚洲爆乳成av人在线视菜奈实| 亚洲国产美国国产综合一区二区| 久久精品国产精品亚洲下载| 国产精品无码亚洲精品2021| 亚洲高清国产拍精品熟女| 亚洲午夜无码久久| 亚洲熟女www一区二区三区| 77777午夜亚洲| 亚洲午夜精品久久久久久app| 亚洲妇女熟BBW| 亚洲欧美精品午睡沙发| 亚洲av无码成人影院一区| 亚洲AV第一成肉网| jjzz亚洲亚洲女人| 亚洲AV蜜桃永久无码精品| 亚洲精品A在线观看| 久久久久一级精品亚洲国产成人综合AV区| 亚洲精品WWW久久久久久 | 亚洲精华国产精华精华液 | 久久精品国产亚洲av麻| 亚洲AV无码国产丝袜在线观看 | 亚洲精品国产精品| 亚洲第一网站男人都懂| 亚洲人成影院在线无码观看| 国产成人亚洲精品狼色在线| 亚洲国产精品无码一线岛国| 亚洲今日精彩视频| 亚洲性69影院在线观看| 国产精品高清视亚洲一区二区| 亚洲精品无码久久久久YW| 亚洲福利在线播放| 国产亚洲A∨片在线观看 | 亚洲丁香色婷婷综合欲色啪| 亚洲短视频在线观看| 亚洲综合无码无在线观看| 国产精品亚洲色婷婷99久久精品| 亚洲欧洲精品成人久久曰影片| 亚洲精品亚洲人成人网| 久久久久亚洲AV片无码下载蜜桃| 亚洲小视频在线播放|