Java------String类和正则表达式

news2024/11/20 10:35:07

String在设计时被定义成了final类(最终类),所以不能定义String类的子类,String用来表示字符串常量,是引用数据类型,一旦String类对象的字符序列被定义,那么这个字符序列的值是不能再变化的。

创建String类的对象和创建普通类的对象一样,都要经历对象定义与创建两个步骤,主要有以下4种方式来创建String类的对象。

1:通过字符串常量的方式来创建:

该方式是通过英文半角双引号括起来的字符序列(字符串常量)来创建String对象。

例如:

String str1="我爱中国"//字符串常量的方式创建String类对象
String str2="I love Java";//字符串常量的方式创建String类对象

2:通过String类的构造方法来创建

String类提供了多个重要的构造方法:

在这里插入图片描述

举例:

String s1="I love Java";
String s2=new String (s1);//创建String对象,值与s1的值相同
String s3=new String();//创建String对象s3,表示空字符(不包括任何字符)
char String(StringBuffer sb)
String s4=new String(chars);//创建String对象s4,值是字符数组chars中的字符序列

3:通过String类的静态方法value()方法来创建:

该方式主要是通过String类的多个重载的valueOf方法,将基本数据类型和指定对象的数据转换成String类的对象,valueOf()方法的重载方式:

在这里插入图片描述

4:通过连接操作符(+)来创建:

当连接操作符(+)两侧的操作数均为字符串对象且都不为null时,将左右两边字符串对象的值拼接在一起形成一个新的字符串对象,如果一侧不是String类的对象,那么会将该对象转换成字符串对象再进行拼接。

举例:

public class Test {
    public static void main(String[]args){
        String s1=String.valueOf(99.5);//将浮点数99.5转换为字符串99.5
        String s2="abc";
        System.out.println(s1+s2);//将字符串s1和s2进行拼接
    }
}

输出:

99.5abc

String常用方法:

关于Java中常用的方法有很多,这里我们只展示部分的方法:

import java.util.Locale;

public class Test {
    public static void main(String[]args){
        String str="Hello Java";
        String str1="Hello Xysf";
        String str2="Hello fysf";
        char c= str.charAt(2);//检索字符串中的某个字符
        System.out.println(c);
        int i=str.compareTo(str1);//比较两个字符串
        System.out.println(i);
        int x=str.compareToIgnoreCase(str2);//比较两个字符串--不区分大小写
        System.out.println(x);
        char[] arr=str.toCharArray();//将字符串对象转换为字符数组
        for(int j=0;j<arr.length;j++){
            System.out.print(arr[j]);
        }
        System.out.println("\n");
        String string=str.concat(str2);//将两个字符串进行拼接
        System.out.println(string);
        boolean s=str.isEmpty();//当字符串长度为0时,返回true
        System.out.println(s);
        boolean S=str.startsWith("a");//判断该字符串是否以某字符串为前缀开头
        System.out.println(S);
        boolean a=str.endsWith("va");//判断该字符串是否以某字符串为后缀结束
        System.out.println(a);
        String A=str.toLowerCase();//将字符串中的大写都转变为小写并且返回新串
        System.out.println(A);
        String b=str1.toUpperCase();//将字符串中的小写都转变为大写并且返回新串
        System.out.println(b);
        Boolean B=str1.equals(str);//判断字符串的值是否相等
        System.out.println(B);
        Boolean C=str.equalsIgnoreCase(str1);//判断字符串的值是否相等---忽略大小写
        System.out.println(C);
    }
}

输出:

l
-14
4
Hello Java

Hello JavaHello fysf
false
false
true
hello java
HELLO XYSF
false
false

在学习String对象池之前,我们先来学习:

Java对于对象的内存分配:

Java语言把内存分为:栈内存和堆内存在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量分配的内存空间。

堆内存是用来存放由new运算符创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理,在堆中创建了一个对象或数组后,同时在栈中定义一个特殊的变量,让栈中的这个变量的取值等于对象或数组在堆内存中的首地址。

栈内存中进行分配栈中的这个变量就成了对象或数组的引用变量,引用变量实际上保存的是对象或数组在堆内存中的首地址,以后就可以在程序中使用栈的引用变量来访问堆中的对象或者是数组,引用变量就相当于为对象或数组起一个名称,引用变量是普通的变量,定义时在栈内存中进行分配,引用变量在程勋运行到其作用域之外后被释放,而对象或数组本身在堆内存中分配,即使程序运行到使用new运算符创建对象或数组的语句所在代码块之外,对象或数组本身所占据的内存也不会被释放,对象和数组在没有引用变量指向它时会变成垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器回收(释放掉),这也是Java比较占内存的原因。

Java中有一个特殊的引用变量null,如果将一个引用变量赋值为null,则表示该引用变量不引用(不指向)任何对象。

除了基本类型之外的类型都是引用类型。

String对象池:

String类型的对象是Java应用中使用率非常高的,我们在程序编写的过程中主要关心的是String对象的值,为了避免频繁的创建与销毁String对象,JVM为了提升性能和减少内存开销,在内存中维护了一段特殊的空间称为字符串对象池。

public class sunday {
    public static void main(String[]args){
        //采用字符串常量的方式创建对象
        String str="我爱中国";
        String str1="我爱中国";
        System.out.println("str和str1指向同一段内存空间?"+(str==str1));
        //采用构造方法创建字符串对象
        String str2=new String("abcd");
        String str3=new String("abcd");
        System.out.println("str2和str3指向同一段内存空间?"+(str2==str3));
        System.out.println("str和str2内容相同吗?"+(str.equals(str2)));
    }
}

输出:

str和str1指向同一段内存空间?true
str2和str3指向同一段内存空间?false
str和str2内容相同吗?false

看到这样的输出结果,相信不少小伙伴会产生这样的疑问,在两两内容相同的情况下,为什么str和str1指向的内存空间是同一个,但str2和str3指向的内存空间却不是同一个?

原因是:因为创建方式的不同,str和str1采用字符串常量的方式创建对象,在创建str时,由于字符串对象池还没有字符串常量“我爱中国”,所以会在字符串对象中创建"我爱中国”,然后将它的地址赋给str,当创建str1时,由于“我爱中国”已经在对象池存在,所以不会再创建该内容的字符串对象,而是直接将地址赋值给str1,因此,他两所指向的内存空间相同。

而对于str2和str3采用的是构造方法的方式创建字符串对象new关键字会在堆内存开辟空间,str2和str3指向两段不同的堆内存地址。

注意:字符串对象池只对字符串常量的方式创建字符串对象适用。

StringBuffer:

StringBuffer与String相似,他们都可以存储和操作字符串,即包含多个字符的字符串数据,但是String类是字符串常量,是不可更改的常量,而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

StringBuffer只能通过构造方法创建对象。

举例:

StringBuffer str4=new StringBuffer();//建立空的字符串对象
StringBuffer str6=new StringBuffer(4);//建立长度为4的字符串对象
StringBuffer str7=new StringBuffer("Hello");//建立一个初始值为Hello的字符串对象

StringBuffer和StringBuilder的比较:

StringBuffer类和StringBuilder类表示的是字符串变量(可以理解为字符串换缓冲区),也就是说字符串对象被创建后可以改变自身的内容而不用重新创造字符串对象。StringBuffer和StringBuilder这两个类的用法几乎一致,只不过前者是线程安全的,可用在多线程环境中,后者不是线程安全的,常用在单线程环境中。

StringBuffer对象的创建:

StringBuffer类的对象只能通过构造方法的形式来创建,常用的构造方法有以下几种:
在这里插入图片描述

StringBuffer的常用方法:

在这里插入图片描述部分使用方法举例:

package Employee;
public class sunday {
    public static void main(String[]args){
       StringBuffer str4=new StringBuffer("hello,Java!");
       String str="嗨,Java";
       System.out.println(str4.append("我是小明"));//字符串追加
       System.out.println(str4.insert(4,"_"));//字符插入
       System.out.println(str4.reverse());//字符反转
    }
}

输出:

hello,Java!我是小明
hell_o,Java!我是小明
明小是我!avaJ,o_lleh

注意:

如果对字符串需要进行频繁地修改操作,建议使用StringBuffer或StringBuilder类,若对字符串需要进行频繁地检索操作,建议使用String类。

正则表达式:

正则表达式是一种文本模式,包括普通字符(例如,a到z的字母)和特殊字符(称为“元字符”)正则表达式使用单个字符串来描述,匹配一系列匹配到某个句法规则的字符串,它通常用于判断语句

其常用场合有以下三种:

<1>测试字符串的某个模式,例如,可以对一个输入字符串进行测试,看在字符串是否存在一个电话号码模式或一个信用卡号码模式,这称为数据有效性验证

<2>替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

<3>根据模式匹配从字符串中提取一个子字符串,可以用来在文本或输入字段中查找特定文字

正则表达式中元字符及其意义:

在这里插入图片描述注意:

在正则表达式中,“.”代表任何一个字符,因此在正则表达式中,如果我们需要普通意义的".“,则我们需要转义字符”".

在正则表达式中,我们也可以使用方括号括起来若干个字符来表示一个元字符,这个元字符可以代表括号中的任意一个字符,例如:regex=“[ab]5”,这样一来,a5,b5都是和正则表达式匹配的字符串。

方括号元字符的常见格式,如下所示:

在这里插入图片描述同样的,在正则表达式中,我们也可以使用限定修饰符来限定元字符出现的个数

限定修饰符的用法如下图所示:

在这里插入图片描述
举例:

package Employee;
import java.util.Scanner;
public class sunday {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入手机号码:");
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        String regex1 = "1[38]\\D{5,9}";//定义手机号码规则:13/18开头,余下的部分必须为非数字且长度不能小于5,不能大于9
        String regex2 = "1[38]\\d{5,9}";//定义手机号码规则:13/18开头,余下的部分必须为数字且长度不能小于5,不能大于9
        boolean flag1 = s1.matches(regex1);//判断功能
        boolean flag2 = s2.matches(regex2);//判断功能
        System.out.println("flag:"+flag1);
        System.out.println("flag:"+flag2);
    }
}

输出:

请输入手机号码:
13uhnbgdyts
13890765435
flag:true
flag:true

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

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

相关文章

今年十八,喜欢SQL注入

#1024程序员节&#xff5c;用代码&#xff0c;改变世界# 前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;被吉师散养的职业混子 &#x1fad2;每日emo&#xff1a;怀揣…

牛客竞赛每日俩题 - Day5

DP贪心 年终奖_牛客题霸_牛客网 思路&#xff1a; 定义f(i,j)表示从左上角走到坐标(i&#xff0c;j)处能获得的最大奖励。 搜索所有从左上角走到右下角的路径&#xff0c;找到最优路径。 f(i,j)分三种情况&#xff1a; 第一列&#xff1a;f(i, 0) f(i-1, 0) board(i, 0) 如果…

Java:企业应该用Java构建供应链软件吗?

很多公司使用Java编程语言&#xff0c;Java是最流行的编程语言之一&#xff0c;它帮助开发人员简化复杂企业解决方案的应用程序开发过程。 供应链是零售和制造业的重要组成部分&#xff0c;6%的零售业公司使用Java&#xff0c;另一方面&#xff0c;4%的制造公司使用编程语言&am…

基于莱维飞行扰动策略的麻雀搜索算法-附代码

基于莱维飞行扰动策略的麻雀搜索算法 文章目录基于莱维飞行扰动策略的麻雀搜索算法1.麻雀优化算法2. 改进麻雀算法2.1 莱维飞行搜索机制2.2 莱维飞行扰动策略2.3 初始化混沌搜索机制3.实验结果4.参考文献5.Matlab代码6.Python代码摘要&#xff1a;为了解决麻雀搜索算法存在迭代…

(02)Cartographer源码无死角解析-(04) 熟悉bag文件,配置.launch与.lua文件,初步调参

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

算法 | 详解斐波那契数列问题

14天阅读挑战赛 本篇是学习了《趣学算法&#xff08;第2版&#xff09;》 第一章之后总结的。 上一篇讲到了等比数列求和问题&#xff0c;求Sn122223...263&#xff1f;S_n 1 2 2^2 2^3 ... 2^{63} &#xff1f;Sn​122223...263&#xff1f;&#xff0c;该函数属于爆…

1024,我们节日

文章目录1024的前奏1024应该锻炼身体1024 &#xff1f;为何是1024其他的1024代码有Bug&#xff0c;世界却温暖特殊的一类人群&#xff08;一&#xff09;特殊的一类人群&#xff08;二&#xff09;写在最后1024的前奏 写博文的时间是23号&#xff0c;距离1024这个标志性的节日…

趣学算法14天阅读|Day2

14天阅读挑战赛 文章目录前言什么是算法&#xff1f;算法复杂度如何评定好算法案例案例一&#xff1a;棋盘的麦子案例二&#xff1a;兔子数列总结前言 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端中级工…

@AutoConfigurationPackage注解详解

AutoConfigurationPackage是在springboot启动类注解SpringBootApplication下的EnableAutoConfiguration下。AutoConfigurationPackage作用是指定springboot扫描包&#xff0c;默认就是扫描启动类同包下的类。可以通过AutoConfigurationPackage来附加其他路径&#xff0c;然后sp…

asp.net园林绿化服务交易网站

本设计的目的是通过对园林绿化的初步了解&#xff0c;在巩固网站设计所学知识的基础上。运用于实践&#xff0c;在实践中强化理论知识&#xff0c;做到理论联系实践。在设计中学会搜集资料地方法&#xff0c;学会查阅设计规程。掌握设计步骤&#xff0c;同时培养创新能力&#…

【图像评价】基于matlab GUI图像评价系统【含Matlab源码 2185期】

一、图像质量评价 图像质量评价对图像处理算法的可行性分析以及某类算法达成效果的比较都起着非常重要的指导作用。随着图像处理技术的发展&#xff0c;对于图像质量评价的研究也日益深入&#xff0c;新的评价指标和评价算法不断涌现&#xff0c;共同推动了图像质量评价的进步…

【模型训练】YOLOv7旋翼无人机检测

YOLOv7旋翼无人机检测 1、YOLOv7算法旋翼无人机检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对空中旋翼无人机的检测,在一万多张旋翼无人机检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标类…

研发效能工程实践开篇

背景 随着技术的发展&#xff0c;大至一线互联网公司、小至几十人研发团队的公司都开始开展devops运动。大公司有能力自研&#xff0c;小公司则采用开源解决方案。如何实施devops业界已经有非常成熟的方案&#xff0c;所以本系列不再谈devops工具链以及如何实施。本系列想谈谈…

初识C++ - 类与对象(中篇·下半)

目录 赋值运算符重载 以下是一个日期类的运算符重载的案例(重点) 关于流插入与流提取的使用 方法一&#xff1a;定义与声明分离 方法二&#xff1a;使用内联函数 const成员 概念 关于上述日期类代码为什么需要在函数后面加入const 取地址及const取地址操作符重载 …

5G核心网技术基础自学系列 | 网络切片

书籍来源&#xff1a;《5G核心网 赋能数字化时代》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 支持网络切片是设计5G架构的主要驱…

【牛客刷题--SQL篇】必会的常用函数之条件函数SQL26计算25岁以上和以下的用户数量(多种写法)

&#x1f496;个人主页&#xff1a;与自己作战 &#x1f4af;作者简介&#xff1a;CSDN博客专家、CSDN大数据领域优质创作者、CSDN内容合伙人、阿里云专家博主 &#x1f49e;牛客刷题系列篇&#xff1a;【SQL篇】】【Python篇】【Java篇】 &#x1f4cc;推荐刷题网站注册地址&a…

基于WEB的二维码生成系统设计与实现(Asp.net)

目 录 1 引言 6 2 二维码的生成原理 6 2.1基础知识 6 2.1.1定位图案 7 2.1.2功能性数据 8 2.1.3数据码和纠错码 8 2.2数据编码 8 2.3结束符和补齐符 9 2.3.1补齐码&#xff08;Padding Bytes&#xff09; 9 2.3.2纠错码 10 2.4最终编码 11 2.4.1穿插放置 11 2.4.2Remainder Bi…

JWT基础概念

1. 介绍 JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证所需要…

【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

一、原始方式&#xff1a; 取模显示字符 LCD显示屏是由width * height个像素点构成的&#xff0c;显示字符&#xff0c;一个非常容易想到的方法便是对字符取模&#xff0c;然后在LCD屏上打点显示字符&#xff1b;如果大家以前学习过单片机&#xff0c;想必接触过一些显示屏&am…

三次、五次多项式插值(附代码)

文章目录一、三次多项式插值二、五次多项式插值三、matlab代码三次、五次多项式插值在工程实践中很常见。求解多项式的系数最直接的方法是根据端点处的约束条件&#xff0c;列出线性方程组&#xff0c;再写成矩阵方程AXB&#xff0c;然后用通用的方法(如高斯消元法、LU分解等)解…