【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();
  • 返回一个字符串。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04-xss获取cookie实验

二、开发XSS服务器端 1、确认实验环境 攻击者服务器:192.168.74.134,将获取到cookie数据保存到该服务器的数据库中,运行PHP代码暴露一个接收Cookie的URL地址。 正常Web服务器:192.168.74.133,用于正常的用户访问的目…

【介绍下大数据组件之Storm】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

《我的医养信息化之路》之三十四:家庭健康管理员

在2019年的健康中国行动中,国家出台《关于实施健康中国行动的意见》、《健康中国行动(2019—2030)》、《中国公民健康素养66条》、《关于全面开展健康家庭建设的通知》等多份文件,提出每个人都是自己健康的第一责任人,…

Linux磁盘IO、网络IO、零拷贝详解

一、什么是I/O? 在计算机操作系统中,所谓的I/O就是输入(input)和输出(output),也可以理解为读(read)和写(write),针对不同的对象,I/O模式可以划分…

【代码随想录——哈希表】

1.哈希表理论基础 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 那么哈希表能解决什么问题呢,一般哈希表都是用…

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址:Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址:infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK…

【网站项目】戒烟网站

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【Unity Shader入门精要 第4章】数学基础(二)

1. Unity中的坐标空间 1.1 五个坐标空间 模型空间 模型自身的3D坐标系空间,左手坐标系是一个相对空间,坐标轴指向随模型旋转变化当物体有父节点时,Transform组件中各属性的值表示的即为该物体在其父物体的模型空间中的值当模型顶点传入顶点…

ICDE2024 |VDTuner:向量数据库自动调优技术

在CodeFuse接入实际业务的过程中,大模型的推理成本以及生成内容的准确性是产品规模落地的两个核心考量因素。为了降低推理成本,我们研发了CodeFuse-ModelCache语义缓存加速功能,通过引入Cache机制,缓存已经计算的结果,…

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件&#xff0c;选择Config or installation folder 如果本地没有设置文件&#xff0c;选择Do not import settings 同意两个协议 耐…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

Pandas入门篇(三)-------数据可视化篇3(seaborn篇)(pandas完结撒花!!!)

目录 概述一、语法二、常用单变量绘图1. 直方图&#xff08;histplot&#xff09;2. 核密度预估图&#xff08;kdeplot&#xff09;3. 计数柱状图&#xff08;countplot&#xff09; 三、常用多变量绘图1.散点图(1) scatterplot(2)regplot 散点图拟合回归线(3)jointplot 散点图…

2024年Q1脱毛膏线上市场(京东天猫淘宝)销量销额排行榜

鲸参谋监测的2024年Q1季度线上电商平台&#xff08;天猫淘宝京东&#xff09;脱毛膏行业销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年Q1季度在线上电商平台&#xff08;天猫淘宝京东&#xff09;&#xff0c;脱毛膏的销量累计接近220万件&#xff0c;环比增…

开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制

参考文献&#xff1a; [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…

OFDM802.11a的FPGA实现(九)星座图映射(含verilog和matlab代码)

目录 1. 前言2. 调制2.1 QAM调制2.2 64-QAM 调制2.3 16-QAM 调制 3.模块实现4.Matlab仿真5.ModelSim仿真6.verilog代码 原文连接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1. 前言 在上一篇博客当中&#xff0c;已经完成了数据域的交织…