JavaSE之String类

文章目录

  • 一、String类常用的构造方法
  • 二、常见的四种String对象的比较
    • 1.使用``==``比较
    • 2.使用``equals()``方法比较
    • 3.使用``compareTo()``方法比较
    • 4.使用``compareToIgnoreCase()``方法比较
  • 三、字符串的查找
  • 四、字符串的转化
    • 1.数字和字符串间的转化
    • 2.大小写转化
    • 3.字符串和数组间的转化
  • 五、字符串的替换
    • 1.replaceAll()
    • 2.replaceFirst()
  • 六、字符串的分割
  • 七、字符串的截取
  • 八、去除字符串中的左右空格
  • 九、字符串的不可变性
  • 十、StringBuilder和StringBuffer
  • 十一、String类OJ面试题

        在这里插入图片描述

                                           给个关注叭
      在这里插入图片描述

  个人主页

  JavaSE专栏

前言:本片文章主要整理了String类常用的一些方法、及StringBuilder 和 StringBuffer 的用法及区别

一、String类常用的构造方法

1.常量字符串构造

   String str = "abcd";

2.直接new String对象

   String str = new String("abcd");

3.使用字符数组构造

   char[] array = {'a','b','c','d'};
   String str = new String(array);

  在JDK8中,String 类的底层字符串使用字符数组(char[])来存储的;在JDK17中字符串使用字节数组(byte[])来存储的


【注意】几种字符串为空的情况

  1. 字符串长度为零,字符串为空
   String str = "";
   System.out.println(str.length);//0
   System.out.println(str.isEmpty());//true
  1. 字符串 str 为null,代表 str 引用不指向任何的对象
   String str = null;
   System.out.println(str.length);//空指针异常
   System.out.println(str.isEmpty());//空指针异常   

 这里再重复一下,关于 引用类型 容易搞混淆的知识点

  1. 一个引用不可以指向多个对象(只能指向一个对象)
  2. 引用不可以指向引用(这种说法是错误的),下面代码的解读是 str2引用 指向了 str1引用所指向的对象
   String str1 = new String("abc");
   String str2 = str1;
  1. 引用等于null,代表此时该引用不指向任何的对象
   String str = null;

二、常见的四种String对象的比较

1.使用==比较

  对于基本数据类型来说,使用==比较,比较的是变量中的数值是否相同;对于引用数据类型来说,使用==比较,比较的是 引用所指向的对象是否相同(引用所指向的地址是否相同)

   int a = 3;
   int b = 3;
   System.sout.println(a == b);//true
   
   String str1 = "Hello";
   String str2 = "Hello";
   System.sout.println(str1 == str2);//false
   
   str1 = str2;
   System.sout.println(str1 == str2);//true

2.使用equals()方法比较

  equals()方法底层的比较规则是:先比较两个引用是否为同一个类型,然后比较两个引用所指向的是否为同一对象,最后比较字符串中的内容是否相同。返回值为true或false

 String str1 = new String("hello");
 Stirng str2 = new String("world");
 Stirng str3 = new String("hello");
 System.out.println(str1.equals(str2));//false
 System.out.println(str1.equals(str3));//true 

3.使用compareTo()方法比较

  和equals()方法不同,compareTo()方法的返回值是 整型int. 返回值大于零,前者大于后者;返回值小于零,前者小于后者;返回值等于零,前者等于后者。compareTo()方法,字符串的大小 取决于 字符串中第一个不相等的字符 所比较的大小。str1和str2 比较,第一组不相等的字符就是 ‘a’ 和 ‘A’,所以整个字符串的大小 取决于 ‘a’ 和 ‘A’ 的大小。

 String str1 = new String("abcd");
 Stirng str2 = new String("Abcd");
 Stirng str3 = new String("abcd");
 System.out.println(str1.compareTo(str2));//  返回值大于零
 System.out.println(str1.compareTo(str3));//  返回值等于零
 System.out.println(str2.compareTo(str3));//  返回值小于零

4.使用compareToIgnoreCase()方法比较

此方法会忽略大小写

 String str1 = new String("abcd");
 Stirng str2 = new String("Abcd");
 System.out.println(str1.compareTo(str2));//  返回值等于零

三、字符串的查找

在这里插入图片描述

四、字符串的转化

1.数字和字符串间的转化

数字转字符串

String str1 = String.valueOf(1234);
String str2 = String.valueOf(1.234);

字符串转数字

int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");

2.大小写转化

String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());

【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串


3.字符串和数组间的转化

String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);

五、字符串的替换

1.replaceAll()

替换所有的指定字符

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));

2.replaceFirst()

替换第一次出现的指定字符

String str = "helloworld" ;
System.out.println(str.replaceFirst("l","_"));

【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串


六、字符串的分割

        String str1 = "name=zhangSan=age=12";
        String[] ret = str1.split("=");//以'='分割,分割后存放在字符串数组中
        System.out.println(Arrays.toString(ret));
        String[] ret2 = str1.split("=",3);//以'='分割,最多分三组
        System.out.println(Arrays.toString(ret2));

运行结果:
[name, zhangSan, age, 12]
[name, zhangSan, age=12]


几种特殊情况的分割

  1. 以字符 ‘.’ 分割,需要加上转义字符"\"。字符 “|”, “*”, “+” 都得加上转义字符,前面加上 “\\”
        String str1 = "192.168.34";
        String[] ret = str1.split("\\.");//以'.'分割,需要加上"\\"
        System.out.println(Arrays.toString(ret));

2.以字符 ‘\’ 分割,需要用 “\\\\”

        String str1 = "192\\123";
        String[] ret = str1.split("\\\\");//以'\'分割
        System.out.println(Arrays.toString(ret));

3.如果一个字符串中有多个分隔符,可以用"|"作为连字符

        String str1 = "name=zhangSan&age=10";
        String[] ret = str1.split("=|&");//以'=' 和 '&' 分割,中间加'|'
        System.out.println(Arrays.toString(ret));

七、字符串的截取

在这里插入图片描述

【注意】截取部分内容(下标区间内),下标区间为左闭右开区间—>[begin,end);
如果区间为[0,str.length()),那么返回的新的字符串对象还是原来的字符串对象


八、去除字符串中的左右空格

在这里插入图片描述
代码示例如下:

String str = "  hello world   ";
String ret = str.trim();
System.sout.printfln(ret);

运行结果:
hello world
前后都没有空格


九、字符串的不可变性


在这里插入图片描述
在这里插入图片描述

  通过观察 String 的源码,String 类被 final 修饰,表明这个String 类不能被继承;类中的数组 也被 final 修饰,说明这个数组不能指向新的对象,但是可以通过下标改变数组中的值,所以说 “字符串的不可变性就是因为 数组被final修饰了,里面的值才不能被改变这种说法是错误的.字符串的不可变性是因为,被 private 关键字修饰,在类外无法访问数组,进而无法改变字符串的内容。

十、StringBuilder和StringBuffer

如果想要修改字符串中的内容,可以使用String类 进行字符串的拼接,但是这种效率很低

String str = "Hello";
str += " world"
System.sout.printfln(str);

将上述代码反汇编:
在这里插入图片描述
观察反汇编之后的代码,上面三段语句就等效于以下代码:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Hello");
stringBuilder.append(" world");
String ret = stringBuilder.toString();

【注意】这种方法不推荐使用,这种方法效率非常低,因为中间创建了很多的临时对象


  由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。所以要对字符串进行修改,建议使用 StringBuilder 和 StringBuffer 类。这两个类大部分功能是相同的,以下是一些常用的方法:
在这里插入图片描述


面试题:String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操

StringBuffer属于线程安全操作,类似于在公共厕所,每次进去一个人,都会上锁,另外一个人就进不去,只有前面的人完成方便之后,厕所门锁才会开。

【注意】虽然使用StringBuffer 比较安全,但是也会造成系统资源的消耗,因此在单线程下使用StringBuilder;在多线程下使用StringBuffer。


十一、String类OJ面试题

  1. 字符串中的第一个唯一字符

  2. 字符串中最后一个单词的长度

  3. 检测字符串是否为回文串

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

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

相关文章

grafana 配置prometheus

安装prometheus 【linux】麒麟v10安装prometheus监控&#xff08;ARM架构&#xff09;-CSDN博客 登录grafana 访问地址&#xff1a;http://ip:port/login 可以进行 Grafana 相关设置&#xff08;默认账号密码均为 admin&#xff09;。 输入账户密码 添加 Prometheus 数据源…

Codeforces Round 979 (Div. 2)

A. A Gift From Orangutan 题意&#xff1a; 思路&#xff1a; 贪心 模拟 重新排列的数组 -> 最大的元素放第一个位置 &#xff0c;最小的元素放第二个位置 #include<bits/stdc.h> using namespace std; #define lowbit(x) ( x & -x )#define int long long ty…

人类末日?Hinton预言AI恐将夺取地球控制权!

图片来源&#xff1a;Youtube Z Highlights&#xff1a; AI会变得比人类更聪明。我们必须担心它们会想从我们手中夺取控制权&#xff0c;这是我们应该认真思考的问题。 使用AI制造自动化致命武器的风险并不取决于AI是否比我们聪明。这与AI本身可能失控并试图接管的风险是完全…

[论文笔记]HERMES 3 TECHNICAL REPORT

引言 今天带来论文HERMES 3 TECHNICAL REPORT&#xff0c;这篇论文提出了一个强大的工具调用模型&#xff0c;包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 聊天模…

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

HCIP到底需要考哪几门?821和831都要考吗?

相对于华为认证中的HCIE&#xff0c;HCIP难度较低比较容易获得。 对于许多准备考HCIP认证的朋友来说&#xff0c;了解考试要求和内容是成功的关键第一步。 经常问的问题上次刚梳理了一波价格&#xff0c;还没看的看这里→《HCIP考证多少钱&#xff1f;HCIP认证深度解析》 今天再…

效果不错的论文介绍:Im2Flow2Act:-跨领域机器人操控技术

Im2Flow2Act: 跨领域机器人操控技术 简介 今天介绍一个比较惊艳的论文&#xff0c;Im2Flow2Act&#xff0c;可以预测应该怎么移动图象中的物体预测移动方法完成需要执行的动作任务。 Im2Flow2Act 是一个基于学习的机器人操控框架&#xff0c;旨在通过多种数据源为机器人提供操…

《深度学习》OpenCV EigenFaces算法 人脸识别

目录 一、EigenFaces算法 1、什么是EigenFaces算法 2、原理 3、实现步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;构建模型 4&#xff09;识别 4、优缺点 1&#xff09;优点 2&#xff09;缺点 二、案例实现 1、完整代码 运行结果&#xff…

Star Tower:智能合约的安全基石与未来引领者

在区块链技术的快速发展中&#xff0c;智能合约作为新兴的应用形式&#xff0c;正逐渐成为区块链领域的重要组成部分。然而&#xff0c;智能合约的可靠性问题一直是用户最为关心的焦点之一。为此&#xff0c;Star Tower以其强大的技术实力和全面的安全保障措施&#xff0c;为智…

算法之随机数

概述 用Java的Math.random()方法生成随机数。此方法为真随机。 代码 public static void main(String[] args) {int size 100;int cycle 1000000;int count 0;int target 1;for(int i 0; i < cycle; i){int r (int) (Math.random() * size);if(r target){count;}}S…

微信小程序文本收起展开

这里写自定义目录标题 微信小程序文本收起展开常见问题的梯形背景框 微信小程序文本收起展开 参考 https://juejin.cn/post/6963904955262435336 <!-- 常见问题解答 --><view classcontentBottom><view classBottomFirst><text id0 data-id0 class&quo…

SSM框架实战小项目:打造高效用户管理系统 day3

前言 在前两篇博客中&#xff0c;后台已经搭建完毕&#xff0c;现在需要设计一下前端页面 webapp下的项目结构图 创建ftl文件夹&#xff0c;导入css和js 因为我们在后台的视图解析器中&#xff0c;设置了页面解析器&#xff0c;跳转路径为/ftl/*.ftl&#xff0c;所以需要ftl文件…

SpringBoot日常:封装redission starter组件

文章目录 逻辑实现POM.xmlRedissionConfigRedissionPropertiesRedissionUtilsspring.factories 功能测试application.yml配置POM.xmlTestController运行测试 本章内容主要介绍如何通过封装相关的redission连接配置和工具类&#xff0c;最终完成一个通用的redission starter。并…

解决安装赤店供应链云仓系统提示:“对不起,本网站系统更新已到期,请联系官方niushop客服续费!”

最近一个客户找我说自己从第三方购买的赤店云仓系统安装的时候提示&#xff1a;“对不起&#xff0c;本网站系统更新已到期&#xff0c;请联系官方x’x’x&#xff01;”&#xff0c;第一感觉肯定是授xxx权验证的问题&#xff0c;问询得知他是第三方买的非商业版&#xff0c;那…

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

2024HarmonyOS应用开发者高级认证 最新题库第二部分

单选题 1.以下哪个装饰器用来表示并发共享对象。&#xff08;D&#xff09; AShared BState CStyle DSendable 2.hiAppEvent提供的Watcher接口&#xff0c;需要订阅到OS的崩溃事件&#xff0c;正确的实现方式(选下面这个) hiAppEvent.addWatcher({ name:"watcher&…

1.DBeaver连接hive数据库

1.hive开启远程服务&#xff0c;linux中直接输入&#xff1a;hiveserver2 2.解压dbeaver和hive-jdbc-2.1.1.zip 3.双击打开 4.数据库&#xff0c;新建连接 5.搜索hive 6.配置参数 7.编辑驱动设置 8.添加jar包 9.测试连接 10.右击&#xff0c;新建sql编辑器 11.执行sql 12.调整字…

重磅!继“总环”后,又1本TOP刊(IF=6.9)被On Hold!

【SciencePub学术】继Science of the Total Environment&#xff08;总环&#xff09;后&#xff0c;又突发一本中科院2区TOP刊被On Hold&#xff01;现在高分区期刊似乎成为了科睿唯安的重点关注对象&#xff0c;主打的就是一个“绝不姑息”。 来源&#xff1a;科睿唯安 Biome…

【计算机网络 - 基础问题】每日 3 题(五十二)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

《黑神话悟空》各章节boss顺序汇总

第一章BOSS顺序&#xff1a; 1、牯护院&#xff1a;犀牛精&#xff0c;位于苍狼岭娟&#xff0c;击败后能获得定身术。 2、广智&#xff1a;火刀狼&#xff0c; 位于观音禅院&#xff0c;击败后获得广智变身&#xff0c;记得敲钟。 3、蓝皮幽魂&#xff1a;蓝皮大头&#xff0…