一、String內(nèi)存模型
1、直接賦值創(chuàng)建string對象內(nèi)存原理:
StringTable(串池):字符串常量池,用來存儲字符串,只能是在直接賦值中使用才會存在串池當(dāng)中(JDK7前串池是在方法區(qū)里面,StringTable(串池)在JDK7版本開始從方法區(qū)中挪到了堆內(nèi)存,但是運行機制沒有發(fā)生變化)
eg:
(資料圖片)
首先mian方法進棧,創(chuàng)建變量s1,查看串池里面有沒有abc,此時串池內(nèi)沒有,就創(chuàng)建了一個新的abc,然后將地址值賦值給s1;
創(chuàng)建變量s2,等號右邊直接賦值,查看串池里面有沒有abc,此時,串池里面已經(jīng)存在abc,就不會創(chuàng)建abc,而是去復(fù)用已經(jīng)存在的abc。
2、小結(jié):
當(dāng)使用雙引號直接賦值時,系統(tǒng)會檢查該字符串在串池中是否存在,如果不存在,創(chuàng)建新的,如果存在,就會復(fù)用
3、特點:代碼簡單,節(jié)約內(nèi)存
4、、new關(guān)鍵字創(chuàng)建string對象內(nèi)存原理
這里以字符數(shù)據(jù)為例:
首先main方法進棧,執(zhí)行第一行代碼,此時在堆內(nèi)存當(dāng)中產(chǎn)生一個char類型的數(shù)組,地址值為0011;再把0011賦值給變量chs;創(chuàng)建s1對象,在堆內(nèi)存創(chuàng)建一個字符數(shù)組內(nèi)容的小空間,地址值為002,再把002賦值給s1;創(chuàng)建s2對象,在堆內(nèi)存創(chuàng)建一個字符數(shù)組內(nèi)容的小空間,地址值為003,再把003賦值給s2。
注意:每new一次就會開辟一個新的空間,而且地址值都不相同,所以,這種方式創(chuàng)建的字符串不會復(fù)用
特點:會浪費內(nèi)存空間
二、Java常用方法(比較)
1、==號比的是什么?
(1)基本數(shù)據(jù)類型:
基本數(shù)據(jù)類型比較的是數(shù)據(jù)值
(2)引用數(shù)據(jù)類型:
引用數(shù)據(jù)類型比較的是地址值
2、字符串比較
3、直接賦值:
創(chuàng)建變量s1,查看串池里面有沒有abc,此時串池內(nèi)沒有,就創(chuàng)建了一個新的abc,然后將地址值賦值給s1;
創(chuàng)建變量s2,等號右邊直接賦值,查看串池里面有沒有abc,此時,串池里面已經(jīng)存在abc,就不會創(chuàng)建abc,而是去復(fù)用已經(jīng)存在的abc。此時s1和s2指向的是同一個地址值,所以是True
new關(guān)鍵字賦值:
s1記錄的是堆里面的地址值,s2記錄的是串池中(也是在堆里面)的地址值
4、用字符串比較內(nèi)容:
字符串比較:
(1)boolean equals方法(要比較的字符串) :完全一樣的結(jié)果才是true,否則為false
(2)boole equakslgnoreCase(要比較的字符串) :忽略大小寫的比較
package com.itheima03.String;public class StringDemo02 { public static void main(String[] args) { //1、創(chuàng)建兩個字符串對象 String s1 = new String("abc"); String s2 = "ABc"; //2、==號比較 //引用數(shù)據(jù)類型:比的是地址值 //基本數(shù)據(jù)類型:比的是數(shù)據(jù)值 System.out.println(s1==s2);//false s1記錄的是堆里面的地址值,s2記錄的是串池里面的地址值 //3、比較字符串對象中的內(nèi)容是否相等 boolean result = s1.equals(s2); System.out.println(result);//false //4、比較字符串對象中的內(nèi)容是否相等,忽略大小寫(忽略大小寫,只能是英文狀態(tài)下的a和A,漢字的大小寫無法使用) boolean result1 = s1.equalsIgnoreCase(s2); System.out.println(result1);//true }}
運行結(jié)果:
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(); //代碼中再定義一個字符串a(chǎn)bc String s2 = "abc"; //用==后比較S1和S2是否一樣 System.out.println(s1==s2); }}
運行結(jié)果:
請輸入一個字符串a(chǎn)bcfalse
5、### 注意:
字符串錄入的字符串是new出來的,s1與s2的地址值不同,s1是new出來的,是在堆內(nèi)存里面,而s2直接賦值也是在堆內(nèi)存里面,但是是在堆內(nèi)存的串池里面,所以是false
結(jié)論:以后只要想比較字符串的內(nèi)容,就必須使用string里面的方法(equals和equakslgnoreCase)
練習(xí):用戶登錄
需求:
已知正確的用戶名和密碼,請用程序?qū)崿F(xiàn)模擬用戶登錄,總共給三次機會,登錄之后,給出相應(yīng)的提示
package com.itheima03.String;import java.util.Scanner;/*練習(xí):用戶登錄需求:已知正確的用戶名和密碼,請用程序?qū)崿F(xiàn)模擬用戶登錄,總共給三次機會,登錄之后,給出相應(yīng)的提示 */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循環(huán)里面 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 + "已被鎖定,請聯(lián)系管理員"); } else { System.out.println("用戶登錄失敗,用戶名或密碼有誤,您還剩" + (2 - i) + "次機會"); } } } }}
運行結(jié)果:
請輸入用戶名:張三請輸入密碼:123用戶登錄失敗,用戶名或密碼有誤,您還剩2次機會請輸入用戶名:張三請輸入密碼:1234用戶登錄失敗,用戶名或密碼有誤,您還剩1次機會請輸入用戶名:張三請輸入密碼:12345賬號張三已被鎖定,請聯(lián)系管理員
相關(guān)推薦
- (2023-07-09)String內(nèi)存模型和Java常用方法
- (2023-07-09)遵義“新征程 同心行”推介會在北京舉行
- (2023-07-09)電的部首查字典怎么查(電查什么部首)
- (2023-07-09)畫質(zhì)究竟誰好(索尼NEX 5N/松下G5高感對比區(qū)別)
- (2023-07-09)全國首個國際航運服務(wù)平臺在上海臨港上線 16個航運項目簽約
- (2023-07-09)萬興科技:旗下多個產(chǎn)品已應(yīng)用AIGC技術(shù)并多端覆蓋
- (2023-07-09)有限責(zé)任公司合伙糾紛找律師打官司如何收費
- (2023-07-09)工銀聚和一年定開混合即日起至7月20日開放申贖
- (2023-07-09)男職工能請陪產(chǎn)假多少天休
- (2023-07-09)最后突擊(關(guān)于最后突擊介紹)
- (2023-07-09)今天繼續(xù)!高溫+雷電雙預(yù)警,青島的雨要下到……
- (2023-07-09)米體:比塞克將在周二抵達米蘭,接受國米體檢并且完成簽約
- (2023-07-09)培訓(xùn)三天就能拿證上崗 “高考志愿規(guī)劃師”靠譜嗎?
- (2023-07-09)陜西省高陵縣發(fā)布高溫橙色預(yù)警
- (2023-07-09)魯能與申花的比賽還沒開打,就接二連三等來喜訊,新援火線首秀
- (2023-07-09)她曾被周星馳雪藏,出演戲份遭全刪,多虧陳思誠才得以翻身?
- (2023-07-09)驚呆了 550多家機構(gòu)關(guān)注 人形機器人最牛股爆熱!這些優(yōu)質(zhì)高成長股被盯上
- (2023-07-09)健身器材室外(關(guān)于健身器材室外的基本詳情介紹)
- (2023-07-09)烏方不再糾結(jié)入北約(無知無畏工作室:LV廣告片引烏方不滿)
- (2023-07-09)南京微豆文化傳媒有限公司 新浪微豆有什么用
- (2023-07-09)公募基金費率改革怎么做?證監(jiān)會工作安排來了
- (2023-07-09)翻譯成中文在線(翻譯成中文)
- (2023-07-09)LG手機售后亂象高仿電池價格竟高于原裝兩倍之多
- (2023-07-09)紅黃藍之歌歌詞(紅的黃的藍的綠的歌詞)
- (2023-07-09)BigHit計劃兩年推三團,BTS入伍對公司影響大,僅靠TXT頂不住
- (2023-07-09)死有余辜小說(死有余辜)
- (2023-07-09)奧萊康橋·明月灣|城市級配套 占據(jù)未來優(yōu)渥生活圈
- (2023-07-09)接近傳感器英文(接近傳感器)
- (2023-07-09)intel 酷睿i5 12400f(Intel酷睿i5 3230M怎么樣)
- (2023-07-09)其實,拖鞋也可以穿得很時髦!
每日推薦
- ETF聯(lián)接基金是什么意思?ETF基金和ETF聯(lián)
- 貨幣基金的收益高嗎?貨幣基金一般年收益
- 基金賣出了怎么還有收益顯示?基金已經(jīng)贖
- 投資的基金買了幾天可以賣掉?基金入手多
- 基金終于回本了該不該贖回?基金終于回本
- 二月出境復(fù)飛航線超40條 節(jié)后部分機票價
- 重大事項變更!網(wǎng)易寶獲批增加注冊資本至
- 信達證券上市首日漲幅44%
- 總投資約486億元 北京今年首批50個重大
- 新年北京首月二手住宅網(wǎng)簽量再探底 價格
- 股價大漲 博云新材股東高創(chuàng)投擬趁機減持
- 2019華人歌曲音樂盛典在澳門舉行
- 喜迎十九大?歡度中秋節(jié)—傳統(tǒng)文化進社區(qū)
- 突發(fā)!吳敏霞夫婦挑婚戒被曝光!兩百萬鉆
- 《鐘山說事》 熱點聚焦:胡鵬飛的最美鄉(xiāng)
- 湖南御福天益生物公司被指涉嫌傳銷進行非
- 大同市城投公司劉建婷遭群眾舉報
- 魯能集團 “一帶一路”履責(zé)行動暨“海南
圖片新聞
48小時頻道點擊排行
-
0
1String內(nèi)存模型和Java常用方法 -
0
2畫質(zhì)究竟誰好(索尼NEX 5N/松下G5高 -
0
3有限責(zé)任公司合伙糾紛找律師打官司如 -
0
4最后突擊(關(guān)于最后突擊介紹) -
0
5培訓(xùn)三天就能拿證上崗 “高考志愿規(guī) -
0
6她曾被周星馳雪藏,出演戲份遭全刪, -
0
7烏方不再糾結(jié)入北約(無知無畏工作室 -
0
8翻譯成中文在線(翻譯成中文) -
0
9BigHit計劃兩年推三團,BTS入伍對公 -
0
10接近傳感器英文(接近傳感器) -
0
11太難了!武漢三鎮(zhèn)靠點球破門,一群后 -
0
12咖啡心智大戰(zhàn):抖音卷9.9,小紅書拼 -
0
13從“AI Home”到“DI live” 上海 -
0
14夏天到內(nèi)蒙古,這100個網(wǎng)紅打卡地不 -
0
15【劍心吟】游戲攻略(內(nèi)附最新禮包碼 -
0
16韓國市民團體質(zhì)疑國際原子能機構(gòu)涉日 -
0
17華亭安口鎮(zhèn):抱團發(fā)展“菜園子”拓寬 -
0
18狼瘡抗凝物質(zhì)檢測是查什么(狼瘡抗凝 -
0
19“商湯日日新”大模型體系升級 五大 -
0
20重磅!公募基金費率改革啟動!一文看