Java 基础进阶篇(一)—— String 与 StringBuilder

news2024/11/24 8:45:49

文章目录

  • 一、String 类概述
  • 二、String 创建对象的方式
    • 2.1 创建对象的两种方式
    • 2.2 面试:两种方式的区别
    • 2.3 常见面试题
  • 三、String 类常用方法
    • 3.1 字符串内容比较
    • 3.2 常用 API:遍历、截取、替换、分割
  • 四、StringBuilder 字符串操作类
    • 4.1 构造器
    • 4.2 常用方法
    • 4.3 String 拼接字符串原理
    • 4.4 StringBuilder 提高效率原理图


一、String 类概述

java.lang.String 类代表字符串,它定义的变量可以指向一个字符串对象。同时 String 类提供了很多操作字符串的功能,我们可以直接使用。

String 是不可变字符串:String 变量每次的修改其实都是产生并指向了新的字符串对象,而原来的字符串对象都是没有改变的,所以称不可变字符串。

  如下方程序,首先在字符串常量池中,创建 “传智” 对象,并指向该对象。当执行 name+=“教育” 时,首先在常量池中创建 “教育” 对象,并将 “传智” 与 “教育” 两个对象拼接生成 “传智教育” 对象,并指向该对象。以此类推…

在这里插入图片描述
每当用 + 符号,拼接生成新的字符串时,原来的字符串都没有改变,因此 String 是不可变字符串。


二、String 创建对象的方式

2.1 创建对象的两种方式

  • 方式一:直接使用 " " 定义(推荐方式)
    String name = “黑马”;

  • 方式二:通过 String 类的构造器创建对象
    在这里插入图片描述


2.2 面试:两种方式的区别

  • 双引号 " " 给出的字符串对象,存在于堆内存中的常量池中,相同内容只会存储一份
    在这里插入图片描述
  • new 字符串对象,每new一次都会在堆内存中产生一个字符串对象
    在这里插入图片描述

2.3 常见面试题

  1. 下列代码的运行结果是?

    String s2 = new String(“abc”);:先去常量池中创建对象,然后再通过 new 创建对象。
    String s1 = “abc”;:由于常量池中有对象,所以不需创建对象。
    在这里插入图片描述
    扩展: 若先执行 String s1 = “abc”;,再执行 String s2 = new String(“abc”); ,则 s1 与 s2 分别创建一个对象。


  1. 下列代码的运行结果是?

    s3 不在常量池中,即不是双引号直接给出的,不会放在常量池中。
    在这里插入图片描述
    扩展: 程序总共创建五个对象,其中常量池中分别有:“abc”、“ab”、“c”,不在常量池中String类型变量 “abc” 以及 StringBuilder 类型变量 “abc”。(具体看后文)


  1. 下列代码的运行结果是?
    java 存在编译优化机制,程序在编译时,自动将 “a”+“b”+“c” 直接转换成 “abc”。
    在这里插入图片描述

三、String 类常用方法

3.1 字符串内容比较

== 判断字符串对象是判断地址的,这样会引起很多业务问题。推荐使用 equals 方法比较:

在这里插入图片描述

:基本数据类型用 == 比较。


3.2 常用 API:遍历、截取、替换、分割

在这里插入图片描述
举例:

String str = "abcdefg";
String s1 = "cde";
String s2 = "ggg";
String replaceStr = str.replace(s1, s2);
System.out.println(replaceStr); // abgggfg

四、StringBuilder 字符串操作类

StringBuilder 是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。

作用:提高字符串的操作效率,如拼接、修改等

4.1 构造器

在这里插入图片描述


4.2 常用方法

在这里插入图片描述


4.3 String 拼接字符串原理

  String 拼接字符串底层使用的是 StringBuilder。在拼接前,首先会在堆内存中创建 StringBuilder 对象,然后调用 toString 方法将 StringBuilder 转换为 String,并赋值给 String 类变量。
在这里插入图片描述


4.4 StringBuilder 提高效率原理图

对比 String ,StringBuilder 在拼接字符串时,其不会去创建额外对象,而是在原来的地址中进行动态添加。
在这里插入图片描述
结论:当需要进行字符串操作的时候,应该选择 StringBuilder 来完成,性能更好。

注意:StringBuilder 只是拼接字符串的手段,最终的目的还是要恢复成 String 类型

StringBuilder stb = new StringBuilder();
String str = stb.toString();

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 数据类型判断

(生活的道路一旦选定,就要勇敢地走到底,决不回头。——左拉) typeof typeof是在javascript编码过程中最常用的判断数据类型的方法,常用来判断数字,字符串,布尔值和undefind console.log(typeo…

ROS Noetic版本 rosdep找不到命令 不能使用的解决方法

使用rosdep指令来安装开源包所需的依赖是很方便的,本文主要介绍ROS Noetic版本中使用rosdep,报错找不到命令 ,rosdep不能使用的解决方法。 rosdep:找不到命令 Command rosdep not found, but can be installed with:sudo apt ins…

怎么取消parallels更新,关闭Parallels Desktop 更新提示

自动更新问题 使用Parallels Desktop一段时间后,会主动提示更新,MacOS上最好的虚拟机:Parallels Desktop,但在使用过程中每次启动都要检查更新,比较烦人 如图: 解决方法 取消parallels更新 点击Parall…

v4l2框架

v4l2框架 文章目录 v4l2框架框架1.硬件相关层uvc_probeuvc_register_chainsuvc_register_termsuvc_register_video 2.核心层__video_register_device 3.虚拟视频驱动vivid分析入口vivid_init注册vivid平台驱动vivid_probevivid_create_instance 框架 1.硬件相关层 driver/medi…

2023 hnust 大三下 嵌入式 期中考试复习笔记

前言 ★:重点※:补充内容❓:还没搞懂的内容主要来源:教材、PPT、百度百科、AI重点来源:4-6班感谢:lyf总结得很草率,因为没听过课,也玩不懂 重点汇总 考试题型 选择(40…

C#_Struct与Class的差异

简述 struct属于值类型,class属于引用类型 存储地址 struct储存于栈,class储存于堆(class于栈中储存引用) 传参性质 struct属于值传递,在函数内对参数进行修改,不会修改struct class处于引用传递&…

day40—选择题

文章目录 1.上网的时候,访问某个网页却突然出现了某个运营商的网页(如联通、电信)。出现此问题可能的原因是(A)2.某浏览器发出的HTTP 请求报文如下,下列叙述中,错误的是(C&#xff0…

阿里云CentOS服务器安装Redis教程(一步步操作)

使用阿里云服务器ECS安装Redis数据库流程,操作系统为CentOS 7.6镜像,在CentOS上安装Redis 4.0.14,云服务器选择的是持久内存型re6p实例,新手站长分享阿里云CentOS服务器安装Redis流程方法: 目录 在CentOS系统中部署R…

【内网】面试·HVV专题

【内网】面试HVV专题 1.目标主机没有nc时如何获取反向shell2.说说你了解的隧道技术SSH隧道HTTP/HTTPS协议DNS协议1.目标主机没有nc时如何获取反向shell Python反向shell执行如下命令,在VPS上监听本地2222端口 nc -lvp 2222在目标主机上执行如下命令: bash反向shell执行如下命…

数据结构/栈实现队列

前言 在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是栈实现队列,故关于栈和队列的讲解只是简单带过。 一、栈 栈是一种后进先出的线性表,即只能在固定的一端进行插入和删除。 栈 方法 Stac…

(2)Qt的UI入门

目录 1. QWidget类(重点) 2. 子组件 1. QWidget类(重点) QWidget类是Qt中所有组件和窗口的基类,其内部规定了组件和窗口的基本规则和功能。 Qt中每个属性的文档中都有Access functions部分,表示其支持的读写…

机器学习实战教程(十二):聚类算法Kmeans

聚类概念 聚类是一种无监督的机器学习方法,它主要是通过在数据集中找到相似的样本并将它们分组来发现数据中的模式和结构。聚类算法可以将数据分成具有相似特征的组,每个组被称为一个簇。 常见的聚类算法有以下几种: K-means聚类算法&#…

python面向对象三大特性详解 - 封装 继承 多态

前言 面向对象编程有三大特性:封装、继承、多态,本文带大家来认识和了解这三个特性~ 补充 - 新式类 & 经典类 在python2.x中,新式类是继承了object类的子类,以及该子类的子类 子子类...;经典类就是没有继承没有…

java基础入门-05

Java基础入门-05 13、面向对象进阶(static&继承)1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的格式1.4.3 构造方法的应用 1.5 this关键字的作用1.5.1 this关…

MapReduce 源码分析-1

源码追踪 Class Job 作为使用Java语言编写的MapReduce城西,其入口方法位main方法,在MapReduce Main方法中,整个核心都在围绕着job类,中文称之为作业。 public class WordDriver {public static void main(String[] args) throw…

解决vue中父组件通过props向子组件传递数据,子组件接收不到

问题&#xff1a;父组件在挂载时向后端发起请求获取数据&#xff0c;然后将获取到的数据传递给子组件&#xff0c;子组件想要在挂载时获取数据&#xff0c;获取不到。 代码示例&#xff1a; //父组件 <template><div><HelloWorld :message"message"…

Mysql数据库中的用户管理与授权

1.登录用户的管理 1.1 查看用户密码的信息 用户信息存放在 mysql 数据库下的 user 表&#xff08;MySQL 服务下存在一个系统自带的 mysql 数据库&#xff09;。 经常使用的查看密码信息的命令&#xff1a; 能看到密码信息&#xff1a;是经过加密后的密码信息 select user…

真题详解(关系模型)-软件设计(六十六)

真题详解(ICMP)-软件设计&#xff08;六十五)https://blog.csdn.net/ke1ying/article/details/130475620 2017年下半年 内存按字节编址&#xff0c;若存储容量为32K*8bit的存储芯片构成地址从A0000H到 DFFFFH的内存&#xff0c;至少需要____片芯片。 解析&#xff1a; DFF…

《Netty》从零开始学netty源码(五十二)之PoolThreadCache

PoolThreadCache Netty有一个大的公共内存容器PoolArena&#xff0c;用来管理从操作系统中获得的内存&#xff0c;在高并发下如果所有线程都去这个大容器获取内存它的压力是非常大的&#xff0c;所以Netty为每个线程建立了一个本地缓存&#xff0c;即PoolThreadCache&#xff…

ReentrantLock实现原理-非公平锁

在线程间通信方式2一节中&#xff0c;我们了解了Lock&#xff0c;Condition和ReentrantLock&#xff0c;学习了简单使用Condition和RentrantLock完成线程间通信&#xff0c;从文章中我们了解到ReentrantLock是Lock接口的一个最常用的实现类&#xff0c;ReentrantLock是独占锁&a…