String类详解(一)_string str2 = "hello world";-程序员宅基地

技术标签: JavaSE  java  

1. 常见的构造String的方式

  1. 直接构造
    String str = “Hello World”;
  2. 将字符串封装成字符串对象
    String str = new String(“Hello World”);
  3. 将字符数组的数据封装成字符串对象
    char[ ] array = {‘a’, ‘b’, ‘c’};
    String str = new String(array);

2. String类的不可变性

String 类是引用类型,是不可变的。

举例:
String str1 = “Hello”;
String str2 = str1;
但是如果“修改”str1 的值str2 不会随之变化。

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

在这里插入图片描述
没有“修改”str1 之前,内存中是:
在这里插入图片描述
“修改”之后变成:
在这里插入图片描述
所以严格来说,str1 = “World” 并不是“修改”了字符串而是将str1 指向了一个新的对象,所以String 是不可变的。

3. 修改字符串的方法

3.1 借助原字符串,创建新的字符串

String str = “hello”;
str = “H” + str.subString(1);
System.out.println(str);
结果为:Hello

substring是String类的常见方法,可以看这篇https://blog.csdn.net/AlinaQ05/article/details/124376643

3.2 使用StringBuilder类修改字符

StringBuilder stringBuilder = new StringBuilder(“hello”);
stringBuilder.delete(0,1);
stringBuilder.insert(0,“H”);
System.out.println(stringBuilder);
结果为:Hello

StringBuilder类详细内容见这篇
https://blog.csdn.net/AlinaQ05/article/details/124380068

3.3使用“反射”破坏封装,访问类内部的 private 成员

4.字符串常量池

字符串常量池是在JVM底层上会自动维护的一个对象池。

使用场景:在采用了方式1(直接构造String的方式)将String 类的对象实例化,就将该实例化对象也就是创建的字符串自动保存在字符串常量池中。如果下次继续使用这种方式构造String,此时池中有该字符串,就直接引用,也就是直接返回该字符串的地址。如果没有就开辟新的字符串对象然后将其保存在字符串常量池中方便下次使用。

4.1 直接赋值实例化

举例:
String str1 = “Hello World”;
String str2 = “Hello World”;
String str3 = “Hello World”;
str1 创建的Hello World 字符串加入到字符串常量池中,str2 和str 3 都是引用字符常量池中的字符串。

字符串常量池的优点:效率高,不用每一次都开辟新的空间,将字符串保存一次后,之后都可以直接从池中拿出来使用。

4.2 采用构造方法实例化

String str = new String(“Hello”);

缺点:

  1. 使用构造方法会开辟两块堆内存空间,(new 会开辟一个堆空间,"Hello"会开辟一个堆空间,但是"Hello"是一个匿名对象,只用一次就不再使用,这样就会造成垃圾空间。
  2. 字符串共享, 同一个字符会被存储多次。

解决方法:手动将String对象加入字符串常量池

    String str1 = new String("Hello").intern();
    String str2 = "Hello";
    System.out.println(str1==str2);

5.字符与字符串

5.1 将字符数组中的内容变为字符串

public class StringDemo1 {
    //字符数组转字符串
    public static String arrString(char[] data) {
        String str = new String(data);
        return str;
    }
    public static void main(String[] args) {
        char[] data = new char[]{'h', 'e', 'l', 'l', 'o'};
        System.out.println(arrString(data));
            }
}

在这里插入图片描述

5.2 将字符数组部分变为字符串

public class StringDemo1 {
   //将部分字符数组转字符串
    public static String arrString2(char[] data) {
        String str = new String(data, 1, 4);
        return str;
    }
    public static void main(String[] args) {
        char[] data = new char[]{'h', 'e', 'l', 'l', 'o'};
        System.out.println(arrString2(data));
            }
}

在这里插入图片描述

5.3 取得指定索引位置的字符

在这里插入图片描述
结果:r

5.4 将字符串变为字符数组

在这里插入图片描述
或者这种:
在这里插入图片描述
在这里插入图片描述

6. 字节与字符串

6.1 将字节数组转变为字符串

在这里插入图片描述

6.2 将字节数组部分变为字符串

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

6.3 将字符串以字节数组的形式返回

在这里插入图片描述
在这里插入图片描述
byte[ ] 和char[ ]:
byte[ ] 是把String 按照字节的方式处理,适用于网络传输时,存储数据。
char[ ] 是把String 按照字符的方式处理,适用于处理文本数据。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AlinaQ05/article/details/124370156

智能推荐

ffmpeg使用_fmpeg-4.2.1-win32-shared.zip-程序员宅基地

文章浏览阅读304次。参考ffmpeg常用命令ffmpeg参数中文详细解释[总结]FFMPEG视音频编解码零基础学习方法一、安装打开https://ffmpeg.zeranoe.com/builds/,该网站中的FFMPEG分为3个版本:Static,Shared,Dev。前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe..._fmpeg-4.2.1-win32-shared.zip

QTableWidget设置为不可以编辑状态_如何qt的ui界面,使得别人无法修改-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏4次。在Qtablewidget 展示的时候,有时候我们不希望表格的内容被篡改,于是我们可以设置表格的属性选中需要的设置的表格,然后在筛选框中输入edit如下图所示勾选NoEditTriggers就好了_如何qt的ui界面,使得别人无法修改

【bzoj3747】[POI2015]Kinoman-程序员宅基地

文章浏览阅读59次。题解:水题从左向右维护以每一个作为右端点的最大值线段树维护代码:#include <bits/stdc++.h>using namespace std;#define rint register ll#define IL inline#define rep(i,h,t) for (rint i=h;i<=t;i++)#define..._从左向右维护以每一个作为右端点的最大值 设记录第 i 天的电影下次播放时间 枚举

Linux用户管理详解_linux登录qq是什么意思-程序员宅基地

文章浏览阅读448次。Linux用户管理用户基本概念什么是用户用户指的是能够正常登录Linux或Windows系统,比如:登录QQ的用户、登入王者荣耀的用户、等等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nz1edsjq-1626145230283)(C:\Users\李开开\AppData\Roaming\Typora\typora-user-images\image-20210712171546940.png)]为什么需要用户系统上的每一个进程(运行的程序),都_linux登录qq是什么意思

Unity中协程里Animator获取状态一些笔记_getanimatortransitioninfo-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏7次。最近用Animator获取状态各种获取错误,所以记一下笔记Animator中可以获取三种不同的状态:GetCurrentAnimatorStateInfo 获取正确的状态机状态GetNextAnimatorStateInfo 获取下一个状态机的状态GetAnimatorTransitionInfo 获取状态机的过渡状态动画同步是在帧最前,而协程是在帧的最后调用。所以切换状态后在协程获取状..._getanimatortransitioninfo

LATEX 中参考文献顺序_spphys.bst-程序员宅基地

文章浏览阅读924次。\bibliography{report} % bibliography data in report.bib\bibliographystyle{unsrt} % makes bibtex use spphys.bstunsrt 表示按照引用的先后顺序进行排序_spphys.bst

随便推点

git撤销本地所有修改_git 回退所有的修改-程序员宅基地

文章浏览阅读3.3k次。git撤销本地所有修改 git checkout ._git 回退所有的修改

signature=714e576fcd503d3d5c4bb0e0722ca7f2,System and method for the secure enrollment of devices wi...-程序员宅基地

文章浏览阅读100次。摘要:Enrolling devices with a clearinghouse server for Internet telephony and multimedia communications. Enrollment can be the process of taking a network device (such as a router, gateway, gatekeeper, ...

《iOS 9 开发指南》——第1章,第1.3节工欲善其事,必先利其器——搭建开发环境...-程序员宅基地

文章浏览阅读202次。本节书摘来自异步社区《iOS 9 开发指南》一书中的第1章,第1.3节工欲善其事,必先利其器——搭建开发环境,作者 管蕾,更多章节内容可以访问云栖社区“异步社区”公众号查看1.3 工欲善其事,必先利其器——搭建开发环境iOS 9 开发指南图片 2 知识点讲解:光盘:视频知识点第1章搭建开发环境.mp4学习iOS 9开发也离不开好的开发工具的帮助,如果使..._(1)下载完成后单击打开下载的“.dmg”格式文件,然后双击xcode文件开始安装。

iView 3.3.2 发布,基于 Vue.js 的企业级 UI 组件库-程序员宅基地

文章浏览阅读115次。开发四年只会写业务代码,分布式高并发都不会还做程序员? iView 3.3.2 发布了,iView 是一套基于 Vue..._iview 3.2.2

详解not in与not exists的区别与用法(not in的性能并不差!)-程序员宅基地

文章浏览阅读93次。2019独角兽企业重金招聘Python工程师标准>>> ..._predicate not in查询

SpringBoot整合Spring Data JPA、MySQL、Druid并使用Mockito实现单元测试_spring jpa mock-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏7次。SpringBoot整合Spring Data JPA、MySQL、Druid并使用Mockito实现单元测试_spring jpa mock

推荐文章

热门文章

相关标签