当前位置: 首页 > article >正文

【Java SE】String

Java字符串就是Unicode字符序列(一个字符占两个字节,可表示世界上任何文字和标志)。Java中没有内置的字符串类型,但Java标准库中提供了一个预定义类String,用于保存字符串。每个用双引号括起来的字符串都是String类的一个实例。

String e = "Hello";

String 类是final类,这意味着它不能被其他类继承。String 有属性private final char value[],用于存放字符串内容。另外,String类实现了Serializable接口,这使得字符串可以被序列化并在网络间传输;同时,它也实现了Comparable接口,使得字符串对象可以进行比较。

一、字符串创建

Java中,创建String对象的方式有两种:

  • 直接赋值
  • 调用构造器

(1)直接赋值

Java中,字符串字面量(直接使用双引号的字符串)会存储在字符串常量池中。当创建一个新的字符串字面量时,Java虚拟机会首先检查常量池中是否已有相同内容的字符串。如果存在,则返回该字符串的引用;如果不存在,则会在常量池中创建一个新的字符串实例。

String s = "abc";

"abc"为例子:Java虚拟机首先从常量池查看是否有相同内容的字符串,若有则直接指向(返回引用),若无则重新创建并返回引用。s最终指向的是常量池中的内存地址。

(2)调用构造器

Java中,String类较常用的构造方法包括:

String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a, int startIndex, int count);

// 实例
String s = new String("abc");

new String("abc")为例子:在使用构造器创建的过程中,Java虚拟机首先在中为对象创建内存空间,该对象中维护value属性,指向常量池的"abc"空间,若常量池没有"abc"则重新创建,若有则value直接指向对应位置。s最终指向的空间是堆中的内存地址。

二、字符串子串

Java中,使用String类的substring方法可以从较大的主串中提取出子串。例如:

String s = "hello";
String t = s.substring(0, 3); // "hel"

substring方法的第一个参数是子串的开始索引位置,第二个参数是子串结束索引的下一个位置(不想提取的第一个位置),即左闭右开。

三、字符串拼接

与绝大多数程序设计语言类似,Java允许使用+号拼接两个字符串:

String s1 = "hello ";
String s2 = "world!";
String s3 = s1 + s2;

注意细节

(1)当将一个字符串与一个非字符串拼接时,后者会转成字符串。

(2)在Java 11中,提供了repeat方法:"Hi".repeat(2); //"HiHi"

四、字符串判等

Java中使用equals方法判断两个字符串是否相等,相等返回true,否则返回false。另外,若以不区分大小写的方式进行判等,可以使用equalsIngoreCase方法。

s.equals(t);

注意细节

(1)不要使用==判等,这个运算符只能确定两个字符串是否存在同一位置。

(2)可以用s.compareTo(t) == 0判断字符串是否相等。

五、空串&Null

空串""是一个Java对象,有串长度(0)和内容(内容为空)。

// 判断是否为空串
if (s.length == 0)
if (s.equals(""))

String变量可以存放一个特殊值,名为null,表示目前没有任何对象与该变量关联。

// 判断是否为null
if (s == null)

六、字符串特性

不可变性String对象的value属性是final类型,这意味着一旦字符串对象被创建,它内部存储的字符内容value就不能再改变。String类也没有提供任何方法来修改字符串中的某个字符,通常的做法是通过子串结合拼接操作实现修改。如果需要对字符串进行任何操作,比如拼接或替换,都会生成一个新的String对象,而原来的字符串对象保持不变。另外,需要注意的是:虽然value指向的内容无法修改,但可以修改String对象的引用,即可以让一个变量指向另一个字符串对象。

/**
 * 下面的语句在常量池创建了两个字符串对象:"hello"和"hi"。
 * 具体流程:
 * 1)JVM检查并在常量池中创建"hello"对象,将"hello"引用返回给s;
 * 2)JVM检查并在常量池中创建"hi"对象,将"hi"引用返回给s。
 */
String s = "hello";
s = "hi"
/**
 * 下面的语句在常量池创建了一个字符串对象:"hellohi"
 * 原因是:编译器进行了优化,优化后的语句为:String s = "hellohi";
 */
String s = "hello" + "hi";
/**
 * 下面的语句在常量池创建了三个对象,在堆创建了一个对象,底层实现:
 * 1)在常量池创建 a 对象
 * 2)在常量池创建 b 对象
 * 3)创建一个StringBuilder sb = StringBuilder()
 * 4)执行sb.append("hello");
 * 5)执行sb.append("hi");
 * 6)String c = sb.toString()
 * 7)c指向堆中对象,这个对象的value指向常量池中的"hellohi"
 */

String a = "hello";
String b = "hi";
String c = a + b;

由于String类是保存字符串常量的,每次更新都需要重新开辟空间,效率较低,因此,java设计者还提供了StringBuilderStringBuffer来增强String的功能,并提高效率。

七、码点与代码单元

Java字符串实际上是一个char值序列(即字符串属性value)。char数据类型是采用UTF-16编码表示Unicode码点码点指编码表中的某个字符对应的代码值)的一个代码单元。常用的Unicode字符可以用一个代码单元表示,而辅助字符则需要一对代码单元表示。

即一个char表示一个代码单元,常用字符可以用一个char表示,辅助字符需要两个char表示。

String s = "𝕆"; // 辅助字符
int n = s.length(); // 2
int cpCount = s.codePointCount(0, s.length()); // 1

在上面的代码中,length方法返回采用UTF-16编码表示的字符串所需的代码单元个数。若想要获得实际长度,即码点个数(字符个数),可以调用codePointCount


http://www.kler.cn/a/378973.html

相关文章:

  • 运维工具之docker入门
  • HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
  • 【AI】【提高认知】深度学习与反向传播:理解AI的基础
  • Go 语言之搭建通用 Web 项目开发脚手架
  • 【java】java的基本程序设计结构07-字符串
  • 本地部署bert-base-chinese模型交互式问答,gradio
  • Nginx 使用指南
  • CentOS 7 软件/程序安装示例
  • 下载pytorch报错:没有发现某个版本
  • PostgreSQL11 | PostgreSQL用户管理(上篇)
  • 构建工具-webpack和vite笔记
  • 无桥图腾柱PFC原理及MATLAB仿真
  • M3U8直播,视频切片 AES加密,多码流自适应
  • npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
  • 中国平安蝉联福布斯“2024全球最佳雇主“,位居中国金融业第二
  • stm32cubeIde 使用笔记
  • php内置服务停止shell小工具,用来停止指定的端口的php内置服务进程
  • 2、课程大纲、学习方法
  • 【MySQL】 运维篇—备份与恢复:使用MySQL Replication进行数据冗余与高可用性
  • Solana链上的Pump狙击机器人与跟单机器人的工作原理及盈利模式
  • 校园网连接上却无法访问解决方案
  • 力扣题目解析--整数反转
  • Docker部署SQLServer教程(配置持久化)
  • PCD可视化(C++)
  • 一个git相关的cve:CVE-2024-32002
  • Android Studio插件版本与Gradle 版本对应关系