Java中的String类知识点

前言

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

如何创建字符串

  • 最简单的方式

    String str = "hello";
  • 因为字符串属于对象,所以和其它对象一样,可以使用关键字和构造方法来创建 String 对象。

    String s2 = new String("hello");

储存位置

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上。

特性

String 类是是immutable(不可变)的,所以你一旦创建了 String 对象,那它的值就无法改变 WHY?

查看源码后可以发现源码使用的是final修饰符

public final class String
String s = "old";
System.out.println("s=" + s); s = "new";
System.out.println("s=" + s);

从输出结果上看是改变了,但为什么还说String对象是不可变的呢?

s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "new"; 创建了一个新的对象 "new",而原来的 "old" 还存在于内存中

length() 方法,length 属性和 size() 方法的区别:

  • length 属性是针对 Java 中的 数组 来说的,要求数组的长度可以用其 length 属性;
  • length() 方法是 针对 字符串 来说的,要求一个字符串的长度就要用到它的length()方法;
  • Java 中的 size() 方法是针对 泛型集合 说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看
String array[] = {"first", "second", "third"};//字符串数组
String a = "hello";//字符串
ArrayList<String> list = new ArrayList<>();
list.add(a);
System.out.println("数组array的长度为" + array.length);
System.out.println("字符串a的长度为" + a.length());
System.out.println("list中元素个数为" + list.size());//结果为3 5 1

常见的字符串比较

/**
* 1.储存位置不一样。常量池和堆内存中
* 2."=="比较的是对象的地址 "equals"比较的是值
*/
String s1 = "abc"; // 常量池
String s2 = new String("abc"); // 堆内存中
System.out.println(s1 == s2); // false两个对象的地址值不一样。
System.out.println(s1.equals(s2)); // true /**
* 先在常量池中创建 ab ,地址指向 s3, 再创建 abc ,指向 s4。
* 对于 s5,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s5。
* 故 (s5==s4) 为 false。
*/
String s3="ab";
String s4="abc";
String s5=s3+"c";
System.out.println(s5==s4); // false
System.out.println(s5.equals(s4)); // true

Java中的String、StringBuffer 和 StringBuilder 的区别

  • String: 字符串常量,字符串长度不可变。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
  • StringBuffer:字符串变量(Synchronized,即线程安全)。
    • 如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer
    • 如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。
    • Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。
  • StringBuilder:字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。

使用的基本原则

  • 操作少量的数据用 String
  • 单线程操作大量数据用StringBuilder
  • 多线程操作大量数据,用StringBuffer

关于Java中的String类知识点小总结的更多相关文章

  1. JAVA中的String类(详解)

    Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...

  2. java中的String类的不可变性的小例子

    在java语言中,String类具有不可变性,即常量字符串不可更改.下面的一个小例子简单演示相关概念. public class test { public static void main(Stri ...

  3. Java中的String类

    /*String类用于描述字符串事物的那么它就提供了多个方法对字符串进行操作 方法都会用,字符串这块就结束了常见的操作有哪些?“abcd”它应该具备什么功能,我们才能更好得操作它?1.获取(必须要掌握 ...

  4. java中的String类常量池详解

    test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...

  5. Java 中的 String 类常用方法

    字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. Strin ...

  6. 为什么Java中的String类是不可变的?

    String类是Java中的一个不可变类(immutable class). 简单来说,不可变类就是实例在被创建之后不可修改. 在<Effective Java> Item 15 中提到了 ...

  7. Java中的String类能否被继承?为什么?

    不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的. Java对String类的定义: public final class String implements ja ...

  8. Java学习笔记(一)——关于java中的String类

    [前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较 ...

  9. java中关于string类和常量池的一点猜想

    public class StringTest { /**   * @param args   */  public static void main(String[] args) {   test1 ...

随机推荐

  1. FL Studio钢琴卷轴之工具菜单的Riff命令

    鼠标左键点击FL Studio钢琴卷轴窗口中的"工具"命令,我们就可以打开快捷工具菜单.快捷菜单中包含了用于音符编辑的各种工具.按照该菜单的顺序,我们先来看一下什么是Riff器命令 ...

  2. Folx好用的下载功能介绍

    Folx作为一款使用便捷的Mac系统下载软件,为用户提供了网页链接捕获.种子文件下载.智能标签等功能,而其Folx专业版更为用户提供了智能控制速度.计划下载任务.种子文件搜索下载等更加智能化的功能. ...

  3. 怎么理解虚拟 DOM?

    一.前言 现在web前端的开发,对于MVVM框架的运用,那是信手拈来,用的飞起.一个xxx-cli工具,就能初始化一套模板,再填充业务代码,打包部署即可.但是会用,是一个方面,大家有没有底层深入思考一 ...

  4. JUC并发工具包之CyclicBarrier & CountDownLatch的异同

    1.介绍 本文我们将比较一下CyclicBarrier和CountDownLatch并了解两者的相似与不同. 2.两者是什么 当谈到并发,将这两者概念化的去解释两者是做什么的,这其实是一件很有挑战的事 ...

  5. MySQL的两种日志类型,redo log,binlog

    文章内容学习:极客时间-林晓彬老师-MySQL实战45讲 整理而得 我们知道MySQL数据库在发生意外宕机的情况下,可以将数据恢复到历史的某个时间点,能实现这个功能依靠的是日志,MySQL提供两种类型 ...

  6. LaTeX中的参考文献BibTex

    设置: BibTex代码及注释: 显示效果:

  7. EggJS 云原生应用硬核实战(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 Demo

    介绍 这是一个关于 Egg.js 应用上云️的示例,笔者所在的大前端团队的已应用于生产. CI/CD & DevOps & GitOps & HPA 等这里暂不做讨论,因为每一 ...

  8. 零钱问题的动态规划解法——用 n 种不同币值的硬币凑出 m 元,最少需要多少硬币。

    输入格式:第一行输入需要凑的钱数 m 和硬币的种类 n (0<m<100,0<n<10),第二行输入 n 种硬币的具体币值,假设硬币供应量无限多. 输出格式:输出最少需要的硬币 ...

  9. 【软件测试部署基础】yarn的认识

    1. yarn是什么 Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.其主要是为了弥补 npm 的一些少量的缺陷而 ...

  10. 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode

    迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...