亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java字符串String相關(guān)類(lèi)常用方法詳解

 更新時(shí)間:2025年02月19日 08:31:29   作者:NiKo_sx  
這篇文章主要介紹了Java中的字符串?dāng)?shù)據(jù)類(lèi)型,包括字符串的創(chuàng)建、拼接、比較和常用方法,還介紹了StringBuilder和StringJoiner類(lèi)的定義和使用,以及它們?cè)趦?nèi)存中的管理方式,需要的朋友可以參考下

 一、String

1.Java中的數(shù)據(jù)類(lèi)型

在Java中數(shù)據(jù)類(lèi)型被分為基本數(shù)據(jù)類(lèi)型引用數(shù)據(jù)類(lèi)型

  • 基本數(shù)據(jù)類(lèi)型:數(shù)值存儲(chǔ)在自己的空間而不是堆內(nèi)存或其他的空間中,如int、float、double、boolean等
  • 引用數(shù)據(jù)類(lèi)型:數(shù)值存儲(chǔ)在其他的空間,本身的空間存儲(chǔ)的是地址值,如數(shù)組、創(chuàng)建的對(duì)象、字符串等。

在本節(jié)中,我們將介紹的字符串就是一種引用數(shù)據(jù)類(lèi)型。

2.字符串概述

a.在Java中所有字符串的定義都在java.lang.String中,在使用String定義字符串時(shí)應(yīng)先導(dǎo)包。       

//導(dǎo)包
java.lang.String;

//定義
String s = "abcdef";

b.字符串參與的所有運(yùn)算都屬于字符串的拼接操作。由于字符串的內(nèi)容自創(chuàng)建之后就不能改變,所以每次執(zhí)行字符串的拼接操作時(shí)都會(huì)在內(nèi)存中重新申請(qǐng)空間儲(chǔ)存拼接后的字符串。

String s1 = "abc";
String s2 = "123";
System.out.println(s1+s2);//執(zhí)行結(jié)果:abc123

在執(zhí)行上面的代碼時(shí)一共產(chǎn)生了三個(gè)字符串,分別是s1("abc")、s2("123")以及拼接后新產(chǎn)生的字符串"abc123"。       

String s1 = "abc";
s1="三連+關(guān)注";
System.out.println(s1);//執(zhí)行結(jié)果:三連+關(guān)注

c.字符串的值被創(chuàng)建后是無(wú)法改變的,因此在執(zhí)行上面的代碼時(shí)并沒(méi)有改變"abc"里原本的內(nèi)容,而是創(chuàng)建了一個(gè)新的字符串"三連+關(guān)注"并重新賦值給了s1。

d.對(duì)于沒(méi)有變量參與的字符串拼接操作是不同于有變量參與的拼接操作的。

  • 如果沒(méi)有變量參與,系統(tǒng)會(huì)檢查串池,如果串池中有該字符串,直接復(fù)用,沒(méi)有再開(kāi)辟新的內(nèi)存空間。
  • 如果有變量參與,每一行代碼都會(huì)創(chuàng)建新的字符串。

3.字符串構(gòu)造方法

a.直接定義

String s1 = "abc";
System.out.println(s1);//執(zhí)行結(jié)果:abc

b.通過(guò)new關(guān)鍵字獲取一個(gè)空字符串

String s1 = new String();
System.out.println("!"+s1+"!");//執(zhí)行結(jié)果:!!

c.傳遞一個(gè)字符串,根據(jù)傳遞的字符串再構(gòu)造一個(gè)新的字符串

String s1 = new String("abc");
System.out.println(s1);//執(zhí)行結(jié)果:abc

d.傳遞一個(gè)字符數(shù)組,根據(jù)字符數(shù)組的內(nèi)容構(gòu)造新的字符串

char[] ch = {'a','b','c'};
String s1 = new String(ch);
System.out.println(s1);//執(zhí)行結(jié)果:abc

e.傳遞一個(gè)字節(jié)數(shù)組,根據(jù)字節(jié)數(shù)組的內(nèi)容構(gòu)造新的字符串

byte[] by = {97,98,'c'};
String s1 = new String(by);
System.out.println(s1);//執(zhí)行結(jié)果:abc

在字節(jié)數(shù)組中,97和98不再代表整形,而是ASCII碼表中碼值為97、98的符號(hào),即a、b。

4.字符串構(gòu)造內(nèi)存原理

在Java中內(nèi)存主要被分為棧、堆、方法區(qū)三部分(如下圖)。

  • 棧:主要存儲(chǔ)方法,方法開(kāi)始執(zhí)行時(shí)進(jìn)棧,結(jié)束執(zhí)時(shí)出棧。
  • 堆:存儲(chǔ)對(duì)象或數(shù)組,使用new關(guān)鍵字時(shí)是在堆內(nèi)存中開(kāi)辟了空間。從鍵盤(pán)獲取的字符串也是存儲(chǔ)在堆中。
  • 方法區(qū):存儲(chǔ)可執(zhí)行的class文件。

在堆內(nèi)存中,有一塊被稱作串池(String Table)的內(nèi)存空間,它是專(zhuān)門(mén)用來(lái)存儲(chǔ)字符串的內(nèi)存空間。

如果選擇直接賦值(參考2.a)的形式構(gòu)造字符串,系統(tǒng)會(huì)在串池中檢查,如果兩個(gè)字符串的內(nèi)容完全相同,則直接服用已經(jīng)構(gòu)造好的字符串,而不會(huì)重新開(kāi)辟空間存儲(chǔ),減少了空間浪費(fèi)。

String s2 = "abc";
String s1 = "abc";//s1和s2中地址值是一樣的

而如果使用new關(guān)鍵字構(gòu)造,系統(tǒng)不會(huì)檢查串池并直接在堆空間中開(kāi)辟內(nèi)存。

String s2 = new String("abc");
String s1 = new String("abc");//使用new關(guān)鍵字構(gòu)造的字符串地址不同

5.字符串比較

a.如果直接用==符號(hào)比較,可能并不能反饋正確的結(jié)果。由String定義的字符串是一種引用數(shù)據(jù)類(lèi)型,在String創(chuàng)建的對(duì)象本身的空間中存儲(chǔ)的是地址值,而不是數(shù)據(jù),==符號(hào)比較的是對(duì)象本身內(nèi)存中的數(shù)據(jù),因此可能會(huì)輸出錯(cuò)誤的結(jié)果。

Scanner sc = new Scanner(System.in);//在鍵盤(pán)上輸入"abc",輸入的數(shù)據(jù)是存儲(chǔ)在堆內(nèi)存中的
String s1 = sc.next();
String s2 = "abc";
System.out.println(s1==s2);//執(zhí)行結(jié)果:false

b.比較兩個(gè)字符串內(nèi)容是否相同可以使用String類(lèi)中的equals方法。

Scanner sc = new Scanner(System.in);//輸入"abc"
String s1 = sc.next();
String s2 = "abc";
boolean res = s1.equals(s2);//equals的返回值是boolean類(lèi)型
System.out.println(res);//執(zhí)行結(jié)果:true

c.比較兩個(gè)字符串內(nèi)容是否相同且忽略大小寫(xiě),使用String類(lèi)中的equalsIgnoreCase方法。此處的忽略大小寫(xiě)只針對(duì)于英文字母而不針對(duì)于中文(如"1"和"一")。

Scanner sc = new Scanner(System.in);//輸入"abc"
String s1 = sc.next();
String s2 = "Abc";
boolean res = s1.equalsIgnoreCase(s2);
System.out.println(res);//執(zhí)行結(jié)果:true

6.字符串常見(jiàn)方法

  • public char charAt(int index);
  • 根據(jù)索引(索引下標(biāo)從0開(kāi)始)返回字符。
String s1 = "abcde";
char ch = s1.charAt(0);
System.out.println(ch);//執(zhí)行結(jié)果:a
  • public int length();
  • 返回字符串的長(zhǎng)度。
String s1 = "abcde";
int len = s1.length();
System.out.println(len);//執(zhí)行結(jié)果:5
  • String substring(int begin,int end);
  • 從字符串中截取并返回下標(biāo)從begin開(kāi)始到end-1(不包含end)結(jié)束的字符串。
String s1 = "abcde";
String subs1 = s1.substring(0,2);//截取下標(biāo)從0~1的字符串
System.out.println(subs1);//執(zhí)行結(jié)果:ab

二、StringBuilder 

1.定義

StringBuilder可以看作一個(gè)容器,不同于String,用StringBuilder創(chuàng)建的對(duì)象內(nèi)容是可變的,它可以提高字符串的操作效率。

StringBuilder sb = new StringBuilder();

括號(hào)中可傳參可不傳參。

2.常用方法

  •  toString();
  • 將StringBuilder類(lèi)型的對(duì)象轉(zhuǎn)換為String類(lèi)型。
StringBuilder sb = new StringBuilder("abc");
String s1 = sb.toString();
System.out.println(s1);//執(zhí)行結(jié)果:abc

需要注意的是,通過(guò)StringBuilder創(chuàng)建的對(duì)象無(wú)法直接使用String中的方法,需要經(jīng)過(guò)toString轉(zhuǎn)換才能使用String中的方法。

  • append();
  • 向StringBuilder創(chuàng)建的對(duì)象中添加數(shù)據(jù)。
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.toString());//執(zhí)行結(jié)果:abc
sb.append("123");
System.out.println(sb.toString());//執(zhí)行結(jié)果:abc123
  • reverse();
  • 反轉(zhuǎn)對(duì)象中的數(shù)據(jù)。
StringBuilder sb = new StringBuilder("abc123");
System.out.println(sb.toString());//執(zhí)行結(jié)果:abc123
sb.reverse();
System.out.println(sb.toString());//執(zhí)行結(jié)果:321cba
  • length();
  • 返回容器中字符串的長(zhǎng)度。
StringBuilder sb = new StringBuilder("abc123");
int len = sb.length();
System.out.println(len);//執(zhí)行結(jié)果:6
  • capacity();
  • 返回目前容器的容量。一個(gè)空的StringBuilder對(duì)象默認(rèn)容量時(shí)16.
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//執(zhí)行結(jié)果:16

 3.StringBuilder內(nèi)存分析

在創(chuàng)建StringBuilder的對(duì)象時(shí),在內(nèi)存中默認(rèn)開(kāi)辟容量為16的字節(jié)數(shù)組,如果載入的數(shù)據(jù)超容,則系統(tǒng)會(huì)自動(dòng) 為StringBuilder擴(kuò)容,新容量=老容量*2+2=34;如果新數(shù)據(jù)超容且超出自動(dòng)擴(kuò)容時(shí)的容量,那么新的容量以實(shí)際為準(zhǔn)。

需要注意的是,capacity指的是容器能容納數(shù)據(jù)的空間大小,而length可以理解為存儲(chǔ)在容器中的有效數(shù)據(jù)的長(zhǎng)度。

  • 初始容量:16
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//執(zhí)行結(jié)果:16
  • 數(shù)據(jù)內(nèi)存沒(méi)有超出默認(rèn)擴(kuò)容的內(nèi)存空間(34)
sb.append("abcdefghijklmnopq");
System.out.println(sb.length());//執(zhí)行結(jié)果:17
System.out.println(sb.capacity());//執(zhí)行結(jié)果:34
  • 數(shù)據(jù)內(nèi)存超出了默認(rèn)擴(kuò)容的內(nèi)存空間
sb.append("abcdefghijklmnopqrstuvwxyz123456789");
System.out.println(sb.length());//執(zhí)行結(jié)果:35
System.out.println(sb.capacity());//執(zhí)行結(jié)果:35

三、StringJoiner

1.定義

StringJoiner和StringBuilder一樣。都可以看作一種容器,創(chuàng)建之后里面的內(nèi)容是可變的。StringJoiner的代碼編寫(xiě)十分簡(jiǎn)潔,可以快速有效的完成程序員指定的字符串拼接操作。StringJoiner是不支持空參構(gòu)造的。

  • StringJoiner sj = new StringJoiner("---");
  • 創(chuàng)建一個(gè)對(duì)象,指定拼接時(shí)的間隔符號(hào)("---")。
StringJoiner sj = new StringJoiner("---");
  • StringJoiner sj = new StringJoiner("---", "[", "]");
  • 創(chuàng)建一個(gè)對(duì)象,指定拼接時(shí)的間隔符號(hào)("---")、開(kāi)始符號(hào)("[")、結(jié)束符號(hào)("]")。
StringJoiner sj = new StringJoiner("---","[","]");

2.常用方法

  • public StringJoiner add(添加的內(nèi)容);
  • 添加數(shù)據(jù),并返回?cái)?shù)據(jù)本身
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
System.out.println(sj);//執(zhí)行結(jié)果:[aaa---bbb---ccc]
  • public int length();
  • 返回長(zhǎng)度。這里的length同時(shí)包含間隔符號(hào)、開(kāi)始符號(hào)、結(jié)束符號(hào)在內(nèi)。
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
int len = sj.length();
System.out.println(len);//執(zhí)行結(jié)果:17
  • public String toString();
  • 返回一個(gè)字符串。

總結(jié) 

到此這篇關(guān)于Java字符串String相關(guān)類(lèi)的文章就介紹到這了,更多相關(guān)Java字符串String相關(guān)類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用SpringMVC的消息轉(zhuǎn)換器設(shè)置日期格式

    如何使用SpringMVC的消息轉(zhuǎn)換器設(shè)置日期格式

    這篇文章主要介紹了如何使用SpringMVC的消息轉(zhuǎn)換器設(shè)置日期格式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 關(guān)于SpringBoot在有Ajax時(shí)候不跳轉(zhuǎn)的問(wèn)題解決

    關(guān)于SpringBoot在有Ajax時(shí)候不跳轉(zhuǎn)的問(wèn)題解決

    最近在使用Ajax來(lái)發(fā)送一些數(shù)據(jù)給后臺(tái)一個(gè)Controller,但是遇到些問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot在有Ajax時(shí)候不跳轉(zhuǎn)問(wèn)題的解決辦法,需要的朋友可以參考下
    2022-05-05
  • Spring MVC整合Shiro權(quán)限控制的方法

    Spring MVC整合Shiro權(quán)限控制的方法

    這篇文章主要介紹了Spring MVC整合Shiro權(quán)限控制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 在SpringBoot中集成H2數(shù)據(jù)庫(kù)的完整指南

    在SpringBoot中集成H2數(shù)據(jù)庫(kù)的完整指南

    Spring Boot是一個(gè)簡(jiǎn)化企業(yè)級(jí)Java應(yīng)用程序開(kāi)發(fā)的強(qiáng)大框架,H2數(shù)據(jù)庫(kù)是一個(gè)輕量級(jí)的、開(kāi)源的SQL數(shù)據(jù)庫(kù),非常適合用于開(kāi)發(fā)和測(cè)試,本文將指導(dǎo)您如何在Spring Boot應(yīng)用程序中集成H2數(shù)據(jù)庫(kù),并探索一些高級(jí)配置選項(xiàng),需要的朋友可以參考下
    2024-10-10
  • Java實(shí)現(xiàn)求子數(shù)組和的最大值算法示例

    Java實(shí)現(xiàn)求子數(shù)組和的最大值算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)求子數(shù)組和的最大值算法,涉及Java數(shù)組遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • java的Map集合中按value值進(jìn)行排序輸出的實(shí)例代碼

    java的Map集合中按value值進(jìn)行排序輸出的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇java的Map集合中按value值進(jìn)行排序輸出的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • Java等待喚醒機(jī)制原理實(shí)例解析

    Java等待喚醒機(jī)制原理實(shí)例解析

    這篇文章主要介紹了Java等待喚醒機(jī)制原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Spring Boot啟動(dòng)過(guò)程(五)之Springboot內(nèi)嵌Tomcat對(duì)象的start教程詳解

    Spring Boot啟動(dòng)過(guò)程(五)之Springboot內(nèi)嵌Tomcat對(duì)象的start教程詳解

    這篇文章主要介紹了Spring Boot啟動(dòng)過(guò)程(五)之Springboot內(nèi)嵌Tomcat對(duì)象的start的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • java用applet畫(huà)圖用到的方法(涉及雙緩沖)

    java用applet畫(huà)圖用到的方法(涉及雙緩沖)

    這篇文章主要介紹了java用applet畫(huà)圖用到的方法(涉及雙緩沖),然后作為基礎(chǔ)的基礎(chǔ)的基礎(chǔ),必須學(xué)習(xí)如何讓鍵盤(pán)與界面進(jìn)行交互。下面就是對(duì)一個(gè)基礎(chǔ)得不能再基礎(chǔ)的applet程序,需要的朋友可以參考下
    2019-06-06
  • Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案

    Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案

    Spring?Cloud?Alibaba?致力于提供微服務(wù)開(kāi)發(fā)的一站式解決方案,此項(xiàng)目包含開(kāi)發(fā)分布式應(yīng)用微服務(wù)的必需組件,這篇文章主要介紹了Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡,需要的朋友可以參考下
    2024-05-05

最新評(píng)論