首页 > 编程语言 >JAVA的字符串这篇讲清楚了

JAVA的字符串这篇讲清楚了

时间:2024-09-24 20:13:31浏览次数:1  
标签:讲清楚 返回 JAVA String int 这篇 码点 str 字符串

JAVA_String

从概念上讲,JAVA字符串就是Unicode序列。例如"Java\u2122"由5个UNICODE字符J,a,v,a和™组成。Java没有内置和字符串类型,而是试用java标准库中提供的一个预定义类,很自然地叫做了string

子串substring

String subStr = str.substring(beginIndex);

这里 beginIndex 指的是子字符串开始位置的索引(包括该位置的字符),结束位置是字符串的末尾。

String str = "hello";
System.out.println(str.substring(0,3)); //'hel'

重载版本:

String subStr = str.substring(beginIndex, endIndex);

在这个版本中,beginIndexendIndex 分别指定了子字符串开始和结束的位置。注意 endIndex 不包含在子字符串内,即子字符串包含索引为 beginIndexendIndex - 1 的字符。

image-20240924164847577

拼接

与绝大多数语言一样,Java允许使用+号连接两个字符串

String str = "ivanlee";
String str1 = "regina";
System.out.println(str+str1);//ivanleeregina

当将一个字符串与一个非字符串的值进行拼接时,后者回转换成字符串,且任何一个java对象都可以转换成字符串。

String str = "ivanlee";
int no = 7;
System.out.println(str+no);//ivanlee7

在java11当中,还提供了repeat方法

String str = "ivanlee".repeat(3);//ivanleeivanleeivanlee

字符串不可变

String类没有提供任何方法来修改字符串的某个字符。如果希望将字符串内容修改,不能直接对字符串进行修改,只能对字符串进行读取和拼接,比如'ivanlee'把最后的ee改成aa只能是

String str = "ivanlee";
String newstr = str.substring(0,5) + "aa";

这样不能修改字符串有一个很大的优点就是编译器可以让字符串共享。

想象各个字符串存放在一个公共存储池里,字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串和复制的字符串共享相同的字符。

字符串相等

equals()equalsIgnoreCase()函数分别比较区分大小写的字符串以及忽视大小写的字符串。

String str = "ivanlee";
String newstr = "iVanlee";
System.out.println(newstr.equals(str)); //false
System.out.println(str.equalsIgnoreCase(newstr)); //true

不要使用运算符检测两个字符串,这个运算符只能够确定两个字符串是否存放在同一个位置。所以相同的字符串副本可能会放在不同的位置上。如果虚拟机总是共享相等的字符串,则可以使用运算符检测字符串是否相等。但实际上只有字符串字面量会共享。而+或者substring等操作得到的字符串并不共享。因此,千万不要使用==来测试是否相等。

String s1 = "abc"; // 字符串字面量,s1 指向字符串池中的 "abc"
String s2 = "abc"; // s2 也指向字符串池中的 "abc",s1 == s2 返回 true

String s3 = new String("abc"); // 创建了一个新的对象,不在字符串池中
String s4 = "abc";             // s4 指向字符串池中的 "abc"
// s3 和 s4 内容相同,但不是同一个对象,因此 s3 == s4 返回 false

String s5 = "ab" + "c";       // 字符串连接,结果仍然会在字符串池中查找或创建 "abc"
String s6 = "abc";            // s6 指向字符串池中的 "abc"
// s5 和 s6 都指向字符串池中的 "abc",因此 s5 == s6 返回 true

String s7 = "abc".substring(0, 3); // 使用 substring 方法,结果不在字符串池中
String s8 = "abc";                  // s8 指向字符串池中的 "abc"

image-20240924175224957

在 Java 8 及之前的版本中,substring 方法返回的字符串不会自动放入字符串池中,因此 s7s8 尽管内容相同,但它们不是同一个对象。因此 s7 == s8 将返回 false。从 Java 9 开始,JEP 282(String Concatenation Optimization)引入了优化,使得某些字符串操作(包括 substring 方法)的结果在某些情况下可能会被放入字符串池中,但这取决于 JVM 的实现细节。

码点和代码单元

在Java中,“码点”(code point)和“代码单元”(code unit)是与Unicode字符编码相关的术语。它们之间的关系主要体现在Java如何处理Unicode字符上。
码点指的是Unicode标准中定义的唯一标识符,用于唯一地标识一个字符。Unicode标准覆盖了所有的字符集,从ASCII到各种语言的文字符号,甚至到数学符号和表情符号。每一个字符都有一个唯一的码点,这个码点是一个整数值。Unicode码点范围从U+0000到U+10FFFF,共包含了超过110万个可能的字符。
代码单元是指在特定编码方案中表示一个字符所需的位数。在Java中,字符是以16位(两个字节)的Unicode代码单元存储的,这是因为Java的 char 类型是16位的无符号整数。

Java中的字符表示:
基本多文种平面(BMP)字符:这些字符的码点范围是从U+0000到U+FFFF,可以直接用一个 char 类型表示。Java中的大多数字符都属于这一类。
代理项(Surrogate Pairs):对于超出BMP范围的字符(即码点大于U+FFFF),需要使用一对代理项来表示。这对代理项由一个高位代理项(high surrogate)和一个低位代理项(low surrogate)组成,每个代理项也是一个 char 类型。
高位代理项的码点范围是U+D800到U+DBFF。
低位代理项的码点范围是U+DC00到U+DFFF。

// BMP字符可以直接用一个char表示
char c1 = 'A'; // 码点 U+0041
System.out.println(c1);

// 非BMP字符需要两个char表示(代理项)
String emoji = "

标签:讲清楚,返回,JAVA,String,int,这篇,码点,str,字符串
From: https://www.cnblogs.com/ivanlee717/p/18429920

相关文章

  • java封装题目2
    2.以面向对象的思想,编写自定义类描述IT从业者。设定属性包括:姓名,年龄,技术方向,工作年限,工作单位和职务;方法包括:工作要求:1)设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问2)限定IT从业人员必须年满15岁,无效信息需提示,并设置默认年龄为15。3)限定“技......
  • java_day4_数组、方法
    一、数组一维数组数组:是一块连续固定大小的内存空间,有着索引的概念定义数组的语句格式:数据类型[]数组名;【推荐】数据类型数组名[];如果只是定义一个数组的话,没有给初始化值,相当于一个变量没有值,是不能够直接使用的如何对一个数组进行初始化?1、动态初始化......
  • 2024.9.24- java开学测
    1、定义student类,其中包括五个私有变量(stunumber,name,age,sex,score)。各成员的含义如下:变量stunumber为字符串类型String,用于存储学生的学号(有8位数字组成)。变量name为字符串类型String,用于存储学生的姓名。变量age为int类型,用于存储学生的年龄。变量sex为boolean类型,用于存储学......
  • java基础篇之反射(简单详细,快速入门)
    @[TOC]希望本文能帮助你增加对反射的理解反射的简单叙述及相关性质反射的源头——Class类反射的主要应用反射的简单叙述及相关性质能够分析类能力的程序为反射,反射机制的功能极其强大,下面我们就来简单举个例子publicclassStudent{privateStringname;......
  • Java学习笔记(上)——动力节点老杜(某站2000万播放)
    此文章是本人大一学习java时记的笔记,原视频在https://www.bilibili.com/video/BV1Rx411876f,配套服用更佳!一.JAVA开发环境的搭建1.常用的Dos命令1.1win+r打开Dos命令窗口1.2什么是Dos命令在最初的计算机中没有图形界面,也就是说通过Dos命令窗口可以完全完成文件的新建、......
  • JavaEE——多线程
    接着上篇博客我们已经学习了进程的相关概念,了解到进程里面的相关重要属性,那么这篇博客呢我们要学习一个新的知识点——线程!一、引入进程的目的首先引入进程这个概念,是为了解决“并发编程”这样的问题。因为CPU再往小了做,比较困难了,这是因为CPU进入了多核心的时代,要想进一......
  • JavaEE——多线程Thread 类及常见方法
    目录 一、Thread(Stringname)二、是否后台线程isDeamon()三、是否存活isAlive()四、run()方法和start()方法的区别五、中断线程法一:法二:六、线程等待join()七、线程休眠sleep()一、Thread(Stringname)定义:这个东西是给线程(thread对象)起一个名字。起一个......
  • Java:排序算法
    Java中有很多种排序算法,每种算法都有其特点,适用于不同的场景。下面列举一些常见的排序算法,并简要介绍其特点:冒泡排序(BubbleSort)原理:通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,这意......
  • Java BeanUtils使用介绍
    ‌JavaBeanUtils是一个广泛使用的Java工具类,提供了一系列方法来简化JavaBean对象之间的属性复制和操作。‌使用JavaBeanUtils可以方便地实现对象之间的属性复制、属性设置和获取、类型转换等功能。以下是使用JavaBeanUtils的基本步骤和注意事项:1.添加依赖‌:首先,你需要在项目......
  • java解析xml
    参考资料水平有限,欢迎交流千问ai阿伟的反射知识学习泛型知识学习软件设计模式(java版)程细柱目标xml<?xmlversion="1.0"encoding="UTF-8"?><conf><farm>SGFarm</farm><student><name>李四</name>&......