【Java】第二讲:字符串相关类

个人主页:深情秋刀鱼@-CSDN博客 

Java专栏:Java程序设计

目录

 一、String

1.Java中的数据类型

2.字符串概述

3.字符串构造方法

4.字符串构造内存原理

 5.字符串比较

6.字符串常见方法

二、StringBuilder 

1.定义

2.常用方法

 3.StringBuilder内存分析

三、StringJoiner

1.定义

2.常用方法


 一、String

1.Java中的数据类型

        在Java中数据类型被分为基本数据类型引用数据类型

  • 基本数据类型:数值存储在自己的空间而不是堆内存或其他的空间中,如int、float、double、boolean等
  • 引用数据类型:数值存储在其他的空间,本身的空间存储的是地址值,如数组、创建的对象、字符串等。

        在本节中,我们将介绍的字符串就是一种引用数据类型。

2.字符串概述

        a.在Java中所有字符串的定义都在java.lang.String中,在使用String定义字符串时应先导包。       

//导包
java.lang.String;

//定义
String s = "abcdef";

        b.字符串参与的所有运算都属于字符串的拼接操作。由于字符串的内容自创建之后就不能改变,所以每次执行字符串的拼接操作时都会在内存中重新申请空间储存拼接后的字符串。

String s1 = "abc";
String s2 = "123";
System.out.println(s1+s2);//执行结果:abc123

        在执行上面的代码时一共产生了三个字符串,分别是s1("abc")、s2("123")以及拼接后新产生的字符串"abc123"。       


String s1 = "abc";
s1="三连+关注";
System.out.println(s1);//执行结果:三连+关注

        c.字符串的值被创建后是无法改变的,因此在执行上面的代码时并没有改变"abc"里原本的内容,而是创建了一个新的字符串"三连+关注"并重新赋值给了s1。


        d.对于没有变量参与的字符串拼接操作是不同于有变量参与的拼接操作的。

  • 如果没有变量参与,系统会检查串池,如果串池中有该字符串,直接复用,没有再开辟新的内存空间。
  • 如果有变量参与,每一行代码都会创建新的字符串。

3.字符串构造方法

        a.直接定义

String s1 = "abc";
System.out.println(s1);//执行结果:abc

        b.通过new关键字获取一个空字符串

String s1 = new String();
System.out.println("!"+s1+"!");//执行结果:!!

        c.传递一个字符串,根据传递的字符串再构造一个新的字符串

String s1 = new String("abc");
System.out.println(s1);//执行结果:abc

        d.传递一个字符数组,根据字符数组的内容构造新的字符串

char[] ch = {'a','b','c'};
String s1 = new String(ch);
System.out.println(s1);//执行结果:abc

        e.传递一个字节数组,根据字节数组的内容构造新的字符串

byte[] by = {97,98,'c'};
String s1 = new String(by);
System.out.println(s1);//执行结果:abc

        在字节数组中,97和98不再代表整形,而是ASCII码表中码值为97、98的符号,即a、b。

4.字符串构造内存原理

        在Java中内存主要被分为栈、堆、方法区三部分(如下图)。

  • 栈:主要存储方法,方法开始执行时进栈,结束执时出栈。
  • 堆:存储对象或数组,使用new关键字时是在堆内存中开辟了空间。从键盘获取的字符串也是存储在堆中。
  • 方法区:存储可执行的class文件。

         在堆内存中,有一块被称作串池(String Table)的内存空间,它是专门用来存储字符串的内存空间。

        如果选择直接赋值(参考2.a)的形式构造字符串,系统会在串池中检查,如果两个字符串的内容完全相同,则直接服用已经构造好的字符串,而不会重新开辟空间存储,减少了空间浪费。

String s2 = "abc";
String s1 = "abc";//s1和s2中地址值是一样的

        而如果使用new关键字构造,系统不会检查串池并直接在堆空间中开辟内存。

String s2 = new String("abc");
String s1 = new String("abc");//使用new关键字构造的字符串地址不同

 5.字符串比较

        a.如果直接用==符号比较,可能并不能反馈正确的结果。由String定义的字符串是一种引用数据类型,在String创建的对象本身的空间中存储的是地址值,而不是数据,==符号比较的是对象本身内存中的数据,因此可能会输出错误的结果。

Scanner sc = new Scanner(System.in);//在键盘上输入"abc",输入的数据是存储在堆内存中的
String s1 = sc.next();
String s2 = "abc";
System.out.println(s1==s2);//执行结果:false

        b.比较两个字符串内容是否相同可以使用String类中的equals方法。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "abc";
boolean res = s1.equals(s2);//equals的返回值是boolean类型
System.out.println(res);//执行结果:true

        c.比较两个字符串内容是否相同且忽略大小写,使用String类中的equalsIgnoreCase方法。此处的忽略大小写只针对于英文字母而不针对于中文(如"1"和"一")。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "Abc";
boolean res = s1.equalsIgnoreCase(s2);
System.out.println(res);//执行结果:true

6.字符串常见方法

  • public char charAt(int index);
  • 根据索引(索引下标从0开始)返回字符。
String s1 = "abcde";
char ch = s1.charAt(0);
System.out.println(ch);//执行结果:a

  • public int length();
  • 返回字符串的长度。
String s1 = "abcde";
int len = s1.length();
System.out.println(len);//执行结果:5

  • String substring(int begin,int end);
  • 从字符串中截取并返回下标从begin开始到end-1(不包含end)结束的字符串。
String s1 = "abcde";
String subs1 = s1.substring(0,2);//截取下标从0~1的字符串
System.out.println(subs1);//执行结果:ab

二、StringBuilder 

1.定义

        StringBuilder可以看作一个容器,不同于String,用StringBuilder创建的对象内容是可变的,它可以提高字符串的操作效率。

StringBuilder sb = new StringBuilder();

        括号中可传参可不传参。

2.常用方法

  •  toString();
  • 将StringBuilder类型的对象转换为String类型。
StringBuilder sb = new StringBuilder("abc");
String s1 = sb.toString();
System.out.println(s1);//执行结果:abc

        需要注意的是,通过StringBuilder创建的对象无法直接使用String中的方法,需要经过toString转换才能使用String中的方法。


  • append();
  • 向StringBuilder创建的对象中添加数据。
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.toString());//执行结果:abc
sb.append("123");
System.out.println(sb.toString());//执行结果:abc123

  • reverse();
  • 反转对象中的数据。
StringBuilder sb = new StringBuilder("abc123");
System.out.println(sb.toString());//执行结果:abc123
sb.reverse();
System.out.println(sb.toString());//执行结果:321cba

  • length();
  • 返回容器中字符串的长度。
StringBuilder sb = new StringBuilder("abc123");
int len = sb.length();
System.out.println(len);//执行结果:6

  • capacity();
  • 返回目前容器的容量。一个空的StringBuilder对象默认容量时16.
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16

 3.StringBuilder内存分析

        在创建StringBuilder的对象时,在内存中默认开辟容量为16的字节数组,如果载入的数据超容,则系统会自动 为StringBuilder扩容,新容量=老容量*2+2=34;如果新数据超容且超出自动扩容时的容量,那么新的容量以实际为准。

        需要注意的是,capacity指的是容器能容纳数据的空间大小,而length可以理解为存储在容器中的有效数据的长度。

  • 初始容量:16
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16

  • 数据内存没有超出默认扩容的内存空间(34)
sb.append("abcdefghijklmnopq");
System.out.println(sb.length());//执行结果:17
System.out.println(sb.capacity());//执行结果:34

  • 数据内存超出了默认扩容的内存空间
sb.append("abcdefghijklmnopqrstuvwxyz123456789");
System.out.println(sb.length());//执行结果:35
System.out.println(sb.capacity());//执行结果:35

三、StringJoiner

1.定义

         StringJoiner和StringBuilder一样。都可以看作一种容器,创建之后里面的内容是可变的。StringJoiner的代码编写十分简洁,可以快速有效的完成程序员指定的字符串拼接操作。StringJoiner是不支持空参构造的。

  • StringJoiner sj = new StringJoiner("---");
  • 创建一个对象,指定拼接时的间隔符号("---")。
StringJoiner sj = new StringJoiner("---");

  • StringJoiner sj = new StringJoiner("---", "[", "]");
  • 创建一个对象,指定拼接时的间隔符号("---")、开始符号("[")、结束符号("]")。
StringJoiner sj = new StringJoiner("---","[","]");

2.常用方法

  • public StringJoiner add(添加的内容);
  • 添加数据,并返回数据本身
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
System.out.println(sj);//执行结果:[aaa---bbb---ccc]

  • public int length();
  • 返回长度。这里的length同时包含间隔符号、开始符号、结束符号在内。
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
int len = sj.length();
System.out.println(len);//执行结果:17

  • public String toString();
  • 返回一个字符串。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据集标签数量不均衡如何设计loss均衡数量

数据集标签数量不均衡如何设计loss均衡数量 1. 思路出发点: 对于哪些数量分布比值较少的标签提供更多的loss注意力比重,如何提高训练注意力比重,也就是说,让模型的梯度更多的倾向于有利于数据标签分布较少的数据训练&#xff0c…

js中的复制粘贴(亲测有效)

下方微信公众号 和微信小程序推荐 js中的复制粘贴 navigator.clipboard.writeText(copyText) 是 Web API 中的一个方法,用于将指定的文本内容复制到用户的剪贴板。这个方法属于 Clipboard API,它使得网页能够读取和写入剪贴板的内容。 具体来说&#…

5月6(信息差)

🌍一次预测多个token,Meta新模型推理加速3倍,编程任务提高17% https://hub.baai.ac.cn/view/36857 🎄 LeetCode 周赛超越 80% 人类选手,推理性能超 Llama3-70B。 ✨ 我国量子计算机实现“四算合一” 实现通算、…

Rust开发工具有哪些?

目录 一、JetBrains公司的RustRover​编辑 二、微软公司的Visual Studio Code 三、Rust编译工具 一、JetBrains公司的RustRover RustRover是由JetBrains开发的一款专为Rust开发量身定制的新兴IDE,目前还处于早期访问阶段。它支持Rust、Cargo、TOML、Web和数据库等…

学习笔记:【QC】Android Q telephony-data 模块

一、data init 流程图 主要分为3部分: 1.加载TelephonyProvider,解析apns-config.xml文件,调用loadApns将 xml中定义的数据,插入到TelephonyProvider底层的数据库中 2.初始化phone、DcTracker、TelephonyNetworkFactory、Conne…

【Pytorch】3.Transforms的运用

什么是Transforms 在PyTorch中,transforms是用于对数据进行预处理、增强和变换的操作集合。transforms通常用于数据载入和训练过程中,可以包括数据的归一化、裁剪、翻转、旋转、缩放等操作,以及将数据转换成PyTorch可以处理的Tensor格式。 Tr…

Redis-五大数据类型-Zset(有序集合)

五大数据类型-Zset(有序集合) 简介 Zset与Set非常相似,是一个没有重复元素的String集合。 不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集…

力扣:221. 最大正方形

221. 最大正方形 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 示例 1: 输入:matrix [["1","0","1","0","0"],["1","0"…

#05 损失函数与优化器:深度学习的调谐师

文章目录 前言什么是损失函数?常见的损失函数 优化器的角色经典优化器 PyTorch中的损失函数与优化器实现一个损失函数选择一个优化器 神经网络训练中的应用结论 前言 深度学习的艺术和科学在于优化:它是一个寻找使模型性能最大化的过程。在这个过程中&am…

深度学习之基于Vgg16卷积神经网络心电图心脏病诊断系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 心脏病是全球范围内导致死亡的主要原因之一,其早期的准确诊断对于患者的治疗和康复至关重…

【综自系统】配电室综合监控系统

安科瑞电气股份有限公司 祁洁 15000363176 一、系统简介 Acrel-2000E配电室综合监控系统,可实现开关柜运行监控、高压开关柜带电显示、母线及电缆测温监测、环境温湿度监测、有害气体监测、安防监控,可对灯光、风机、除湿机、空调控制等设备进行联动…

MySQL mysqldump备份恢复

目录 1. 备份类型 2. 逻辑备份VS物理备份 3. mysqldump工具 3.1 备份命令格式 3.2 备份选项 3.3 备份全库(结构和数据) 3.4 备份全库(仅结构) 3.5 备份全库(仅数据) 3.6 备份单个数据库(结构和数据) 3.7 备份单个数据库(仅结构) 3.8 备份单个数据库(仅数据) 3.9…

ACPWorkbench_for_BP10

一、菜单 文件菜单包含导入导出所有参数,导出flashbin文件和退出操作。文件菜单显示如下: Import Audio Settings:从音频配置文件中导入音频参数。 Export Audio Settings:将音频设置导出为音频配置文件。 Export Flash Binary Fi…

Type Specific Interfaces(Rolling特殊类型接口)

Type Specific Interfaces 一直以来,API的某些部分必然特定于所交换的消息类型,例如发布消息或订阅主题,因此需要为每个消息类型生成代码。下图布局了从用户定义的rosidl文件(如.msg文件)到用户和系统用于执行特定类型…

透明屏幕的可视角度有多大?在不同角度观看显示效果是否受影响?

透明屏幕的可视角度大小会因不同的技术、设计和应用场景而有所差异。以OLED透明屏为例,其可视角度通常可以达到178/178,这意味着在广阔范围内,观察者都能保持清晰的视觉效果。 然而,在不同角度观看透明屏幕时,显示效果…

【七十九】【算法分析与设计】并查集模板!!!并查集的实现_牛客题霸_牛客网,【模板】并查集 - 洛谷,并查集代码!!!

并查集的实现_牛客题霸_牛客网 描述 给定一个没有重复值的整形数组arr,初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构,并提供以下两个操作。 boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合 void u…

python从0开始学习(四)

目录 前言 1、算数运算符 1.1 //:整除运算符 1.2 %:取模操作 1.3 **:幂运算 2、赋值运算符 3、比较运算符 4、逻辑运算符 5、位运算符 5.1 &:按位与 5.2 |:按位或 5.3 ^:按位异或 5.4 ~:按位取反 5.5…

细粒度数据设计对于微调的重要性

原文地址:the-importance-of-granular-data-design-for-fine-tuning 利用数据设计来训练LLM,以充分利用上下文,同时解决“Lost-In-The-Middle”的挑战。 2024 年 5 月 2 日 介绍 对话设计师难道不是杰出的数据设计师吗? 请允许我详…

机器学习之基于Jupyter中国环境治理投资数据分析及可视化

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 机器学习之基于Jupyter中国环境治理投资数据分析及可视化项目是一个结合了机器学习和数据可视化技术的项目&#xf…

【算法练级js+java】重复给定字符n次

题目 Repeats the given string n times.(复制指定的字符串n次) 期望结果 /** * Repeats the given string n times. * * repeat(‘, 3) * // > **’ * * repeat(‘abc’, 2) * // > ‘abcabc’ * * repeat(‘abc’, 0) * // > “” **/ 代码…