String类

Java 中数组, String, 以及自定义的类都是引用类型

引用
可以把引用想象成一个标签, “贴” 到一个对象上。一个对象可以贴一个标签, 也可以贴多个。 如果一个对象上面一个标签都没有, 那么这个对象就会被 JVM 当做垃圾对象回收掉

String类的定义方式:

// 方式一
String str = "Hello";
// 方式二
String str2 = new String("Hello");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
  • 在以下代码中,通过修改str1的值并不能修改str2的值,而只是让str1引用指向了一个新的String对象,str2是指向改变前str1引用所指向的对象
String str1 = "Hello";
String str2 = str1;String str1 = "World";

  • 判断两个字符串相等
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true

此时的"Hello"这样的字符串常量是在 字符串常量池 中,在上述代码中其实只有一个Hello,str1和str2都指向这一个字符串常量

如果代码中有多个地方引用都需要使用 “Hello” 的话, 就直接引用到常量池的这个位置就行了, 而没必要把 “Hello” 在内存中存储两次

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
  • equals用来判断值是否相等,==用来判断引用是否指向同一个对象

此时的str1和str2都创建了对象,str1指向第一个对象,它的值是"Hello",str2指向第二个对象,它的值也是"Hello"

但因为两者不是指向同一个对象,故不能用 == 来判断相等,应该用 equals 来比较两个字符串的值

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true

此处要注意: 一旦 str1是 null, 方式一的代码会抛出空指针异常

  • 我们可以使用 String 的 intern() 方法来手动把 String 对象加入到字符串常量池中
// 该字符串常量并没有保存在常量池之中
String str1 = new String("hello") ;
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
falseString str1 = new String("hello").intern() ; //放入到常量池中
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
true
  • String类中两种对象实例化的区别
  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在字符串常量池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,不会自动保存在字符串常量池中,可以使用intern()方法手工入池。

字符串是一种不可变对象

String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str);
// 执行结果
hello world!!!

在这代码中,看结果的话确实字符串改变了,但其实是字符串的引用指向了另一个对象
此时在堆里存在着 “hello”、" world"、“hello world”、"!!!"、"hello world!!!"五个对象,这是对内存的一种浪费,会降低效率

  • 不可变的好处

  • 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了

  • 不可变对象是线程安全的

  • 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

  • 字符和字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换

构造方法:

//将字符数组的所有内容变为字符串
public String (char value[])//将部分字符数组中的内容变为字符串
public String (cahr value[], int offset, int count)

普通方法:

//取出指定位置的字符
public char charAt(int index)//将字符串变成字符数组返回
public char[] toCharArray()
String str = "hello" ;
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h System.out.println(str.charAt(10));
// 执行结果
//产生 StringIndexOutOfBoundsException 异常
  • 字节和字符串

字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换

构造方法:

//将字节数组变成字符串
public String(byte bytes[])//将部分字节数组中的内容变成字符串
public String(byte bytes[], int offset, int length)

普通方法:

//将字符串以字节数组的形式返回
public byte[] getBytes()
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) { System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data));

byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候

字符串String知识总结(上) 冲冲冲!!!相关推荐

  1. 已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。

    只为记录汇编作业 题目:已知字符串STRING以'$'为结束标志:统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变.要求分别在屏幕上输出原字符串以 ...

  2. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

  3. 【C++复习总结回顾】—— 【一】基础知识+字符串/string类

    文章目录 一.面向对象/过程 1. 面向过程过程 2. 面向对象编程 二.C++语言基础 1. 信息的存储单位 2. 命名空间 3. 基本数据类型 + 字符串 C++的基本数据类型 字符串处理 4. ...

  4. 通过Java字节码发现有趣的内幕之String篇(上)(转)

    原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...

  5. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  6. 数组及字符串相关知识

    一.数组的知识 Sec1.一维数组 1.数组的引入: 当数据量很多,类型相同需要重复定义的时候,需要用数组简化问题解法. 2.数组的使用 ①定义: 数组类型 数组名 [ 常亮表达式 ] 例如:int ...

  7. 第六节:ES6为字符串String带来哪些好玩的特性?

    工作日的推送尝试一下在晚上发,一个是考虑大家下班了放学了,心情轻松愉悦,适合阅读:另一个是上班时间情绪紧绷,没有心思也没有时间去完整地读完这种技术类的文章.(即便通俗易懂) 第六节,开讲啦...... ...

  8. Java字符串的重要性_java中的字符串相关知识整理

    字符串就是一系列的字符组合的串,如果写过C/C++的应该就了解,在字符串的操作上会有许多操作的函数与类,用于简化代码的开发.一方面是因为字符串在代码中会频繁用到,另一方面是因为字符串的操作非常麻烦. ...

  9. 【Scala教程】如何在已掌握的Java知识基础上快速上手Scala?【个人学习记录】

    如何在已掌握的Java知识基础上学习Scala 前言 正文开始! 1. 编译运行 2. 声明变量 3. 输出 4. 显式指定变量类型 5. 范围区间 6. 写入文本文件 7. 读取文本文件 8. if ...

最新文章

  1. posix多线程程序使用条件变量的一个常见bug
  2. 磁盘及文件系统管理(三)
  3. 剑指offer:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
  4. 将SAP Analytics Cloud嵌入到SAP Cloud for Customer里去
  5. python数字转中文字符_Python实现中文数字转换为阿拉伯数字的方法示例
  6. 移植gdb到DM368 IPNC中 linux arm gdb
  7. 瞧瞧苹果OS X如何干掉Linux
  8. 响应式Bootstrap后台管理系统模板UI框架
  9. React-Native的TextInput组件的设置以及获取输入框的内容
  10. 高速的二舍八入三七作五_京承高速收费“二舍八入 三七作五”
  11. 90 后篮球运动员成功转型 iOS 开发,过程超刺激
  12. servlet和springMVC框架
  13. linux必学的60个命令
  14. 什么是性能调优?性能调优的方法有哪些,流程是怎样的
  15. penn tree bank POS数据处理
  16. 为了写好代码,你坚持了哪些好习惯?
  17. Unity3D 获取资源运行时内存和硬盘大小
  18. 购买公司旅行保险计划的10个提示
  19. 消费机 mysql_消费机软件主要构成
  20. c语言面向对象编程显示,c语言面向对象编程

热门文章

  1. 这几个画流程图的软件值得你们收藏
  2. 高校wifi认证登录
  3. 串口转以太网关键技术
  4. SpringBoot 请求参数包含 [] 特殊符号
  5. 通过HbuilderX启动 微信开发者工具
  6. Arduino Uno 实验11——MQ-3酒精乙醇传感器模块
  7. java wildcard_java泛型 wildcard
  8. linux怎么添加跃点数,Windows 7修改静态路由表的跃点数
  9. 前程似锦用计算机怎么表示,祝福毕业生前程似锦句子 抖音最火毕业话语
  10. ubuntu开放端口21