Java String总结

2023-11-12


创建String

常见的构造方法:

String str1="hello";
String str2=new String("world");

在官方文档上 (https://docs.oracle.com/javase/8/docs/api/index.html) 我们可以看到 String 还支持很多其他的构造方式, 我们用到的时候去查就可以了

字符串比较

大部分编程语言中,比较两个字符串内容的相等,主要都是使用==
但是有两个语言例外:C,Java
C是因为字符串是字符数组,用 是比较字符数组的地址,所以C语言用strcmp函数来解决
**Java使用
是比较引用的地址是否相等**

public class Test1126 {
    public static void main(String[] args) {
        String str1="hello";
        String str2="hello";
        System.out.println(str1==str2);
        
    }
}

输出的结果为true
那为什么和前面说的结论不一致呢?不应该是false嘛?

Java的字符串常量会被保存到“字符串常量池”中,此时字符串常量只需要保存一份即可

所以后面创建的str直接去字符串常量池中引用的是相同的地址,所以打印true,正确的方法如下:
但实际上只有字符串字面量是共享的,而+和substring等操作得到的字符串并不共享

public class Test1126 {
    public static void main(String[] args) {
        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println(str1==str2);

    }
}

打印false

因此,如果要想比较两个字符串的内容,就需要使用**.equals**方法

public class Test1126 {
    public static void main(String[] args) {
        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println(str1.equals(str2));
    }
}

equals注意事项:

		//不介意这样写,一旦str1是null,就会抛出空指针异常
        if(str1.equals("hello")){
            
        }
        //建议使用,如果str1是null,不会抛异常,返回false
        if("hello".equals(str1)){
            
        }

字符串常量池

直接赋值

String str1 = "hello" ;
String str2 = "hello" ; 
String str3 = "hello" ; 
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // true
System.out.println(str2 == str3); // true

在这里插入图片描述
为什么现在并没有开辟新的堆内存空间呢?
String类的设计使用了共享设计模式
在JVM底层实际上会自动维护一个对象池(字符串常量池)

如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存 到这个对象池之中.
如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用
如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用

构造方法

在这里插入图片描述

我们可以使用 String 的 intern 方法来手动把 String 对象加入到字符串常量池中

String str=new String("hello").insert();

在这里插入图片描述
在这里插入图片描述

面试题:请解释String类中两种对象实例化的区别

1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2. 构造方法:会开辟两块堆内存空间,不会自动保存在对象池中,可以使用intern()方法手工入池。

理解字符串不可变

字符串是一种不可变对象,它的内容不可改变
String类的内部实现也是基于char[]来实现的,但是String类并没有提供set方法来修改内部的字符数组

为什么Java的String设计成不可变?

1.方便放到池中
2.对象的内容不可变,则对象的hashCode也不可变,方便和Hash结构搭配使用
3.对象不可变,线程安全更有保证

Java中为了方便修改,也提供了StringBuilder和StringBuffer这样的类

反射—特殊手段

Java中的”不可变对象“不是绝对的 ,只是常规手段 不能改
还有特殊手段~~

反射和“封装”是背道而驰的
1.使用反射往往可能打破封装
2.反射的代码比较复杂,容易出错
3.反射牺牲了编译器自身的一些检查校验机制,更需要程序员人工保证代码的正确性

String str="hello";
        //通过反射的方式修改“hello”的内容
        //特数手段,不是常规手段
        //1.获取到String的类对象
        //2.根据“value”这个字段名,在类对象中拿到对应的字段
        Field valueField=String.class.getDeclaredField("value");
        //让value这个private成员也能被访问到
        valueField.setAccessible(true);
        //3.根据图纸,把str这个对象给拆开,取出零件
        char[] value=(char[])valueField.get(str);
        //4.修改零件内容
        value[4]='a';
        System.out.println(str);

输出打印hella

char[]和String

		String str="hedenghui";
        //获取指定位置的字符
        System.out.println(str.charAt(0));
        //将字符串变成字符数组返回
        System.out.println(str.toCharArray());

StringBuffer和StringBuilder

面试题:请解释String、StringBuffer、StringBuilder的区别:

String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

String API

char charAt(int index)
返回给定未知的代码单元
int codePointAt(int index)
返回从给定位置开始的码点
int offsetByCodePoints(int startIndex, int cpCount)
返回从startIndex码点开始,cpCount个码点后的码点索引
int compareTo(String other)
按照字典顺序,如果字符串位于other之前,返回一个负数,如果位于other之后返回一个正数,两个字符串相等则返回0
IntStream codePoints()
将这个字符串的码点作为一个流返回,调用toArray将他们放在一个数组中
new String(int[] codePoints,int offset, int count)
用数组中从offset开始的count个码点构造一个字符串
boolean empty()
判断字符串为空
boolean blank()
如果字符串由空格组成返回true
boolean equals(Object other)
如果字符串与other相等,返回true
boolean equalsIgnore(String other)
忽略大小写字符串相等返回true
boolean startsWith(String prefix)
boolean endsWith(String suffix)
如果字符串以prefix开头或者以suffix结尾,返回true
int indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex)
返回与字符串str或码点cp匹配的第一个字串的开始位置,从原始字符串的索引0或者fromIndex开始匹配,不存在返回-1
int lastIndex(String str)
int lastIndexOf(String str, int fromIndex)
int lastindexOf(int cp)
int lastindexOf(int cp, int fromIndex)
返回与字符串str或码点cp匹配的最后一个字串的开始位置,从原始字符串的末尾或者fromIndex开始匹配
int length()
字符串代码单元的个数
int codePointCount(int startIndex, int endIndex)
返回startIndex到endIndex-1的码点个数
String replace(CharSequence oldString, CharSequence newString)
将newString替换oldString
String subString(int beginIndex)
返回一个新字符串,从beginIndex到结尾的所有代码单元
String subString(int beginIndex, int endIndex)
返回一个新字符串,从beginIndex到endIndex-1的所有代码单元
String toLowerCase()
大写改小写
String toUpperCase()
小写改大写
String trim()
返回一个新字符串,这个字符串将删除原始字符串头部和尾部小于等于U+0020的字符
String strip()
返回一个新字符串,这个字符串将删除原始字符串头部和尾部的空格,不是所有的空格
String join(CharSequence delimiter, CharSequence... elements)
返回一个新字符串,用给定的定界符连接所有元素
String repeat(int count)
返回一个字符串,将当前字符串重复count次


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java String总结 的相关文章

  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • Spring 如何在运行时获取有关“强类型集合”的泛型类型信息?

    我在 Spring 3 0 文档中阅读了以下内容 强类型集合 仅限 Java 5 在 Java 5 及更高版本中 您可以使用强类型集合 使用泛型类型 也就是说 可以声明一个 Collection 类型 使其只能包含 String 元素 例如
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I
  • JPA ManyToMany 产生的空联接表

    我有一个应用程序 其中我尝试使用 Hibernate 作为 JPA 提供程序来实现两个实体之间的多对多关系 我正在尝试的例子是一个单向的 其中一个相机可以有多个镜头 而镜头可以安装到多个相机中 以下是我的实体类 只需粘贴其中的相关部分 Ca

随机推荐

  • 服务器划分多台虚拟pc,pc服务器建立多台虚拟主机

    pc服务器建立多台虚拟主机 内容精选 换一换 虚拟IP主要用在弹性云服务器的主备切换 达到高可用性HA High Availability 的目的 当主服务器发生故障无法对外提供服务时 动态将虚拟IP切换到备服务器 继续对外提供服务 了解更
  • 使用LineProfiler找出代码的计算瓶颈

    实现同样一个功能 笔者运行需要11秒 而同窗的运行仅需要1秒不到 但是实际实现逻辑是类似的 所以需要使用性能分析工具对瓶颈进行分析 安装 命令行安装 pip install line profiler 本地下载后安装 https www l
  • IDEA 2020.1汉化问题解决办法

    IDEA2020 1 如何汉化 百度网盘链接 汉化版本 zh 201 6668 113 链接 https pan baidu com s 12Fq5QqgeRRdu6 2XIu37tA 提取码 Dl12 安装步骤 第一种 如果插件中心可以直
  • Python 的数据可视化之常用的那些图的简单示例

    参考网站 https pyecharts org zh cn intro 柱形图 折线图 饼图 词云 动态散点图 关系图 散点图 树图 1 柱形图 rom pyecharts charts import Bar from pyecharts
  • 关于毛刺

    关于毛刺 http blog csdn net guqian110 article details 17304065 目录 1 毛刺的产生原因 冒险和竞争 使用分立元件设计电路时 由于PCB在走线时 存在分布电容和电容 所以在几ns内毛刺被
  • colorui radio 样式_uni-app 修改 radio/checkbox/switch 组件样式

    我们在用 uni app 开发前端页面时 往往需要修改一些组件的默认样式 特别是颜色 那么如何修改 radio checkbox switch 单选框 复选框 开关 的样式呢 可以通过覆盖样式的方式实现 下面以单选框 radio 为例 基于
  • qt学习笔记5:资源文件的添加、模态和非模态对话框创建

    这次创建的时候勾选ui创建界面 打开 ui文件 在这里就可以通过拖拽的方式对内容进行实现 可以在 ui中进行简单界面设计一些拖拽生成需要的控件 然后在 cpp中进行代码实现 添加资源 比如要添加图片 首先将资源文件放到文件项目中 可以通过右
  • 二 Qt Remote Objects (REPC 编译器)

    REPC 概述 Replica Compiler repc 基于 API 定义文件生成QObject头文件 该文件 称为 rep 文件 使用特定的 文本 语法来描述 API 文件扩展名为 rep 是 Replica 的缩写 当这些文件被re
  • 语义分割论文-DeepLab系列

    语义分割论文 DeepLab系列 DeepLabv1 收录 ICLR 2015 International Conference on Learning Representations 代码 github Caffe Semantic im
  • CDN防御与高防服务器有什么区别

    CDN防御与高防服务器的区别 1 本质不同 高防服务器是指独立单个硬防防御50G以上的服务 而CDN防御是指通过在现有的Internet中增加一层新的网络架构 2 两者的防御方式不同 高防服务器采用单机防御或者集群防御 而CDN采用多节点分
  • VTD安装教程

    VTD安装 1 安装Nvidia显卡驱动 2 安装依赖包 3 安装license管理工具 helium 4 安装VTD软件 4 1 安装包内容 4 2 安装流程 5 配置license 运行软件 6 配置license管理工具开机自启动 1
  • 如何使用postman做接口测试

    常用的接口测试工具主要有以下几种 Postman 简单方便的接口调试工具 便于分享和协作 具有接口调试 接口集管理 环境配置 参数化 断言 批量执行 录制接口 Mock Server 接口文档 接口监控等功能 JMeter 开源接口测试及压
  • DropDownList 绑定数据

    如何使用DropDownList 控件绑定数据呢 今天我们来介绍一下比较常用的一种方法 前后台结合方式 首先 我们需要拉一个DropDownList 控件 然后 通过控件配置SqlDataSource数据源 选择合适的数据表 接着 设置Da
  • vatic视频标注工具的安装使用及错误解决

    1 安装 基于Ubuntu16 04 sudo pip install cython 0 20 wget http mit edu vondrick vatic vatic install sh 注 vatic install sh可能下载
  • 如何使用java连接MySQL数据库

    如何使用java连接MySQL数据库 编者 芊默 使用的MySQL版本 8 0 19 序言 因为数据库厂商有很多种 为了能够统一让java程序员使用更方便 sun公司编写了一套JDBC接口用于连接数据库 但是只有JDBC接口我们仍然是连接不
  • 聊一聊,这些年我用Python爬虫挣钱的那些事

    1 最典型的就是找爬虫外包活儿 这个真是体力活 最早是在国外各个freelancer网站上找适合个人做的小项目 看见了就赶紧去bid一下 把价格标得死死的 由于是挣dollar 当时换算成人民币是1 7 5左右感觉还是换算 别人标几百刀 我
  • OpenGL:gl_ClipDistance和gl_CullDiatance

    学到了OpenGL中的用户裁剪和前剪切 记录下gl ClipDistance和gl CullDiatance的用法 gl ClipDiatance 输出的裁剪距离将和图元进行线性插值 插值距离小于0 则图元部分将剪切掉 gl CullDia
  • Python数据预处理

    学 目录 1 数据表的基本信息查看 2 查看数据表的大小 3 数据格式的查看 4 查看具体的数据分布 二 缺失值处理 1 缺失值检查 2 缺失值删除 3 缺失值替换 填充 三 重复值处理 1 发现重复值 四 异常值的检测与处理 1 检测异常
  • Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    ERROR 1045 28000 Access denied for user root localhost using password YES 翻译 错误1045 28000 对用户 root 本地主机拒绝访问 使用密码 是 一般这个错
  • Java String总结

    文章目录 创建String 字符串比较 字符串常量池 直接赋值 构造方法 理解字符串不可变 反射 特殊手段 char 和String StringBuffer和StringBuilder String API 创建String 常见的构造方