JAVA学习·String类的常用方法

String 类及其创建

String 类的创建

  String 类是 Java 内置的一个类,其完全限定类名是java.lang.String。想要创建一个字符串有多重方式,比如创建字符串"Hello"

String s1 = "Hello"; // 字面量创建
String s2 = new String("Hello"); // 构造函数创建
String s3 = "He" + "llo"; // 字符串连接
String s4 = new String(new char[]{'H','e','l','l','o'}); // 字符数组创建
String s5 = s4.intern();

String 对象在内存中的位置

  上面的s1,s3存在常量池里,而s2,s4存在里。类似于 C 程序的编译,可能编译器在编译String s1 = "Hello"时,将"Hello"存进了可重定位文件的.rodata(只读数据节)中了,并且将这个字符串与s1的联系写进重定位节。s3在编译时预处理,自动计算了"He" + "llo"并也存入.rodata;由于已经有一个"Hello"了,就不再重复加入"Hello",而是直接将s3与之前的那个"Hello"进行重定位。
  s2,s4都是通过new一个新的字符串对象得到的,这个就好比C语言的malloc,分配的空间在内存的堆中。

  s5也是存在常量池里,和s1,s3一样。internString类的一个实例方法,返回字符串对象的字面量。下面是这个方法的 API 注释:
在这里插入图片描述
  从框起来的部分可以看到,intern方法对于str2=str1.intern()处理在内存分配上有两种情况:
1 1 1.str1的字面量已经在常量池里,则直接让str2指向它。此时有str1==str2
2 2 2.str1的字面量不在常量池里,这时str1肯定是在堆里面分配的,JVM会把str1的字面量存入常量池,再令str2指向它。
  所以不管怎么说,通过intern方法得到的引用对象,始终指向常量池

String 类的一些常用方法

字符串比较

  • equalss1.equals(s2)比较s1s2的字面量,如果字面量相等就返回true,否则是false。如果s2==null也是返回false

在 Java 中由于所有非基本数据类型的变量都是引用变量,s1==s2这一语句其实是在判断s1s2是否指向同一个内存区。相当于 C 语言中两个指针==操作。

  • equalsIgnoreCase。忽略大小写的比较。
  • regionMatches。比较部分内容是否相同,这个函数有两个重载的写法:
    • regionMatches(int toffset,String other,int ooffset,int len)。调用s1的该方法,比较s1[toffset]other[ooffset]开始的len个字符是否都相等;如果都相等返回true,否则false
    String s0 = "Java";
    String s2 = "Welcome to Java";
    String s3 = "welcome to java";
    System.out.println(s2.regionMatches(11, s0, 0, 4) ); //true
    System.out.println(s3.regionMatches(11, s0, 0, 4)); //false
    
    • regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 。和上面那个方法用法类似,只是当ignoreCase==true时比较的时候忽略大小写。
    System.out.println(s3.regionMatches(true, 11, s0, 0, 4));//true
    
  • startsWith(s1)判断是否以字符串s1开始。
  • endsWith(s1)判断是否以字符串s1结束。
  • compareTo方法用于比较两个字符串的大小,即第一个不同字符的差值(字典序)。

字符串的长度

  使用length()方法可以返回字符串的长度。注意数组获取长度是length成员,两者不一样。

获取特定位置的字符

  如果是 C 语言直接就是s[index]了,但是 Java 要用s.charAt(index)

连接字符串

  可以直接用加法连接:

String s3 = s1 + s2;

  也可以是调用函数concat

String s3 = s1.concat(s2);

  两者效果一样,但是不会改变s1,s2的值。连接操作返回的是一个独立于s1,s2的新的字符串。

截取字符串

  调用subString方法。有两个重载的subString方法:

  • substring(int beginIndex, int endIndex)返回从beginIndexendIndex-1的片段。
  • substring(int beginIndex)返回从beginIndex到末尾的片段。

字符串转换

  • s1.toLowerCase()s1转换成小写形式,得到新串。
  • s1.toUpperCase()s1转换成大写形式,得到新串。
  • s1.trim()删除s1两端的空格,得到新串。
  • s1.replace(oldChars,newChars)用串newChars替换s1中的所有子串oldChaes,得到新串。

查找字符和字符串

  • indexOf返回字符串中字符或字符串匹配的位置,返回-1表示未找到。
"Welcome to Java".indexOf('W') returns 0.
"Welcome to Java".indexOf('x') returns -1.
"Welcome to Java".indexOf("come") returns 3.
  • indexOf还能加一个参数fromIndex,或者加两个参数beginIndex,endIndex,表示在特定的区间寻找字符/字符串。
"Welcome to Java".indexOf('o‘,5) returns 9.
"Welcome to Java".indexOf("Java", 5) returns 11.
"Welcome to Java".indexOf("java", 5) returns -1.
  • lastIndexOf从字符串末尾开始查找。
"Welcome to Java".lastIndexOf('a') returns 14.

字符数组与字符串的转换

  • 字符串到字符数组,用toCharArray
String s = "Java";
char[ ] charArray = s.toCharArray( );// charArray.length=4
  • 字符数组到字符串,用构造函数,或者静态方法valueOf
String s = new String(new char[ ] {'J','a','v','a'} ); // "Java"
String s = String.valueOf( new char[ ] {'J','a','v','a'} ); // "Java"

基本数据类型和字符串间的转换

  • valueOf方法将基本数据类型转换为字符串
String s1 = String.valueOf(1.0);  //"1.0"
String s2 = String.valueOf(true); //"true"
  • 字符串转换为基本类型:利用包装类
double d = Double.parseDouble(str);
int i = Integer.parseInt(str);
boolean b = Boolean.parseBoolean(str);

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

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

相关文章

linux部署rustdesk

1.拉取RustDesk镜像 sudo docker image pull rustdesk/rustdesk-server2.启动hbbs服务 sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --nethost rustdesk/rustdesk-server hbbs3.启动hbbr服务 sudo dock…

如何从Android恢复已删除的文件?3 种有效的方式

有时我们可能会错误地删除Android设备上的重要文件。更疯狂的是,Android手机上的文件在一夜之间消失了,我们不知道为什么。我们感到非常遗憾和恼火,但不知道。但是,此时学习如何从Android手机恢复已删除的文件为时已晚&#xff0c…

Mesa Gallium框架入门初探

Mesa Gallium框架入门初探 MESA Gallium框架 MESA源码里面有2套架构,现在驱动主要基于Gallium架构。 这里我们重点来看看Gallium架构: 经典架构 Gallium架构 Gallium展开 Gallium中主要包含下面几块: Auxiliary模块:一些公共函数或者辅助…

Word如何绘制三线表及设置磅值

插入表格, 开始 边框 边框和低温 设置磅值 先全部设置为无边框 上边 1.5 0.5 以上内容未完善,请等待作者更新

内网权限提升

打点进入内网中,权限一般为 web 服务的权限 1、什么是提权 一般一来说是低权限用户去申请高权限用户,可以是(配置不当、溢出类漏洞(历史漏洞)、本地漏洞) 2、常见用户分类 windows: 本地登录…

使用 Orange Pi AIpro开发板基于 YOLOv8 进行USB 摄像头实时目标检测

简介 官网:Orange-Pi-AIpro 算力指标与概念 TOPS是每秒数万亿或万亿次操作。它主要是衡量可实现的最大吞吐量,而不是实际吞吐量的衡量标准。大多数操作是 MAC(multiply/accumulates),因此: TOPS &#xf…

干货!渗透测试入门教程!(建议收藏)

渗透测试是指从内网、外网等网络环境中,利用各种手段对某个特定网络进行模拟攻击,目的是为了寻找可能被利用的漏洞,是企业中重要的一环、 虽然大多数人在学习后都能快速上手,但渗透测试还是有一定的门槛,今天就给大家…

HashMap在Go与Java的底层实现与区别

在Java中 在Java中hash表的底层数据结构与扩容等已经是面试集合类问题中几乎必问的点了。网上有对源码的解析已经非常详细了我们这里还是说说其底层实现。 基础架构 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,…

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统,支持电子病历四级,saas模式

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;saas模式 HIS系统就是医院信息管理系统&#xff0c;HIS系统是整个医院信息化的核心&#xff0c;门诊、住院、药房、药库等都是由HIS系统来承载起来的&#xff0c;所以…

高动态范围成像(HDRI)技术在AI去衣中的革新作用

引言&#xff1a; 在计算机视觉和图像处理领域&#xff0c;人工智能&#xff08;AI&#xff09;去衣技术是一项颇具争议但又不容忽视的技术。它不仅在娱乐和多媒体制作领域中扮演着重要角色&#xff0c;还在时尚设计与电子商务中展现了其独特的价值。随着技术的不断进步&#x…

动态规划part02 Day42

LC62不同路径 LC63不同路径II(超时10min) 超时原因分析&#xff1a;思路想错了&#xff0c;即便是正确思路初始化也有点问题&#xff0c;应该将不必要的判断逻辑引入初始化的过程中初始化&#xff1a; 从左上角到[i][0]和[0][j]都只有一条路径dp[i][0]1和dp[0][j]1引入故障&am…

探索减轻 AI 说服伤害的机制方法

随着生成式人工智能&#xff08;AI&#xff09;系统在各个领域的广泛应用&#xff0c;其说服能力也日益增强&#xff0c;引发了对 AI 说服可能带来伤害的担忧。AI 说服的伤害不仅来源于说服的结果&#xff0c;还包括说服过程中可能对个体或社会造成的不利影响。为了系统性地研究…

信息抽取模型TPLinker

1.motivation 早期传统方法首先抽取实体再抽取它们之间的关系&#xff0c;但是忽略了两个任务之间的关联。而后期采取的联合模型都存在着一个严重问题&#xff1a;训练时&#xff0c;真实值作为上下文传入训练&#xff1b;推理时&#xff0c;模型自身生成的值作为上下文传入&a…

DolphinScheduler 3.3.0版本更新一览

Apache DolphinScheduler即将迎来3.3.0版本的发布&#xff0c;届时将有一系列重要的更新和改进。在近期的社区5月份用户线上分享会上&#xff0c;项目PMC 阮文俊为大家介绍了3.3.0版本将带来的主要更新和改进&#xff0c;并为大家指出了如何参与社区的方式。 什么是DolphinSch…

企业内网终端监控管理软件有哪些?推荐4款企业终端监控管理软件

企业内网终端监控管理软件是一种专为企业内部网络设计的安全与管理工具&#xff0c;旨在帮助企业管理、监控和保护其内部网络中的各种终端设备&#xff0c;如个人电脑、笔记本、移动设备等。 这类软件的主要功能包括但不限于以下几个方面&#xff1a; 1&#xff0c;实时监控&a…

Java面试八股之start()和run()的区别

start()和run()的区别 在Java中&#xff0c;run()方法和start()方法是与线程操作紧密相关的&#xff0c;两者之间存在本质的区别&#xff1a; start()是Thread类的一个实例方法&#xff0c;它的主要作用是启动一个新的线程。当调用线程对象的start()方法时&#xff0c;Java虚…

手搓顺序表(C语言)

目录 SeqList.h SeqList.c 头插尾插复用任意位置插入 头删尾删复用任意位置删除 SLtest.c 测试示例 顺序表优劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…

Android环境下Mesa初始化流程重学习之eglInitialize

Mesa初始化流程重学习之eglInitialize 引言 说来也惭愧&#xff0c;Mesa搞了这么久了&#xff0c;每次都想深入下&#xff0c;可是每次都是浅尝辄止了。这次趁着有了一定的闲暇时间并且有了调试景嘉微显卡的机会&#xff0c;还是想重新学习下&#xff0c;深入研究下&#xff0…

MongoDB分片集群容灾方案

MongoDB分片集群容灾方案 1. 集群同步工具介绍1.1 第三方数据同步工具mongoshake1.2 官方同步工具mongosync 2. 工具对比2.1 数据一致性2.2 稳定性和可靠性2.3 维护成本 3. 总结 1. 集群同步工具介绍 最近客户咨询MongoDB分片集群市面上主流的容灾方案&#xff0c;所以抽空整理…

Node.js —— Express中服务器的创建、托管静态资源、nodemon

目录 Express的安装 创建基本的 Web 服务器 监听GET请求 监听POST请求 把内容响应给客户端 ​编辑获取 URL 中携带的查询参数 ​编辑获取 URL 中的动态参数 ​编辑托管静态资源 express.static() 托管多个静态资源目录 挂载路径前缀 nodemon: 为什么要使用 nodemon 安…