首页 > 编程语言 >Java中String类的学习

Java中String类的学习

时间:2024-09-09 20:13:35浏览次数:11  
标签:Java String System 学习 println 字符串 匹配 out

String类


目录

字符串常量

我们俗称的字符串常量,其实程序之中不会提供有字符串这样的“基本数据类型”,提供的只是一个String类,所以任何使用" "定义的字符串常量实际上描述的都是一个String类的匿名对象。

String类对象的直接赋值: 将一个匿名对象设置一个具体的引用,相当于开辟一个栈内存,指向这个匿名对象,这个匿名对象是存在堆内存的。

String类对象直接赋值 :String str = "Daxiong";
字符串常量 :"Daxiong"
可以发现:字符串常量可以调用equals()方法实现对象相等的判断,所以程序中没有字符串常量这种基本类型,有的只是String类的匿名对象。

//验证字符串常量是匿名类对象
public class Stringdemo {
	public static void main(String[] args) {
		String str = "Daxiong";
		System.out.println("Daxiong".equals(str));     //true
		//"Daxiong"能调用equals方法,说明这是个匿名类对象
	}
}

常见的方法

charAt(int index):返回字符串指定位置字符

public class Demo{
	public static void main(String[] args){
		String s = "jixiaoqizhenshuai";
		char what =s.charAt(5);
		System.out.println(what);
	}
}//应该输出a

indexOf(String s):返回指定字符串第一次出现的位置

public class Test {  
    public static void main(String[] args) {  
        String s = "findStrring";  //定义初始化一个字符串findString
       // 从头开始查找是否存在指定的字符         //结果如下   
       System.out.println(s.indexOf("d"));     // 结果是3  
       // 从第四个字符位置开始往后继续查找S,包含当前位置  
      System.out.println(s.indexOf("S", 3));  //结果是4  
      //若指定字符串中没有该字符则系统返回-1  
      System.out.println(s.indexOf("o"));     //结果是-1  
     //从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的索引
    System.out.println(s.lastIndexOf("r")); //结果是7 
        }  
}  

startWith(String s):测试字符串是否以指定前缀开始

public class Test {
    public static void main(String args[]) {
        String Str = new String("www.runoob.com");
 
        System.out.print("返回值 :" );
        System.out.println(Str.startsWith("www") );
 
        System.out.print("返回值 :" );
        System.out.println(Str.startsWith("runoob") );
 
        System.out.print("返回值 :" );
        System.out.println(Str.startsWith("runoob", 4) );
    }
}//返回值 :true   返回值 :false   返回值 :true

endsWith(String s):测试字符串是否以指定的后缀开始

public class Test {
    public static void main(String args[]) {
        String Str = new String("菜鸟教程:www.runoob.com");
        boolean retVal;
 
        retVal = Str.endsWith( "runoob" );
        System.out.println("返回值 = " + retVal );
 
        retVal = Str.endsWith( "com" );
        System.out.println("返回值 = " + retVal );
    }
}//返回值 = false   返回值 = true

subString(int index):返回字符串的子字符串

replacpublic class RunoobTest {
    public static void main(String args[]) {
        String Str = new String("This is text");

        System.out.print("返回值 :" );
        System.out.println(Str.substring(4) );
     
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4, 10) );
    }
}e(char a,char b):替换字符串的指定字符//返回值:is text  返回值: is te

trim():去掉字符串的前后空格

public class Test {
    public static void main(String args[]) {
        String Str = new String("    www.runoob.com    ");
        System.out.print("原始值 :" );
        System.out.println( Str );

        System.out.print("删除头尾空白 :" );
        System.out.println( Str.trim() );
    }
}//原始值 :    www.runoob.com     删除头尾空白 :www.runoob.com

concat(String str):连接两个字符串

public class Demo10String {
    public static void main(String[] args) {
        //拼接字符串相同点
        String str1="Hello";
        String str2="World";
        String str3=str1.concat(str2);
        String str4=str1+str2;
        System.out.println(str3);   //输出:HelloWorld
        System.out.println(str4);   //输出:HelloWorld
        //不同点
        String str="Hello" + 5;     //输出:Hello5
        System.out.println(str);
}

split(String regex):给定正则表达是的匹配来拆分字符串

        String test0 = "meow#meow#wo#yao#chi#rou";
        for (String a: test0.split("#")){
            System.out.println(a);
        }//输出:meow meow wo yao chi rou

正则表达式

字符通配符

在Java中,正则表达式是处理字符串的强大工具,它提供了多种字符通配符来匹配字符串中的模式。这些通配符包括:

  • .(点号):匹配除换行符之外的任何单个字符。
  • *(星号):匹配前面的子表达式零次或多次。
  • +(加号):匹配前面的子表达式一次或多次。
  • ?(问号):匹配前面的子表达式零次或一次。
  • [xyz]:字符集合。匹配所包含的任意一个字符。
  • [^xyz]:负值字符集合。匹配未包含的任意字符。
  • {n}:n 是一个非负整数。匹配确定的 n 次。
  • {n,}:n 是一个非负整数。至少匹配n 次。
  • {n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

次数通配符

在Java中,当我们谈论“次数通配符”时,实际上我们可能是在引用正则表达式中的量词(quantifiers),这些量词用于指定某个模式在字符串中出现的次数。然而,“次数通配符”这个术语并不是Java或正则表达式中的标准术语,但我们可以理解为它指的是用于指定字符或字符集出现次数的正则表达式组件。

在正则表达式中,这些“次数通配符”或量词包括:

  1. * - 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。

  2. + - 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。

  3. ? - 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 "do" 或 "does" 中的 "do" 。

  4. {n} - n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。

  5. {n,} - n 是一个非负整数。至少匹配 n 次。例如,o{2,} 不能匹配 "Bob" 中的 "o",但能匹配 "foooood" 中的所有 o。

  6. {n,m} - m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 "fooooood" 中的前三个 o。

需要注意的是,这些量词(或“次数通配符”)并不是Java特有的,而是正则表达式语言的一部分,Java通过java.util.regex包中的类(如PatternMatcher)提供了对正则表达式的支持。

在Java中使用这些量词时,你通常会将它们与PatternMatcher类一起使用,或者在某些情况下,直接使用String类的matches(), split(), replaceAll()等方法,这些方法内部也使用了正则表达式。

例如,使用PatternMatcher类来查找字符串中所有匹配特定模式的子串:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
    public static void main(String[] args) {
        String text = "Apple is round, apple is juicy, apple is sweet.";
        String pattern = "apple";

        Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(text);

        while (m.find()) {
            System.out.println("Found: " + m.group());
        }
    }
}

但是,如果你想要使用量词来指定apple出现的次数(虽然在这个例子中可能不太适用),你需要在正则表达式中直接使用它们,比如apple+来匹配一个或多个连续的"apple"(尽管这实际上会匹配到"appleapple"这样的字符串,而不是单独计算每个"apple"的出现次数)。

其他通配符

StringBuffer和StringBuilder

StringBufferStringBuilder 是 Java 中用于创建可修改的字符串的类,它们都位于 java.lang 包中。尽管它们有着相似的功能和用法,但它们之间还是存在一些关键的差异,主要体现在线程安全性和性能上。

线程安全性

  • StringBuffer:是线程安全的。这意味着当多个线程同时访问同一个 StringBuffer 实例时,对字符串的修改操作是同步的,从而避免了数据不一致的问题。然而,这种线程安全性是以牺牲性能为代价的,因为每次修改操作都需要进行线程同步。
  • StringBuilder:不是线程安全的。当在单线程环境下使用时,它比 StringBuffer 提供了更好的性能,因为它避免了不必要的线程同步开销。但是,如果你在多线程环境中使用 StringBuilder,并且多个线程可能会同时修改同一个 StringBuilder 实例,那么就需要自己管理线程安全,否则可能会导致数据不一致。

性能

由于 StringBuilder 避免了 StringBuffer 中的线程同步开销,因此在单线程环境下,StringBuilder 的性能通常优于 StringBuffer。但是,在多线程环境中,如果你选择使用 StringBuilder 并希望保持数据一致性,那么你可能需要手动实现线程同步,这可能会降低性能。

用法

在用法上,StringBufferStringBuilder 非常相似。它们都提供了 append()insert()delete() 等方法来修改字符串。但是,由于 StringBuilder 不是线程安全的,所以在多线程环境下使用时需要格外小心。

选择哪一个?

  • 如果你在多线程环境下工作,并且需要确保字符串的线程安全性,那么应该选择 StringBuffer
  • 如果你在单线程环境下工作,或者确信你的应用程序中的字符串不会被多个线程同时修改,那么应该选择 StringBuilder 以获得更好的性能。

示例

// 使用 StringBuffer
StringBuffer sb = new StringBuffer("Hello, ");
sb.append("World!");
System.out.println(sb.toString()); // 输出: Hello, World!

// 使用 StringBuilder
StringBuilder sbBuilder = new StringBuilder("Hello, ");
sbBuilder.append("World!");
System.out.println(sbBuilder.toString()); // 输出: Hello, World!

在这两个示例中,StringBufferStringBuilder 的用法几乎相同,但选择哪一个取决于你的具体需求和应用程序的上下文。

标签:Java,String,System,学习,println,字符串,匹配,out
From: https://www.cnblogs.com/BingBing-8888/p/18405244

相关文章

  • 【Java毕设最新选题推荐2025】基于springboot的酒店管理系统
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对酒店管理系统......
  • C语言学习 --- 修饰变量的关键字
    修饰变量的关键字        修饰变量的关键字+数据类型+变量名 auto:自动默认不写register:        register是作为寄存器的变量,就是在CPU里面存储的地方作用:        将频繁进行IO操作的变量声明成寄存器变量,节省数据读取操作的时间,提高执行效率......
  • [Java并发]sleep
    Thread.sleep是Java中用来让当前线程进入休眠状态一段时间的方法。调用Thread.sleep后,线程会进入“等待”状态,直到指定的时间过去,然后自动被唤醒继续执行。但Thread.sleep并不是在其他线程的干预下被唤醒的,而是依赖以下几个条件之一来结束休眠:时间到达:当指定的睡眠时间......
  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
    文章目录Java代码审计篇|ofcms系统审计思路讲解-篇1|环境搭建、路由机制1.前言2.项目环境搭建3.项目路由机制3.1.1)先搜索pom.xml文件,看看使用了什么框架3.2.2)确定是否是spring的路由机制3.3.3)确定自写路由机制的特点3.4.4)从前端探索3.5.5)断点调试3.6.6)寻......
  • 机器学习的工作方式
    那么机器如何学习?答案是从数据中学习。在当今世界,我们在日常生活中会创建大量数据。从我们发送的短信、电子邮件和社交媒体帖子,到我们用手机拍摄的照片和视频,我们产生了大量信息。我们的房屋、汽车、城市、公共交通基础设施和工厂中的数百万个传感器也在创建更多数据。数......
  • 深入理解java虚拟机---第 3 章 垃圾收集器与内存分配策略
    3.2.2可达性分析算法当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(ReachabilityAnalysis)算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GCRoots”的根对象作为起始节点集,从这些节点开始,根据引用关......
  • Java单例设计模式(懒汉式与饿汉式)
    思考这样一个问题如果要在类的外部有且只有一个对象,我们需要怎么做呢首先要保证构造方法私有化,保证不能用new的方法来在外部创建对象一.单例设计模式单例设计模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。无论是懒汉式还是饿汉......
  • Java JVM 零基础,详细讲解一(基础结构)。
    在Java编程的世界里,JVM是一个至关重要的存在。如果你是一个零基础的开发者,想要深入了解JVM,那么这篇博客将为你提供超详细的讲解。一、什么是JVM?JVM(JavaVirtualMachine,Java虚拟机)是一种用于计算设备的规范,它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计......
  • 《Java 归并排序:高效稳定的排序算法》
      一、归并排序简介介绍归并排序是一种基于分治思想的经典排序算法,适用于各种规模的数据排序任务。 二、算法原理(一)分治策略将未排序数组分割成两个子数组,递归地对子数组进行排序,最后合并成有序数组。(二)关键步骤1.分割阶段:将数组分成两个子数组,通常是平均分割。2.......
  • 【数据结构】基础学习
    线性数据结构1.链表(LinkedList)链表是一种线性数据结构,每个节点包含数据和指向下一个节点的引用(即指针)。1.链表的基本操作(Java中的LinkedList类)LinkedList是Java标准库中的一个双向链表实现。我们将通过一些插入、删除和获取操作来演示其使用。importjava.util.L......