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总结 的相关文章

  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 服务器划分多台虚拟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 常见的构造方