Java基礎——String類(一)

一、String 類代表字符串

Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現。

字符串是常量;它們的值在創建之后不能更改。字符串緩沖區支持可變的字符串。因為 String 對象是不可變的,所以可以共享。例如:

??1 String str = "abc";?

等效于:

??1 char data[] = {'a', 'b', 'c'}; 2 String str = new String(data);?

下面給出了一些如何使用字符串的更多示例:

1 System.out.println("abc");
2      String cde = "cde";
3      System.out.println("abc" + cde);
4      String c = "abc".substring(2,3);
5      String d = cde.substring(1, 2);

String 類包括的方法可用于檢查序列的單個字符、比較字符串、搜索字符串、提取子字符串、創建字符串副本并將所有字符全部轉換為大寫或小寫。大小寫映射基于Character類指定的 Unicode 標準版。

Java 語言提供對字符串串聯符號("+")以及將其他對象轉換為字符串的特殊支持。字符串串聯是通過 StringBuilder(或 StringBuffer)類及其 append 方法實現的。字符串轉換是通過 toString 方法實現的,該方法由 Object 類定義,并可被 Java 中的所有類繼承。有關字符串串聯和轉換的更多信息,請參閱 Gosling、Joy 和 Steele 合著的 The Java Language Specification。

除非另行說明,否則將 null 參數傳遞給此類中的構造方法或方法將拋出空指針異常。

String 表示一個 UTF-16 格式的字符串,其中的增補字符由代理項對表示。索引值是指 char 代碼單元,因此增補字符在 String 中占用兩個位置。

String 類提供處理 Unicode 代碼點(即字符)和 Unicode 代碼單元(即 char 值)的方法。

二、字符串的創建方式

?1 String s="abc";?

表示,先在棧上創建一個引用s ,它會先去常量池中看有沒有 "abc" 這個常量,如果有,則把s指向常量池中的 "abc"。

如果沒有,則在常量池中創建 abc,

?1 String s=new String("abc");

相當于 String obj="abc";? String s=new String(obj) ; 經過這個操作以后,內存中有兩份數據: 常量池中一份,堆上一份。由于有了 new 這個操作,不管常量池中原來有沒有 "abc" ,它都會在堆上創建一份

三、字符串的比較

例1:字符串常量池的使用

1 String s0 = "abc"; 
2 String s1 = "abc"; 
3 System.out.println(s0==s1); //true 
4 //s0  和  s1 都指向了常量池中的同一個 "abc"

例2:String中 == 與equals的區別

1 String s0 =new String ("abc");   //new 這個操作,將在堆上產生對象,s0指向了堆
2 String s1 =new String ("abc"); 
3 System.out.println(s0==s1); //false  s0 和 s1 指向的是堆上不同de的對象System.out.println(s0.equals(s1)); //true 因為String類重寫了equals方法,比的是實體的內容 

例3:編譯期確定

1 String s0="helloworld";
2 String s1="helloworld";
3 String s2="hello" + "world";   //編譯的時候,直接就編譯成了 helloworld
4 System.out.println( s0==s1 );   //true
5 System.out.println( s0==s2 );   //true

例4:編譯期無法確定

1 String s0="helloworld";
2 String s1=new String("helloworld");
3 String s2="hello" + new String("world");
4 System.out.println( s0==s1 ); //false  一個指向常量池,一個指向堆System.out.println( s0==s2 ); //false
5 System.out.println( s1==s2 ); //false

例5:編譯期優化

 1 String s0 = "a1";
 2 String s1 = "a" + 1;
 3 System.out.println((s0 == s1)); //true
 4                   
 5 String s2 = "atrue";
 6 String s3= "a" + "true";
 7 System.out.println((s2 == s3))  //true
 8                   
 9 String s4 = "a3.4";
10 String s5 = "a" + 3.4;
11 System.out.println((s4 == s5));  //true

例6 編譯期無法確定

1 String s0 = "ab";
2 String s1 = "b";
3 String s2 = "a" + s1;   //s1不是常量,編譯期無法確定
4 System.out.println((s0 == s2)); //false

例7:編譯期確定

1 String s0 = "ab";
2 final String s1 = "b";     //加上final 就變成了常量
3 String s2 = "a" + s1;  //對于兩個常量相加,編譯器能確定它的值
4 System.out.println((s0 == s2));     //true

四、String對象內存分析

//例一

String a = "abc"; ①  

String b = "abc"; ② 

分析:

①代碼執行后在常量池(constant pool)中創建了一個值為abc的String對象,

②執行時,因為常量池中存在 "abc" 所以就不再創建新的String對象了。

//例二

String?? c?? =?? new?? String("xyz");①  

String?? d?? =?? new?? String("xyz");②  

分析:

①Class被加載時,"xyz"被作為常量讀入,在常量池(constant pool)里創建了一個共享的值為"xyz"的String對象;

然后當調用到new String("xyz")的時候,會在堆(heap)里創建這個new?? String("xyz")對象;

②由于常量池(constant pool)中存在"xyz"所以不再創建"xyz",然后創建新的new String("xyz")。

//例三

String?? s1?? =?? new?? String("xyz");???? //創建二個對象(常量池和堆中),一個引用   

String?? s2?? =?? new?? String("xyz");???? //創建一個對象(堆中),并且以后每執行一次創建一個對象,一個引用   

String?? s3?? =?? "abc";???? //創建一個對象(常量池中),一個引用??   

String?? s4?? =?? "abc";???? //不創建對象(共享上次常量池中的數據),只是創建一個新的引用s4)

//例四

 1 public static void main(String[] args) {    
 2 //以下兩條語句創建了1個對象。"鳳山"存儲在字符串常量池中    
 3 String str1 = "鳳山";    
 4 String str2 = "鳳山";     
 5 System.out.println(str1==str2);//true     
 6 //以下兩條語句創建了3個對象。"天峨",存儲在字符串常量池中,兩個new String()對象存儲在堆內存中     
 7 String str3 = new String("天峨");     
 8 String str4 = new String("天峨");     
 9 System.out.println(str3==str4);//false      
10 //以下兩條語句創建了1個對象。9是存儲在棧內存中   //這里所說的一個對象,是指的9 , i 和 j 則是對9的引用  
11 int i = 9;     
12 int j = 9;     
13 System.out.println(i==j);//true      
14 //由于沒有了裝箱,以下兩條語句創建了2個對象。兩個1對象存儲在堆內存中    
15 Integer l1 = new Integer(1);    注意這里是沒有裝箱操作的
16 Integer k1 = new Integer(1);    
17 System.out.println(l1==k1);//false  
18  //以下兩條語句創建了1個對象。1對象存儲在棧內存中。自動裝箱時對于值從127之間的值,使用一個實例。    
19 Integer l = 20;//裝箱     
20 Integer k = 20;//裝箱     
21 System.out.println(l==k);//true    
22 Integer i1 = 256;     //以下兩條語句創建了2個對象。i1,i2變量存儲在棧內存中,兩個256對象存儲在堆內存中   
23 Integer i2 = 256;     
24 System.out.println(i1==i2);//false  
25 }

五、String 類常見操作

字符串的常見操作,大致有以下幾類??? 獲取,判斷,轉換,替換和切割

1) 獲取類操作???

String str="春花秋月何時了,往事知多少?小樓昨夜又東風,故國不堪回首月明中";

1 這個字符串到底有多長

2 第4個字是什么? 即根據索引獲取字符???

3 第一個逗號是第幾個字符 即根據字符取索引( 取字符(或字符串)的位置)

4 最后一個“月”字的索引

5 是否含有“月明”? 這個字符序列

6 是不是以"春花"開頭,是否以“月明中”結尾

7 這個串是否為空

8 是否和另一個串相等

String str="春花秋月何時了,往事知多少?小樓昨夜又東風,故國不堪回首月明中";

System.out.println("長度:" + str.length());? //31

System.out.println("第四個字是"+str.charAt(3)); //月

System.out.println("第一個逗號的位置是"+str.indexOf(',')); //7

System.out.println("第一個逗號的位置是"+str.indexOf(",")); //7

System.out.println("第一個往事的位置是"+str.indexOf("往事")); //8

System.out.println("最后一個月字的索引"+str.lastIndexOf("月")); //28

System.out.println("是否含有月明"+str.contains("月明"));? //true

System.out.println("是否以春花開頭"+str.startsWith("春花"));? //true

System.out.println("是否以月明中結尾"+str.endsWith("月明中"));? //true

System.out.println("是否為空"+str.isEmpty());? //false

System.out.println(str.equals("另一個字符串")); //false

String s1="abc";

String s2="aBC";

System.out.println(s1.equalsIgnoreCase(s2));? //true? equalsIgnoreCase 比較的時候忽略大小寫。

轉載于:https://www.cnblogs.com/1693977889zz/p/7056846.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java jol原理_Java對象布局(JOL)實現過程解析

java對象布局JOL(java object layout),描述對象在堆內存的布局。如下圖:1.markword 固定長度8byte,描述對象的identityhashcode,分代年齡,鎖信息等(https://www.jb51.net/article/183984.htm);2.klasspoint 固定長度4b…

數據庫維護相關

(1)SQL Server 查看數據表使用空間 exec sp_spaceused 表名 (2)SQL Server 數據表使用空間排序 exec sp_MSForeachTable precommandN create table ##( table_name sysname, records int, save_space Nvarchar(10), use_space var…

Redux初學者指南

by Safeer Hayat通過更安全的哈亞特 Understanding Redux as a beginner can be quite confusing. Redux has an abundance of new terms and concepts which are often pretty unintuitive. This guide presents a very simplified example of a Redux implementation. I wil…

leetcode 86. 分隔鏈表(鏈表)

給你一個鏈表和一個特定值 x ,請你對鏈表進行分隔,使得所有小于 x 的節點都出現在大于或等于 x 的節點之前。 你應當保留兩個分區中每個節點的初始相對位置。 示例: 輸入:head 1->4->3->2->5->2, x 3 輸出&am…

極光推送

推送原理 IOS 通過APNs推送服務。 每個設備只要保持一個與APNs的常鏈接,服務器將要推送的消息發送給APNs,APNs再將消息轉發到響應的手機,手機內置的程序再進行分發,到響應的APP,就能很好的實現推送功能 Andriod 雖然谷…

電腦通過手機上網的方法

(適用于包月CMWAP無限流量服務,只收CMWAP費用)移動手機(GPRS) CMWAP無限流量包月服務,可以通過手機作調制解調器,將手機和電腦連接用代理服務器上網. 看到了很多帖子,整理了一下,把它貼出來供大家參考。一 該方法對手機要求:1 手…

java入門學習_Java入門學習進階知識點

Java入門學習進階知識點入門階段,主要是培養Java語言的編程思想。了解Java語言的語法,書寫規范等,掌握Eclipse、MyEclipse等開發工具,編寫Java代碼的能力。學完這個階段你應該可進行小型應用程序開發并且可以對數據庫進行基本的增…

如何不認識自己

重點 (Top highlight)By Angela Xiao Wu, assistant professor at New York University紐約大學助理教授Angela Xiao Wu This blog post comes out of a paper by Angela Xiao Wu and Harsh Taneja that offers a new take on social sciences’ ongoing embrace of platform …

JDBC 數據庫連接操作——實習第三天

今天開始了比較重量級的學習了,之前都是對于Java基礎的學習和回顧。繼續上篇的話題,《誰動了我的奶酪》,奉獻一句我覺得比較有哲理的話:“學會自嘲了,而當人們學會自嘲,能夠嘲笑自己的愚蠢和所做的錯事時,他就在開始改變了。他甚至…

webassembly_WebAssembly的設計

webassemblyby Patrick Ferris帕特里克費里斯(Patrick Ferris) WebAssembly的設計 (The Design of WebAssembly) I love the web. It is a modern-day superpower for the dissemination of information and empowerment of the individual. Of course, it has its downsides …

leetcode 509. 斐波那契數(dfs)

斐波那契數,通常用 F(n) 表示,形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1 給你 n &a…

java基本特性_Java面試總結之Java基礎

無論是工作多年的高級開發人員還是剛入職場的新人,在換工作面試的過程中,Java基礎是必不可少的面試題之一。能不能順利通過面試,拿到自己理想的offer,在準備面試的過程中,Java基礎也是很關鍵的。對于工作多年的開發人員…

plotly python_使用Plotly for Python時的基本思路

plotly pythonI recently worked with Plotly for data visualization on predicted outputs coming from a Machine Learning Model.我最近與Plotly合作,對來自機器學習模型的預測輸出進行數據可視化。 The documentation I referred to : https://plotly.com/pyt…

轉發:畢業前的贈言

1、找一份真正感興趣的工作。 “一個人如果有兩個愛好,并且把其中一個變成自己的工作,那會是一件非常幸福的事情。那么另外一個愛好用來做什么?打發時間啦。所以,第二個興趣非常重要,在你無聊寂寞的時候越發顯得它…

Python模塊之hashlib:提供hash算法

算法介紹 Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。 什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示&#xf…

css flexbox模型_完整CSS課程-包括flexbox和CSS網格

css flexbox模型Learn CSS in this complete 83-part course for beginners. Cascading Style Sheets (CSS) tell the browser how to display the text and other content that you write in HTML.在這本由83部分組成的完整課程中,為初學者學習CSS。 級聯樣式表(CS…

leetcode 830. 較大分組的位置

在一個由小寫字母構成的字符串 s 中,包含由一些連續的相同字符所構成的分組。 例如,在字符串 s “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 這樣的一些分組。 分組可以用區間 [start, end] 表示,其中…

php 匹配圖片路徑_php正則匹配圖片路徑原理與方法

下面我來給大家介紹在php正則匹配圖片路徑原理與實現方法,有需要了解的朋友可進入參考參考。提取src里面的圖片地址還不足夠,因為不能保證那個地址一定是絕對地址,完全的地址,如果那是相對的呢?如果地址諸如&#xff1…

java項目經驗行業_行業研究以及如何炫耀您的項目

java項目經驗行業蘋果 | GOOGLE | 現貨 | 其他 (APPLE | GOOGLE | SPOTIFY | OTHERS) Editor’s note: The Towards Data Science podcast’s “Climbing the Data Science Ladder” series is hosted by Jeremie Harris. Jeremie helps run a data science mentorship startup…

MongoDB教程-使用Node.js從頭開始CRUD應用

In this MongoDB Tutorial from NoobCoder, you will learn how to use MongoDB to create a complete Todo CRUD Application. This project uses MongoDB, Node.js, Express.js, jQuery, Bootstrap, and the Fetch API.在NoobCoder的MongoDB教程中,您將學習如何使…