Java String类(1)
String类的重要性
我们之前在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据的方法分离开的方式不符合面向对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。
而且在现在的开发和校招笔试中,String类更是举足轻重,所以今天就让我们看看String类。
常用方法
字符串构造
String类中提供的构造方式非常多,常用的就有以下三种:
public static void main(String[] args) {//使用常量字符串构造String s1 = "hello world";System.out.println(s1);//直接newString对象String s2 = new String("hello world");System.out.println(s2);//使用字符数组进行构造char[] array = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};String s3 = new String(array);System.out.println(s3);}
注意:
1.String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类的实例变量如下:

我们可以看出:String主要有两个成员:value[ ], hash.
hash:在 Java 中,
String类中的hash是通过hashCode()方法计算的,而hashCode()方法是根据字符串的内容计算得到的。当你调用hashCode()方法时,实际上是根据字符串的字符内容来计算一个哈希码值。一般hash默认为0value[ ]:在 Java 中,
String类中的value[]是一个字符数组,它存储了字符串的字符内容。每个String对象都有一个value[]数组来存储字符串的字符,这个数组是private final char[]类型的。
public static void main(String[] args) {//s1和s2引用的是不同的对象 s1和s3引用的是不同对象String s1 = new String("hello");String s2 = new String("world");String s3 = s1;String s4 = "";//表明指向的对象是空的String s5 = null;//表明不指向任何对象System.out.println(s1.length());//获取字符串的长度-输出5//isEmpyt():检查字符串是否是空,如果是空返回true,不是空返回falseSystem.out.println(s1.isEmpty());//falseSystem.out.println(s4.isEmpty());//trueSystem.out.println(s5.isEmpty());//空指针异常}
2.在Java中,用""引起来的也是String类型的对象。
String对象的比较
字符串的比较也是常见的操作之一,比如:字符串排序。Java中共提供了4种方式:
1.==比较是否引用的是同一对象。
注意:对于内置类型(int等基础类型等),==比较的是变量中的值;对于引用类型,==比较的是引用中的地址。
public static void main(String[] args) {int a = 10;int b = 20;int c = 10;//对于基本类型变量,==比较的是两个变量中存储的值是否相同System.out.println(a == b);//falseSystem.out.println(a == c);//true//对于引用类型变量,==比较的是两个引用变量引用的是否为同一个对象String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("world");String s4 = s1;System.out.println(s1 == s2);//falseSystem.out.println(s2 == s3);//falseSystem.out.println(s1 == s4);//true}
2.boolean equals(Object anObject)方法:按照字典序比较
字典序:字符大小的顺序
String类重写了父类Object中的equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较:比如s1.equals(s2)
public boolean equals(Object anObject) {// 1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回trueif (this == anObject) {return true;} // 2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回falseif (anObject instanceof String) {// 将anObject向下转型为String类型对象String anotherString = (String)anObject;int n = value.length;// 3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回falseif (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;// 4. 按照字典序,从前往后逐个字符进行比较while (n-- != 0) {if (v1[i] != v2[i])return false;i++;} return true;}} return false;
}
举个使用的例子:
public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("Hello");//s1,s2,s3引用的是三个不同的对象,因此==比较全部为falseSystem.out.println(s1 == s2);//falseSystem.out.println(s1 == s3);//false//equals比较:String对象中的逐个字符//虽然s1和s2引用的是不同的对象,但是两个对象中放置的内容相同//s1和s3引用的是不同的对象,而且两个对象中的内容也不同System.out.println(s1.equals(s2));//trueSystem.out.println(s1.equals(s3));//false}
3.int compareTo(String s)方法:按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
1.先按字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2.如果前k个字符相等(k为两个字符长度最小值),返回值为两个字符串的差值
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2));//不同输出字符差值-1System.out.println(s1.compareTo(s3));//相同输出0System.out.println(s1.compareTo(s4));//前k个字符完全相同,返回长度差值-3}
4.int compareTolgnoreCase(String str)方法:与compareTo方式相同,但是忽略大小写比较
字符串查找
字符串查找也是字符串中非常常见的操作,String类提供常用查找方法:
| 方法 | 功能 |
| char charAt(int index) | 返回index位置上的字符,如果index负数或者越界,抛出 IndexOutOfBoundsException异常 |
| int indexOf(int ch) | 返回ch第一次出现的位置,没有则返回-1 |
| int indexOf(int ch, int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置 |
| int IndexOf(String str) | 返回str第一次出现的位置,没有则返回-1 |
| int IndexOf(String str, int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
| int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
| int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
| int lastIndexOf(int ch, int fromIndex) | 从fromIndex位置开始从后往前找ch第一次出现的位置,没有返回-1 |
| int lastIndexOf(String str,int fromIndex) | 从fromIndex位置开始从后往前找str第一次出现的位置,没有返回-1 |
下面以一段字符串来举个例子:
public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3));//'bSystem.out.println(s.indexOf('d'));//-1System.out.println(s.indexOf('c'));//6System.out.println(s.indexOf('c', 10));//15System.out.println(s.indexOf("bbb"));//3System.out.println(s.indexOf("bbb", 10));//12System.out.println(s.lastIndexOf('c'));//17System.out.println(s.lastIndexOf('c', 10));//8System.out.println(s.lastIndexOf("bbb"));//12System.out.println(s.lastIndexOf("bbb", 10));//3}
转化
1.数值和字符串的转化
public static void main(String[] args) {//数值转字符串String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);String s3 = String.valueOf(true);String s4 = String.valueOf(new Student("zhangsan", 18));//打印System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);//打印的是对象名@哈希码System.out.println("======================");//字符串转数字//注意:Integer,Double等是Java的包装类型,这个后面会讲int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);}
2.大小写转换
public static void main(String[] args) {String s1 = "hello";String s2 = "HELLO";//注意:不是在原来的基础上转变,转变之后是一个新的对象//小写转大写System.out.println(s1.toUpperCase());//HELLOSystem.out.println(s2.toLowerCase());//hello}
3.字符串转数组
public static void main(String[] args) {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);}
4.格式化
public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9, 14);System.out.println(s);}
字符串的替换
使用一个新的字符串替换掉已有字符串的数据,可用的方法如下:
| 方法 | 功能 |
| String replaceAll(String regex, String replacement) | 替换掉所有的指定内容 |
| String replaceFirst(String regex, String replacement) | 替换首个内容 |
| String replace(String target, String replacement) | 将所有目标字符串替换为指定字符串 |
| String replace(char oldChar, char newChar) | 将所有旧字符替换为新字符 |
注意事项:由于字符串是不可变对象,替换不更改当前字符串,而是产生一个新的字符串
相关文章:
Java String类(1)
String类的重要性 我们之前在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据的方法分离开的方式不符合面向对象的思想&…...
渗透测试漏洞原理之---【CSRF跨站请求伪造】
文章目录 1、CSRF概述1.1、基本原理1.1.1、基本概念1.1.2、关键点1.1.3、目标 1.2、CSRF场景1.2.1、银行支付转账1.2.2构造虚假网站1.2.3、场景建模 1.3、CSRF类别1.3.1、POST方式 1.4、CSRF验证1.4.1、CSRF PoC Generator 2、CSRF攻防2.1、CSRF实战2.1.1、与XSS 漏洞相结合 2.…...
带量采购药品数据查询集采分析平台(建议收藏!)
药品集采常态化下对不同中标企业的影响不尽相同,对于市场份额较大且拥有多款重要药品的大型企业来说,集采能够保持其市场份额,尽管被集采的药品可能会面临销售下降的局面,但该企业还有其他产品可以填补,整体影响不大。…...
概念解析 | 无线感知的新篇章:异构网络感知的原理与挑战
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:异构网络感知。 无线感知的新篇章:异构网络感知的原理与挑战 Interference Management in HetNets 在当今的无线通信领域,我们面临着一个重大的挑战:如何在有限的频谱资源…...
【大数据模型】让chatgpt为开发增速(开发专用提示词)
汝之观览,吾之幸也!本文主要聊聊怎样才能更好的使用提示词,给开发提速,大大缩减我们的开发时间,比如在开发中使用生成表结构脚本的提示词,生成代码的提示词等等。 一、准备 本文主要根据Claude进行演示&am…...
读书笔记-《ON JAVA 中文版》-摘要23[第二十章 泛型-2]
文章目录 第二十章 泛型5. 泛型擦除5.1 泛型擦除5.2 迁移兼容性5.3 擦除的问题5.4 边界处的动作 6. 补偿擦除7. 边界8. 通配符8.1 通配符8.2 逆变 9. 问题10. 动态类型安全11. 泛型异常 第二十章 泛型 普通的类和方法只能使用特定的类型:基本数据类型或类类型。如果…...
【爬虫】5.6 Selenium等待HTML元素
目录 任务目标 创建Ajax网站 创建服务器程序 Selenium XX 等待 1. Selenium强制等待 2. Selenium隐性等待 3. Selenium循环等待 4. Selenium显示等待 等待方法 任务目标 在浏览器加载网页的过程中,网页的有些元素时常会有延迟的现象,在HTML元素…...
0102阿里云配置3台ECS服务器-大数据学习
文章目录 1 前言1 配置VPC和子网2 创建安全组3 创建云服务器ECS3.1 规划配置3.2 配置 4 xshell连接服务器5 配置基础环境5.1 主机名映射5.2 ssh免密登录5.3 jdk 6 问题集6.1 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).6.2 用tar解压文件出现错误Not found i…...
android 输入法demo
背景: 一个简单的android输入法demo,支持输入png、gif,jpeg、webp等格式。 此示例演示如何编写一个应用程序,该应用程序接受使用 Commit Content API 从键盘发送的丰富内容(例如图像)。 用户通常希望通过表…...
【经验分享】Markdown中如何显示空格和回车
Markdown中如何显示空格和回车 空格 利用html中的空格实体引用: eg: 这是一些 额外的空格。回车: 方法一:在你想要回车的地方连续按两次回车键 方法二:使用<br>标签 eg: 我想显示<br>…...
深入篇【C++】set和map(multiset/multimap)特性总结与使用
深入篇【C】set和map(multiset/multimap)特性总结与使用 一.set/multiset总结二.map/multiset总结三.set/map应用 一.set/multiset总结 set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每…...
OpenAI推出ChatGPT企业版,提供更高安全和隐私保障
🦉 AI新闻 🚀 OpenAI推出ChatGPT企业版,提供更高安全和隐私保障 摘要:OpenAI发布了面向企业用户的ChatGPT企业版,用户可以无限制地访问强大的GPT-4模型,进行更深入的数据分析,并且拥有完全控制…...
Linux虚拟机磁盘扩容
Linux虚拟机磁盘扩容 问题起源 在使用linux系统开发时遇到文件无法创建的问题,根据提示发现是磁盘空间不足。 使用df -h查看具体磁盘使用情况。 针对这个问题,有两种解决方案: 使用du -sh ./*可以查看当前工作目录下各文件的占用空间大小…...
【Go 基础篇】Go语言结构体实例的创建详解
在Go语言中,结构体是一种强大的数据类型,允许我们定义自己的复杂数据结构。通过结构体,我们可以将不同类型的数据字段组合成一个单一的实例,从而更好地组织和管理数据。然而,在创建结构体实例时,有一些注意…...
服务器上使用screen的学习记录
服务器上使用screen 训练模型的时候,花费时间是很长的,不可能一直挂在桌面上。所以就想到用screen了。 记录一下简单的操作指令。 创建screen screen -S roof # 新建一个名字为name的窗口,并进入到该窗口中进入后打开环境,运…...
基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集
目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境node.js前端环境MySQL数据库 模块实现1. 数据预处理2. 热度值计算3. 相似度计算1)新闻分词处理2)计算相似度 4. 新闻统计5. API接口开发6. 前端界面实现1)运行逻辑2࿰…...
2001-2022年全国各区县最低工资数据
2001-2022年全国各区县最低工资数据 1、时间:2001-2022年 2、来源:人社部 3、指标:年份、行政区划代码、地区、所属省份、所属城市、经度、纬度、最低工资-每月、最低工资-小时 4、样本量:5.5万条 5、指标解释:最低工资标准是…...
D357周赛复盘:模拟双端队列反转⭐⭐+贪心
文章目录 2810.故障键盘1.直接用reverse解决2.双端队列 2811.判断能否拆分数组(比较巧妙的贪心)思路完整版 2812.找出最安全路径2810.故障键盘1.直接用reverse解决2.双端队列 2811.判断能否拆分数组(比较巧妙的贪心)思路完整版 28…...
大数据项目实战(安装Hive)
一,搭建大数据集群环境 1.3 安装Hive 1.3.1 Hive的安装 1.安装MySQL服务 1)检查是否安装MySQL,如安装将其卸载。卸载命令 rpm -qa | grep mysql 2)搜索MySQL文件夹,如存在则删除 find / -name mysql rm -rf /etc/s…...
跨屏无界 | ZlongGames 携手 Google Play Games 打造无缝游戏体验
一款经典游戏,会在时间的沉淀中被每一代玩家所怀念,经久不衰。对于紫龙游戏来讲,他们就是这样一群怀揣着创作出经典游戏的初心而聚集在一起的团队,致力于研发出被广大玩家喜爱的作品。 从 2015 年团队成立,到 2019 年走…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
