【JavaSE】(8) String 类

一、String 类常用方法

1、构造方法

        常用的这4种构造方法:直接法,或者传参字符串字面量、字符数组、字节数组。

        在 JDK1.8 中,String 类的字符串实际存储在 char 数组中:

        String 类也重写了 toString 方法,所以可以直接打印 String 类,打印效果就是字符串,而非 className@hashCode 的形式:

        可以看到源码中,重写的 toString 直接返回的 this,因为 this 本身就是字符串类,println 会对 String 类进行处理,打印出字符串:

        length() 方法可以获取字符串长度,这区别于数组通过属性 length 获取长度。

 2、字符串的比较(包含字符串常量池)

        在前面学习 equals 和 compareTo 方法时知道,直接使用 == 比较,比较的是对象的地址,而非对象的内容:

 

        但通过两种构造方式得到的 String 类,比较的结果却不同,它们存在区别:

  • 法1:① 字符串常量池不存在"hello"对象 >> 在常量池创建"hello"对象 >> 在堆上创建"hello"对象 >> 在栈上创建 s1 引用,存放堆上对象地址。② 字符串常量池存在"hello"对象 >> 直接在堆上创建"hello"对象 >> 在栈上创建 s2 引用,存放堆上对象地址。

  • 法2:① 字符串常量池不存在"hello"对象 >> 在常量池创建"hello"对象 >> 在栈上创建 s3 引用,存放常量池上对象地址。② 字符串常量池存在"hello"对象 >> 在栈上创建 s4 引用,存放常量池上对象地址。

        因此,法1得到 false,法2得到 true。由此可见,将频繁使用的字符串存到字符串常量池,能够提高性能减少内存开销。参考博客:深入理解Java字符串常量池 | 二哥的Java进阶之路

        如果想将 new String("hello") 也存放到字符串常量池中,可手动地使用 intern 方法

        回到比较,如果想比较对象的内容,使用 equals 和 compareTo 方法。还有 equalsIgnoreCase 和 compareToIgnoreCase 方法,可忽略字母大小写:

3、字符串查找

        查找失败时,除了 charAt 抛出异常,其它方法都是返回 -1。

4、字符串转换

(1) 整数、浮点数、布尔值、对象、数组 >> 字符串

(2)字符串 >> 整数、浮点数、数组

(3)大小写转换

(4)格式化转换

5、字符串替换

6、字符串拆分

注,正则表达式中:

  • *、+、| 有特殊含义,需要加上 "\\"。
  • \  在 java 中要用 "\\" 表示,在正则表达式中也有特殊含义,最后为"\\\\"。
  • 正则表达式中,| 表示连字符,可连接多个分隔符。

7、字符串截取

8、字符串的不可变性

        题外话:Java 中的引用就是 C语言指针的改版,存的是对象的地址,但是它更安全,因为只允许 = 和 . 操作(除了数组,还有[ ] 操作),所以简单又不易出错。

        从 String 类的注释中可以看到,字符串是常量,它的值不可修改:

        String 类的内容是怎么做到不可修改的呢?有人说是因为 final,但并不是:

        修饰类的 final 表示 String 类不可继承;修饰 value 的 final 表示这个数组引用不可修改,并不是引用指向的内容不可修改。

        value 引用指向的字符串内容不可修改的原因

  • value 数组由 private 修饰。
  • String 类没有向外部提供修改 value 指向的对象的方法。

        字符串不可修改的缺点:每次修改字符串其实是创建一个新的对象效率低

        字符串不可修改的优点:

  • 多线程中使用 String 类更安全。(线程以后学习)
  • 方便储存在常量池。如果常量池中的字符串可修改,则会造成多个引用的变化。
  • 方便将固定 hashCode 存储在哈希表中。(哈希表以后学习)

二、可修改的字符串(StringBuilder和StringBuffer)

  • String 不可修改字符串内容,而 StringBuilder 和 StringBuffer 可修改字符串内容。
  • StringBuilder 和 StringBuffer 的功能大致相同,最大的不同是:StringBuffer 提供了 synchronized 操作,能够保证线程安全。(详情以后学习)

1、String 和 StringBuilder 的对比以及 append 方法

        可以看到当需要频繁修改字符串时,使用 StringBuilder 的效率要高很多,因为它不需要频繁创建新的对象。每次 +=,都会将旧的 s 对象自动销毁,所以大的不是空间开销,而是创建对象的时间开销。

2、capacity 和 ensureCapacity

        当用 StringBuilder 创建可修改的字符串对象时,实际会申请比初始化的字符串更大的空间capacity 方法就是获取实际的空间大小

        当字符串容量不够时,StringBuilder 会自动扩容,有时为了防止频繁扩容造成时间开销的增加,会使用 ensureCapacity 提前手动设置好比较大的字符串容量

三、String 类练习题

1、387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

思路:统计每种字母的个数,找到第一个个数为 1 的字母。

class Solution {public int firstUniqChar(String s) {int[] cnt = new int[256];// 统计每种字符个数for(int i = 0; i < s.length(); i++)cnt[s.charAt(i)]++;// 找到第一个唯一的字符for(int i = 0; i < s.length(); i++)if(cnt[s.charAt(i)] == 1)return i;// 未找到return -1;}
}

2、字符串最后一个单词的长度_牛客题霸_牛客网

思路:找到最后一个空格位置,根据空格位置裁剪出最后一个单词,获取长度。

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString s = in.nextLine();int index = s.lastIndexOf(' '); // 找到最后一个空格String lastWord = s.substring(index + 1, s.length()); // 裁剪出最后一个单词System.out.println(lastWord.length());}}
}

3、125. 验证回文串 - 力扣(LeetCode)

 

思路:先大写转小写,前、后设置一个标记移动,跳过非字母数字字符,匹配。

class Solution {// 判断小写字母和数字public boolean isValidChar(char ch) {if((ch >= 'a' && ch <='z') || (ch >= '0' && ch <= '9'))return true;elsereturn false;}public boolean isPalindrome(String s) {// 大写转小写s = s.toLowerCase();int i = 0, j = s.length() - 1;// 前、后移动while(i < j){// 前、后跳过所有其它字符,直到遇到小写字母和数字停止while(!isValidChar(s.charAt(i)) && i < j) i++;while(!isValidChar(s.charAt(j)) && i < j) j--;// 存在不匹配,则否if(s.charAt(i) != s.charAt(j)) return false;// 匹配,则更新i、ji++;j--;}return true;}
}

四、补充 -- FittenCode 插件

        它是一个AI功能,可以预测你要写的代码,还能根据项目的内容对它提问

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

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

相关文章

【理解工具调用的流程,本质体现了大模型智能性】

1、工具调用 调用完结果看里面tool_calls 是否为空&#xff0c;不为空就调用工具函数处理&#xff0c; 如果为空就中断循环。大模型返回的message结果智能判断是否继续调用 输入输出如下&#xff1a; 请输入&#xff1a;深圳西安天气 ------------------------------------…

Excel 实现文本拼接方法

1. 使用 & 运算符 这是最常见和简单的拼接方法。你只需使用 & 来连接多个文本单元格或文本字符串。 示例公式&#xff1a; A1 & B1这个公式会将 A1 和 B1 单元格中的文本合并为一个字符串。 如果你希望在文本之间加入分隔符&#xff08;如空格、逗号等&#xf…

C# ASP.NET MVC项目内使用ApiController

1.在App_Start文件夹新建WebApiConfig.cs文件&#xff0c;建立webApi路由的注册方法。 using System.Web.Http;namespace PrivilegeManager {public class WebApiConfig{public static void Register(HttpConfiguration config){config.MapHttpAttributeRoutes();config.Route…

【Springboot相关知识】Springboot结合SpringSecurity实现身份认证以及接口鉴权

Springboot结合SpringSecurity实现身份认证以及接口鉴权 身份认证1. 添加依赖2. 配置JWT工具类3. 配置Spring Security4. 创建JWT请求过滤器5. 创建认证控制器6. 创建请求和响应对象7. 配置UserDetailsService8. 运行应用程序9. 测试总结 接口鉴权1. 启用方法级安全注解2. 定义…

Mac开启任何来源安装配置环境变量

目录 开启任何来源配置环境变量退出保存时如果没有权限修改文件权限拓展——.bash_profile和.zshrc 开启任何来源 sudo spctl --master-disable#打开软件时提示文件损坏 sudo xattr -r -d com.apple.quarantine 进入访达应用程序拖拽应用到终端配置环境变量 cd ~ vi ~/.bash…

使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法

在开发 Spring Boot 项目时&#xff0c;日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统&#xff0c;并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 &#xff08;A2 6xx1&#xff09;查找的备选集 &#xff08;C2:C19&#xff09;…

QModbusTCPClient占用内存持续增长

最近使用QModbusTCPClient通信&#xff0c;需要频繁发送读写请求&#xff0c;发现软件占用内存一直在增减&#xff0c;经过不断咨询和尝试&#xff0c;终于解决了。 1.方案一&#xff08;失败&#xff09; 最开始以为是访问太频繁&#xff0c;导致创建reply的对象比delete re…

adb 命令使用大全

1.adb针对设备 adb devices //查看链接设备 adb -s "设备序号" shell 命令 //选择设备执行 adb connect "ip地址" adb disconnect "ip地址" adb shell screencap -p /sdcard/screenshot.png //截图 adb pull /sdcard/filename …

Linux(Centos 7.6)命令详解:iconv

1.命令作用 将给定文件的编码从一种编码转换为另一种编码(Convert encoding of given files from one encoding to another) 2.命令语法 Usage: iconv [OPTION...] [FILE...] 3.参数详解 OPTION: 输入/输出格式规范: -f, --from-codeNAME&#xff0c;原始文本编码-t, --t…

读《SQL经典实例》学数据库(系列一)

目录 友情提醒第一章、数据库简述1.1&#xff09;数据库简述1.2&#xff09;常见的数据库软件1.3&#xff09;MySQL数据库安装 第二章、SQL语句分类2.1)操作数据仓库/数据表&#xff1a;DDL2.1.1&#xff09;创建数据仓库/数据表2.1.2&#xff09;删除数据仓库/数据表2.1.3&…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

算法项目实时推流

1、搭建流媒体服务器 下载mediamtx 2、视频流直推 ffmpeg -stream_loop -1 -i DJI_20250109112715_0002_W.MP4 -r 30 -c:v libx264 -preset ultrafast -f flv rtmp://192.168.100.20:1935/live/test_chengdu1 3、硬件加速 如果硬件支持&#xff0c;可以使用硬件加速编码器&am…

99.12 金融难点通俗解释:毛利率

目录 0. 承前1. 简述2. 比喻&#xff1a;冰淇淋店赚钱2.1 第一步&#xff1a;准备材料2.2 第二步&#xff1a;卖冰淇淋2.3 第三步&#xff1a;计算毛利率 3. 生活中的例子3.1 好的毛利率3.2 一般的毛利率3.3 差的毛利率 4. 小朋友要注意4.1 毛利率高不一定好4.2 毛利率低不一定…

一文学会YOLO系列算法(从V3到11)实现遥感图像目标检测

目录 前言 数据集介绍 数据集转换 YOLO代码的下载 YOLO的配置 1.数据集的配置 2.模型的配置 YOLO11模型的训练 其它版本YOLO的训练 前言 遥感技术的快速发展&#xff0c;特别是在高分辨率遥感图像的获取能力上的显著提升&#xff0c;已经大大拓宽了遥感数据在环境监测…

3.1 Go函数调用过程

在 Go 语言中&#xff0c;函数调用的核心机制依赖于内存的栈区分配和指针操作&#xff0c;理解这一原理有助于掌握函数的执行过程。 1. 内存结构概述 在 Go 程序编译成可执行文件并启动后&#xff0c;操作系统会为其分配进程内存&#xff0c;进程内存主要分为以下区域&#x…

图解Git——分布式Git《Pro Git》

分布式工作流程 Centralized Workflow&#xff08;集中式工作流&#xff09; 所有开发者都与同一个中央仓库同步代码&#xff0c;每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件&#xff0c;后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…

案例分析一

张某&#xff08;10多年IT工作经验&#xff09;应聘一家国企单位&#xff0c;面试官&#xff08;技术副主管&#xff09;面试时问了些无关痛痒的问题&#xff0c;谈到薪资时强调我权限范围内的数额就那么多&#xff0c;再多就需要走申请流程进行操作了。 没几天入职后&#xf…

【高阶数据结构】布隆过滤器(BloomFilter)

1. 概念 1.1 背景引入 背景&#xff1a;在计算机软件中&#xff0c;一个常见的需求就是 在一个集合中查找一个元素是否存在 &#xff0c;比如&#xff1a;1. Word 等打字软件需要判断用户键入的单词是否在字典中存在 2. 浏览器等网络爬虫程序需要保存一个列表来记录已经遍历过…

【json_object】mysql中json_object函数过长,显示不全

问题&#xff1a;json只显示部分 解决&#xff1a; SET GLOBAL group_concat_max_len 1000000; -- 设置为1MB&#xff0c;根据需要调整如果当前在navicat上修改&#xff0c;只有效本次连接和后续会话&#xff0c;重新连接还是会恢复默认值1024 在my.ini配置文件中新增或者修…