Java --- String类

news2024/11/16 21:28:40

(一)String 

     java.lang.String 类代表字符串。Java 程序中所有的字符串文字(例如 "hello" )都可以看作是实现此类的实例。
  •  字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。

  •  字符串 String 类型本身是 final 声明的,意味着 String不能继承 。

  •  String 对象的字符内容是存储在一个字符数组 value[]中的。"abc" 等效于 char[] data={'h','e','l','l','o'}

   jdk8 中的 String 源码:

public final class String implements java . io . Serializable , Comparable < String >,
CharSequence {
/** The value is used for character storage . */
private final char value []; //String 对象的字符内容是存储在此
数组中
/** Cache the hash code for the string */
private int hash ; // Default to 0
private 意味着外面无法直接获取字符数组,而且 String 没有提供 value 的
get 和 set 方法。
final 意味着字符数组的引用不可改变,而且 String 也没有提供方法来修改
value 数组某个元素值
因此字符串的字符数组内容也不可变的,即 String 代表着不可变的字符序
列。即,一旦对字符串进行修改,就会产生新对象。
  只JDK9有,底层使用 byte[]数组。
public final class String implements java . io . Serializable , Comparable < String >, CharSequence {
@Stable
private final byte [] value ;
}
  Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持 (toString()方法)。

(二)String 的内存结构

概述

       因为字符串对象设计为不可变,那么所以字符串有常量池来保存很多常量对象。在JDK6 中,字符串常量池在方法区。JDK7 开始,就移到堆空间,直到目前 JDK17版本。
       举例内存结构分配:

(三)String 的常用 API 

 1、构造器

①public String() :初始化新创建的 String 对象,以使其表示空字符序列。
②String(String original): 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;简言之,新创建的字符串是该参数字符串的副本。
③public String(char[] value) :通过当前参数中的字符数组来构造新的String。
④public String(char[] value,int offset, int count) :通过字符数组的一部分来构造新的 String。
⑤public String(byte[] bytes) :通过使用平台的 默认字符集 解码当前参数中的字节数组来构造新的 String。
⑥public String(byte[] bytes,String charsetName) :通过使用指定的字符集解码当前参数中的字节数组来构造新的 String。
//字面量定义方式:字符串常量对象
String str = "hello";
//构造器定义方式:无参构造
String str1 = new String();
//构造器定义方式:创建"hello"字符串常量的副本
String str2 = new String("hello");
//构造器定义方式:通过字符数组构造
char chars[] = {'a', 'b', 'c','d','e'}; 
String str3 = new String(chars);
String str4 = new String(chars,0,3);
//构造器定义方式:通过字节数组构造
byte bytes[] = {97, 98, 99 }; 
String str5 = new String(bytes);
String str6 = new String(bytes,"GBK");
public static void main(String[] args) {
char[] data = {'h','e','l','l','o','j','a','v','a'};
String s1 = String.copyValueOf(data);
String s2 = String.copyValueOf(data,0,5);
int num = 123456;
String s3 = String.valueOf(num);
 System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}

2.String 的常用方法

      String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、 提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。

(1)boolean isEmpty():字符串是否为空

(2)int length():返回字符串的长度

(3)String concat(xx):拼接,运行效果等价于+

(4)boolean equals(Object obj):比较字符串是否相等,区分大小写

(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写

(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小

(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写

(8)String toLowerCase():将字符串中大写字母转为小写

(9)String toUpperCase():将字符串中小写字母转为大写

(10)String trim():去掉字符串前后空白符

(11)public String intern():结果在常量池中共享

(12)boolean contains(xx):是否包含xx

(13)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1

(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1

(15)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。

(16)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

(17)char charAt(index):返回[index]位置的字符

(18)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回

(19)String(char[] value):返回指定数组中表示该字符序列的 String。

(20)String(char[] value, int offset, int count):返回指定数组中表示该字符序列的 String。

(21)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String

(22)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String

(23)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String

(24)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String

(25)byte[] getBytes():编码,把字符串变为字节数组,按照平台默认的字符编码方式进行编码

byte[] getBytes(字符编码方式):按照指定的编码方式进行编码

(26)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码

new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码

(27)boolean startsWith(xx):是否以xx开头

(28)boolean endsWith(xx):是否以xx结尾

(29)boolean matchs(正则表达式):判断当前字符串是否匹配某个正则表达式。

(30)String replace(被替换字符 , 替换后的字符):不支持正则

(31)String replaceFirst(正则,value):替换第一个匹配部分,当前字符串中第一个匹配正则的部分会被替换为value

(32)String repalceAll(正则, value):替换所有匹配部分,当前字符串中所有匹配正则的部分会被替换为value

(33)String[] split(正则):按照某种规则进行拆分

3、StringBuffer和StringBuilder常用API

为什么有StringBuffer和StringBuilder?

因为 String 对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK 又在 java.lang 包提供了可变字符序列 StringBuffer 和 StringBuilder 类型。

StringBuffer 与 StringBuilder 的理解

    java.lang.StringBuffer 代表可变的字符序列,JDK1.0 中声明,可以对字符串内容进行增删,此时不会产生新的对象。比如:

 

 

 简言之,StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能

的方法也一样。
 
区分 String、StringBuffer、StringBuilder
StringStringBufferStringBuilder
String:不可变的字符序列; 底层使用 char[]数组存储(JDK8.0 中)
StringBuffer:可变的字符序列;线程安全(方法有 synchronized 修饰),效
率低;底层使用 char[]数组存储 (JDK8.0 中)
可变的字符序列:jdk1.5 引入,线程不安全的,效率高;底层使用 char[]数组存储(JDK8.0 中)

3.常用的API

常用的API,StringBuilder、StringBuffer的API是完全一致的

(1)StringBuffer append(xx):拼接,追加

(2)StringBuffer insert(int index, xx):在[index]位置插入xx

(3)StringBuffer delete(int start, int end):删除[start,end)之间字符

StringBuffer deleteCharAt(int index):删除[index]位置字符

(4)void setCharAt(int index, xx):替换[index]位置字符

(5)StringBuffer reverse():反转

(6)void setLength(int newLength) :设置当前字符序列长度为newLength

(7)StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str

(8)int indexOf(String str):在当前字符序列中查询str的第一次出现下标

int indexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的第一次出现下标

int lastIndexOf(String str):在当前字符序列中查询str的最后一次出现下标

int lastIndexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的最后一次出现下标

(9)String substring(int start):截取当前字符序列[start,最后]

(10)String substring(int start, int end):截取当前字符序列[start,end)

(11)String toString():返回此序列中数据的字符串表示形式

(四)String 与其他结构间的转换

⑴ 字符串 --> 基本数据类型、包装类:

    Integer 包装类的 public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型。类似地,使用 java.lang 包中的 Byte、Short、Long、Float、Double 类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。
⑵基本数据类型、包装类 --> 字符串:
    
    调用 String 类的 public String valueOf(int n)可将 int 型转换为字符串相应的 valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换。
⑶字符数组 --> 字符串:
String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。
⑷字符串 --> 字符数组: 
    ① public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
    ② public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索
引范围内的字符串存放到数组中的方法。
⑸字符串 --> 字节数组:(编码)
   ① public byte[] getBytes() :使用平台的默认字符集将此 String 编码为 byte 序列,并
将结果存储到一个新的 byte 数组中。
   ② public byte[] getBytes(String charsetName) :使用指定的字符集将此 String 编码到
byte 序列,并将结果存储到新的 byte 数组。
⑹字节数组 --> 字符串:(解码)
        ① String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的String。
        ② String(byte[],int offset,int length) :用指定的字节数组的一部分,即从数组起始位置 offset 开始取 length 个字节构造一个字符串对象。
        ③ String(byte[], String charsetName ) 或 new String(byte[], int, int,String charsetName ):解码,按照指定的编码方式进行解码。
public void test01() throws Exception {
 String str = "中国";
 System.out.println(str.getBytes("ISO8859-1").length);
 // ISO8859-1 把所有的字符都当做一个 byte 处理,处理不了多个字节
 System.out.println(str.getBytes("GBK").length);// 4 每一个中文都是
对应 2 个字节
 System.out.println(str.getBytes("UTF-8").length);// 6 常规的中文都
是 3 个字
 /*
 * 不乱码:(1)保证编码与解码的字符集名称一样(2)不缺字节
 */
 System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859
-1"));// 乱码
 System.out.println(new String(str.getBytes("GBK"), "GBK"));// 中
国
 System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));//
中国
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度卷积图神经网络(Deep Convolutional Graph Neural Network,DCGNN)的基本概念与应用

目录 一、引言 1.1 神经网络的发展历程 1.2 图神经网络的出现 二、深度卷积图神经网络的基本概念 2.1 图的表示 2.2 图卷积神经网络 2.3 深度卷积图神经网络 三、深度卷积图神经网络的应用 3.1 图像分类 3.2 图像分割 3.3 图像生成 四、深度卷积图神经网络的优缺点 …

【数据结构与算法】图的概述(内含源码)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️数据结构与算法】 学习名言&#xff1a;天子重英豪&#xff0c;文章教儿曹。万般皆下品&#xff0c;惟有读书高——《神童诗劝学》 系列文章目录 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章…

分布式一致性Hash算法原理及实现

文章目录 一致性Hash原理提高容错性和和扩展性一致性Hash实现思路代码 一致性Hash原理 简单来说&#xff0c;一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环&#xff0c; 如假设某哈希函数 H 的值空间为 0 ~ 2^32-1&#xff08;即哈希值是一个32位无符号整形&#xff09;…

搜狗百科怎么创建?搜狗百科创建指南(经验分享)

搜狗百科是一个允许用户创建、编辑和维护百科全书的网站。它是搜狗搜索旗下的一个产品&#xff0c;为用户提供了一个共享知识的平台。创建一个搜狗百科词条并非难事&#xff0c;但需要遵守一些注意事项。 话不多说。小媒同学将介绍搜狗百科词条的创建过程和注意事项。 一、创建…

java基础入门-04-【集合学生管理系统】

Java基础入门-04-【集合&学生管理系统】 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比&#xff1a;11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案…

【观察】甲骨文以“双引擎”驱动,加速中国企业拥抱决策智能

毫无疑问&#xff0c;当前中国整体经济形态正在从传统经济向数字经济转型&#xff0c;千行百业也在加速数字化转型&#xff0c;特别是随着企业数据的沉淀越来越庞大&#xff0c;对数据平台以及智能决策等新技术的需求也越来越旺盛。 国家发布的《“十四五”数字经济发展规划》中…

视频里的音乐怎么转换成mp3格式?

视频里的音乐怎么转换成mp3格式&#xff1f;视频里的音乐转换为mp3的原因有很多&#xff0c;主要是因为mp3格式是一种音频格式&#xff0c;文件大小较小&#xff0c;更易于存储和传输。相比之下&#xff0c;视频格式则是一种视频文件格式&#xff0c;虽然包含音频&#xff0c;但…

Q-in-Q 和 MAC-in-MAC

例题引入&#xff1a; 1. 城域以太网在各个用户以太网之间建立多点第二层连接&#xff0c;IEEE802.1ad定义运营商网桥协议提供的基本技术是在以太网帧中插入&#xff08;26&#xff09;字段&#xff0c;这种技术被称为&#xff08;27&#xff09;技术。 (26)A.运营商VLAN标记…

Hive知识点的回顾

一、Hive的序列化和反序列化 Hive读取文件机制&#xff1a;读取文件中的每一行 > 反序列化 > 通过分隔符进行切割&#xff0c;返回数据表中的每一行对象。 Hive写文件机制&#xff1a;把数据表中的每一行Row对象 > 调用LazySimpleSerde类中的序列化方法 > 把Row对象…

基于AT89C51单片机的电子秒表设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87759735?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 设计一个电子钟,实现对时、分、秒的显示的控制,电路采用24小时计时方式。另一个功能是秒表功能…

JVM内存模型和结构介绍

什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一个虚构出来的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等。 为什么需要JVM&#xff1f; Java语言使用Java虚拟机屏蔽了与具体平台相关的信息&…

执行网格中有特定数量节点的传感器网络部署(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络是通过大量分布的传感器节点作为终端来协同感知和自主地监测外部世界,以多跳、自组织或协作的方式进行通信和…

Java 基础进阶篇(十二)—— Arrays 与 Collections 工具类

文章目录 一、Arrays工具类1.1 Arrays 类常用方法1.2 对于 Comparator 比较器的支持1.3 Arrays 的综合应用1.3.1 应用一&#xff1a;数组的降序排序1.3.2 应用二&#xff1a;根据学生年龄进行排序 二、Collections工具类2.1 Collections 类常用方法2.2 Collections 排序相关 AP…

哈希表相关知识总结

一、哈希表的定义 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置…

C++相比于C语言增加的8个特性(详解)

C相比于C语言增加的8个特性&#xff08;详解&#xff09; 文章目录 C相比于C语言增加的8个特性&#xff08;详解&#xff09;一、命名空间二、C输入和输出三、缺省参数四、函数重载五、引用六、内联函数七、auto关键字八、指针空值nullptr总结 一、命名空间 c的命名空间是为了…

【刷题之路】LeetCode 21. 合并两个有序链表

【刷题之路】LeetCode 21. 合并两个有序链表 1、题目描述二、解题1、方法1——直接合并1.1、思路分析1.2、代码实现 2、方法2——递归2.1、思路分析2.2、代码实现 1、题目描述 原题连接&#xff1a; 21. 合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 …

Camtasia Studio2023Mac最新电脑版屏幕录像软件

Camtasia Studio2023提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等。它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动的轨迹&#xff0c;解说声音等等&#xff0c;另外&#xff0c;它还具有及时播放和编辑压缩…

数字化转型导师坚鹏:美的集团数字化转型案例研究

美的集团数字化转型案例研究 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不清楚企业数字化转型能否成功&#xff1f; 不知道其它企业数字化转型的实际做法&#xff1f; 不知道其它企业的数字化转型战略是如何演变的&#xff1f; 课程特色&#xff1a; 用…

汽车架构-工作流程 以及相关协议解读

全车架构&#xff08;E/E&#xff09; 车载测试阶段&#xff1a; 台架测试 HIL测试&#xff08;硬件在环测试&#xff09; ADAS智能辅助驾驶测试 OTA测试&#xff08;远程升级测试&#xff09; 测试工具&#xff1a; Can协议工具&#xff1a;Canoe Pcan Zcanpro 辅助工具…

【Stable Diffusion】ControlNet基本教程(三)

接上篇【Stable Diffusion】ControlNet基本教程&#xff08;二&#xff09;&#xff0c;本篇再介绍两个ControlNet常见的基本用法&#xff0c;更多用法欢迎关注博主&#xff0c;博主还会更新更多有趣的内容。 3.3更换物体皮肤 有时&#xff0c;我们不想改变物体的轮廓&#xff…