从零学Java - String类

Java String类

文章目录

  • Java String类
    • 1 String
      • 1.1 常用两种创建方式
      • 1.2 比较两种创建方式
      • 1.3 字符串不可变性
      • 1.4 面试题
    • 2 常用方法
      • 2.1 练习
    • 3 可变字符串
      • 3.1 常用方法
      • 3.2 验证StringBuilder的高效性
      • 3.3 练习
      • 3.4 面试题:
    • 4 正则表达式
      • 4.1 元字符
      • 4.2 其他字符
        • 4.2.1 预定义字符
        • 4.2.2 边界匹配
        • 4.2.3 数量
      • 4.3 正则表达式的应用
        • 4.3.1 匹配
        • 4.3.2 拆分
        • 4.3.3 获取
        • 4.3.4 替换

1 String

Java程序中的所有字符串文本(例如“abc”)都是此类的实例。
字符串字面值是常量,具有不可变性,创建之后不可改变。

1.1 常用两种创建方式

//1 直接使用字符串字面值(双引号包裹)赋值
//数据存储在常量池中
String s1 = "hello";
//2 使用构造方法赋值
//数据存储在堆中
String s2 = new String("hello");

1.2 比较两种创建方式

//常量池中数据不会重复。
String s3 = "hello";
System.out.println(s1 == s2); //比较地址
System.out.printlin(s1.equals(s2)); //比较内容
System.out.println(s1 == s3); //比较地址
res:
false
true
true

字符串字面值保存在常量池中,JDK1.7之前常量池存在方法区中,JDK1.7(包括1.7)之后移入堆中;常量池中数据不会重复。

1.3 字符串不可变性

//在常量池种重新开辟空间
//字符串具有不可变性:重新赋值时,不会改变原来的数据,而是重新开辟空间
s3 = "zhangsan"
System.out.println(s3);
System.out.println(s1);
res:
zhangsan
hello

内存存储方式:

在这里插入图片描述

1.4 面试题

eg:

String name = new String(“lisi”)   // 该语句在内存中创建了几个对象

res:

两个, 常量池一个, 堆中一个

2 常用方法

eg:

String s1 = "Java是世界上最好的语言,Java第一,Java真牛";
  • public char charAt(int index):根据下标获取字符。

    //1 charAt(); 返回指定位置上的字符
    char first = s1.charAt(0);
    char last = s1.charAt(s1.length() - 1);
    System.out.println(first);
    System.out.println(last);
    
  • public boolean contains(String str):判断当前字符串中是否包含str。

    //2 contains(String str):判断当前字符串中是否包含str。
    boolean b = s1.contains("java");
    System.out.println(b);
    
  • public char[] toCharArray():将字符串转换成字符数组。

    //3 toCharArray(); 返回字符串的字符数组
    char[] charArray = s1.toCharArray();
    System.out.println(charArray.length);
    
  • public int indexOf(String str):查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1。

    //4 indexOf(); 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1。
    int i = s1.indexOf("Java");
    int i1 = s1.indexOf("Java",4);
    System.out.println(i);
    System.out.println(i1);
    
    //需求:输出字符串中出现Java的位置
    int p = 0;
    while ((p=s1.indexOf("Java",p))!=-1) {System.out.println("位置:"+p);p+=4;
    }
    
  • public int length():返回字符串的长度。

    //5 length(); 返回字符串的长度
    System.out.println(s1.length());
    
  • public String trim():去掉字符串前后的空格。

    //6 trim():去掉字符串前后的空格。
    String s1 = "    Java是世界上最好的语言,        Java第一,     Java真牛          ";
    System.out.println(s1.trim());
    
  • public String toUpperCase():将小写转成大写。

    //7 toUpperCase():将小写转成大写。toLowerCase():将大写转成小写。
    String s2 = "Hello";
    System.out.println(s2.toUpperCase());
    System.out.println(s2.toLowerCase());
    
  • public boolean endsWith(String str):判断字符串是否以str结尾。

    /* 8 endsWith(String str):判断字符串是否以str结尾startsWith(String str):判断字符串是否以str开头
    */
    String s3 = "hello.java";
    System.out.println(s3.endsWith("java"));
    System.out.println(s3.startsWith("hello"));
    
  • public String replace(char oldChar,char newChar):将旧字符串替换成新字符串

    //9 replace(char oldChar,char newChar):将旧字符串替换成新字符串
    System.out.println(s1.replace("Java", "java"));
    
  • public String[] split(String str):根据str做拆分。

     //10 split(String str):根据str做拆分//以逗号或空格拆分,  + 表示前面的逗号或空格可以出行1次或多次String[] strings = s1.split("[, ]+");System.out.println(strings.length);for (String s : strings) {System.out.println(s);}
    
  • public String substring(int beginIndex,int endIndex):在字符串中截取出一个子字符串

    //11 substring(int beginIndex,int endIndex):在字符串中截取出一个子字符串
    String s4 = "Java是世界上最好的语言,Java第一,Java真牛";
    String substring = s4.substring(0, 4);
    String substring1 = s4.substring(s4.length() - 6);
    System.out.println(substring);
    System.out.println(substring1);
    
  • public int compareTo(String anotherString) :比较两个字符串的大小(字符表位置,或长度)

    //12 compareTo() 比较两个字符串的大小(字符表位置,或长度)
    String s5 = "abc"; //97
    String s6 = "xyz"; //120
    System.out.println(s5.compareTo(s6));
    //如果一个字符串是另一个字符串的前缀, 比较长度
    String s7 = "abcxyz";
    System.out.println(s5.compareTo(s7));
    
  • public boolean equals(Object anObject): 比较字符串是否相同

    System.out.println(s5.equals(s6));
    
  • public native String intern() :

    判断常量池是否包含此数据 
    如果有, 直接返回常量池中的地址
    如果没有, 复制一份地址放入常量池, 然后返回这个地址
    

2.1 练习

eg:

需求:已知String str = "this is a text";
将str中的单词单独获取出来
将str中的text替换为practice
在text前面插入一个easy
将每个单词的首字母改为大写

res:

/*** @author 胡昊龙* @version 1.0* @description: TODO 需求:已知String str = "this is a text";*                    将str中的单词单独获取出来*                    将str中的text替换为practice*                    在text前面插入一个easy*                    将每个单词的首字母改为大写* @date 2024/1/8 11:24*/
public class TestString04 {public static void main(String[] args) {String str = "this is a text";//将str中的单词单独获取出来String[] split = str.split(" ");for (String s : split) {System.out.println(s);}//将str中的text替换为practiceString replace = str.replace("text", "practice");System.out.println(replace);//在text前面插入一个easyString replace1 = str.replace("text", "easy text");System.out.println(replace1);//将每个单词的首字母改为大写for (String s : split) {
/*方法一:String first = s.substring(0, 1);first = first.toUpperCase();
*///方法二char first = s.charAt(0);first = Character.toUpperCase(first);//拼接s=first+s.substring(1);System.out.println(s);}}
}

3 可变字符串

概念:可在内存中创建可变的缓冲空间,存储频繁改变的字符串。

优点:执行效率高于String。

StringBuilder:JDK5.0提供,运行效率快、线程不安全。(单)

StringBuffer:JDK1.0提供,运行效率慢、线程安全。(多)

3.1 常用方法

创建可变字符串对象

StringBuilder builder = new StringBuilder();
  • append(String str)

  • //1 append(); 追加内容
    builder.append("java第一");
    builder.append("java真牛");
    System.out.println(builder);
    
  • insert(String str)

  • //2 insert(); 插入内容
    builder.insert(0,"java是世界上最好的语言");
    System.out.println(builder);
    
  • replace()

  • //3 replace(); 替换内容
    builder.replace(0,4,"JAVA");
    System.out.println(builder);
    
  • reverse()

  • //4 reverse(); 反转内容
    builder.reverse();
    System.out.println(builder);
    
  • delete()

  • //5 delete(); 删除内容
    builder.delete(0,4);
    builder.delete(0, builder.length());// 清空内容
    

3.2 验证StringBuilder的高效性

eg:

用两种方式运行同一种操作, 比较所消耗时间
/*** @author 胡昊龙* @version 1.0* @description: TODO* @date 2024/1/8 14:46*/
public class StringB2 {public static void main(String[] args) {//验证StringBuilder的效率String s = "";long start = System.currentTimeMillis();for (int i = 0; i < 50000; i++) {s+=i;}long end = System.currentTimeMillis();System.out.println("用时: "+(end-start));System.out.println("=======================================");StringBuilder builder = new StringBuilder();long start1 = System.currentTimeMillis();for (int i = 0; i < 50000; i++) {builder.append(i);}long end1 = System.currentTimeMillis();System.out.println("用时: "+(end1-start1));}
}

res:

用时: 6438
==============
用时: 2

3.3 练习

把“18987425.99”转成“18,987,425.99”

public class StringB3 {public static void main(String[] args) {String s = "18987425.99";StringBuilder num = new StringBuilder(s);int pos = num.indexOf(".");for (int i = pos-3; i >0 ; i-=3) {num.insert(i,",");}System.out.println(num);}
}

3.4 面试题:

请说出代码的运行结果?

在这里插入图片描述

第一题图解:

第二题图解:

在这里插入图片描述

如果将图2中的s4和s5换一下位置, 运行结果是?

在这里插入图片描述

4 正则表达式

概念: 正则表达式就是一个验证字符串格式是否满足要求的字符串,使用一个字符串匹配一组字符串,这个字符串就是正则表达式。

正则表达式的用途

  • 匹配 拆分 获取 替换

4.1 元字符

概念: 正则表达式中通常包含一些具有特殊含义的字符。

字符解释
a匹配字符****a
[abc]匹配 a或b或c
[^abc]任何字符,除了 a、b 或 c(否定)
[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]d、e 或 f(交集)
[a-z&&[ ^bc]]a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[ ^m-p]]a 到 z,而非 m 到 p:[a-lq-z](减去)

4.2 其他字符

4.2.1 预定义字符
字符解释
.任意字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\w单****个字符:[a-zA-Z_0-9]
4.2.2 边界匹配
字符解释
^表示行开始
$表示行结束
4.2.3 数量
字符解释
X?一次或0次
X*0次或多次(包括1次)
X+一次或多次
X{n}恰好n次
X{n, }至少n次
X{n,m}至少n次,不超过m次

4.3 正则表达式的应用

正则表达式大全

4.3.1 匹配
//1 匹配
//手机号
String reg = "^1[35789][0-9]{9}$";
String phone = "11632145345";
System.out.println(phone.matches(reg));//创建模式对象
Pattern p = Pattern.compile("^1[35789][0-9]{9}$");
//获取匹配器
Matcher m = p.matcher("16632145345");
//调用匹配器的matcher()
boolean b = m.matches();
System.out.println(b);//qq邮箱
String reg2 = "^[1-9][0-9]{4,9}@[qQ]{2}.[cC][oO][Mm]$";
String qq = "14312354@Qq.com";
System.out.println(qq.matches(reg2));
4.3.2 拆分
//2 拆分
String s = "this is a text";
/*一个符号用双引号包裹即可多个符号先用双引号再用中括号包裹+ 表示前面的符号可以出行1次或多次
*/
String[] arr = s.split("[ .]+");
System.out.println(arr.length);
for (String string : arr) {System.out.println(string);
}
4.3.3 获取
//3 获取
String s1 = "Java是世界上最好的语言,java第一,Java真牛";
//需求: 获取字符串中的 Java 字符 (不区分大小写)
Pattern p1 = Pattern.compile("[jJ]ava");
Matcher m1 = p1.matcher(s1);
//find(); 找到则返回true, 没有找到则返回false
while (m1.find()) {//group(); 返回找到的数据System.out.println(m1.group());
}
4.3.4 替换
//4 替换
String s2 = s1.replaceAll("[jJ]ava", "JAVA");
System.out.println(s2);Pattern p3 = Pattern.compile("[jJ]AVA");
Matcher m3 = p3.matcher(s2);
String s3 = m3.replaceAll("Python");
System.out.println(s3);

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

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

相关文章

基于Tosca和Terraform的多云资源编排探索

01 导言 随着企业采用多云战略和迁移到云平台&#xff0c;需要依赖不同的云资源来支持业务系统。传统的手动开通和配置资源关联关系的方法在多云环境下变得耗时且复杂&#xff0c;给运维带来困难。 为了应对多云环境中基础设施管理的复杂性&#xff0c;寻找一种高效的多云资源编…

mysql索引失效的情况

目录 1破坏最左前缀法则2在索引列上做任何计算、函数操作&#xff0c;会导致索引失效而转向全表扫描。3存储引擎不能使用索引中范围条件右边的列4Mysql在使用不等于时无法使用索引会导致全表查询5is null可以使用索引&#xff0c;但是is not null无法使用索引6like以通配符开头…

Packet Tracer - Configure AAA Authentication on Cisco Routers

Packet Tracer - 在思科路由器上配置 AAA 认证 地址表 目标 在R1上配置本地用户账户&#xff0c;并使用本地AAA进行控制台和vty线路的身份验证。从R1控制台和PC-A客户端验证本地AAA身份验证功能。配置基于服务器的AAA身份验证&#xff0c;采用TACACS协议。从PC-B客户端验证基…

软件测试|测试平台开发-Flask入门:Flask动态路由

前言 之前我们介绍了flask发送http请求&#xff0c;以及flaskURL的详解&#xff0c;我们使用的路由都是固定的&#xff0c;一个路径和一个视图函数绑定&#xff0c;当访问这条路径时会触发相应的处理函数。但是当我们要处理更为复杂的情况时&#xff0c;比如我们有多个用户&am…

Mybatis面经

Mybatis &#x1f4d1;前言 本文主要是【Mybatis】——Mybatis面经的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每…

【书生·浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记

《基于 InternLM 和 LangChain 搭建你的知识库》 常见术语 RAG: Retrieval Augmented Generation&#xff0c;检索增强生成 1. 大模型开发范式 1.1 RAG VS Finetune RAGFinetune低成本可个性化微调可实时更新知识覆盖面广受基座模型影响大成本高昂单次回答知识有限无法实时…

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

代码随想录二刷 |二叉树 | 验证二叉搜索树

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 验证二叉搜索树 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 98.验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子…

Eureka的自我保护机制

一&#xff1a;Eureka的自我保护机制是什么&#xff1f; 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不…

关于电脑屏幕亮度的调整,看这篇文章就够了

你可能需要定期更改屏幕亮度。当外面很亮的时候,你想把它调大,这样你就能看到。当你在黑暗的房间里时,你会希望它变暗,这样就不会伤害你的眼睛。降低屏幕亮度也有助于节省电力并延长笔记本电脑的电池寿命。 除了手动更改屏幕亮度外,Windows还可以通过多种方式自动更改屏幕…

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm)

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm) 常见的归一化操作有&#xff1a;批量归一化&#xff08;Batch Normalization&#xff09;、层归一化&#xff08;Layer Normalization&#xff09;、实例归一化&#xff08;Instance Normaliza…

【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 生命周期 1.1. 认识生命周期 很多的事物都有从创建到销毁的整个过程&#xff0c;这个过程称之为是生命周期&…

案例分析——如何优化跨境直播网络

跨境直播 风口已至 这些年越来越多商家加入直播带货行列&#xff0c;各种玩法日渐成熟。而TikTok作为当前国外最火爆的直播平台&#xff0c;不少卖家都会定期做TikTok直播引流&#xff0c;但时常会面临着远程访问导致直播画面模糊、卡顿掉线、延迟高&#xff0c;甚至可能限流黑…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

OpenHarmony内存泄漏指南 - 解决问题(综合)

本系列文章旨在提供定位与解决OpenHarmony应用与子系统内存泄露的常见手段与思路&#xff0c;将会分成几个部分来讲解。首先我们需要掌握发现内存泄漏问题的工具与方法&#xff0c;以及判断是否可能存在泄漏。接着需要掌握定位泄漏问题的工具&#xff0c;以及抓取trace、分析tr…

Golang : Bson\Json互转

代码 package bson_jsonimport ("encoding/json""errors""fmt""gopkg.in/mgo.v2/bson""os""testing" )type User struct {Name string json:"name,omitempty" bson:"name,omitempty"CSD…

静态网页设计——天行九歌(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1de411m7y4/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

java回溯算法、最短路径算法、最小生成树算法

回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。 最短路径算法 从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中…

高通开发系列 - toolchain交叉编译器编译kernel以及生成boot镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景概述分析过程generate_defconfig.sh脚本环境准备合并其他几个配置文件开始编译生成dtb镜像

Python-PyQt5树莓派上位机

Python-PyQt5树莓派上位机 一个使用PythonQT设计的树莓派的上位机&#xff0c;功能大概如下 1.笔记本电脑与树莓派的通讯是否成功显示&#xff08;给个信号显示判断是否通讯成功&#xff09;&#xff1b; 2.阈值的设置显示&#xff1b; 3.图像成像的显示&#xff1b; 4.是否发生…