Java中的常用类 --String

学习目标

  1. 掌握String常用方法
  2. 掌握StringBuilder、StringBuffer
  3. 了解正则

1.String

● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以String中常用的方法大家都要掌握;

先介绍下String 类的特点 :

  • String是不可变的类,也就是说String对象是不可变的对象,那么什么叫不可变的对象我们稍后给大家解释
  • 当给String引用重新赋值时, 执行的操作为: 在内存中创建一个新的字符串地址, 使引用指向新地址

1.1 层级

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
        
}

1.2 创建方法和常用构造

两种创建方式

  1. 双引号直接赋值
  2. 利用构造创建
//双引号直接赋值
//String用法的一种特例
   String 引用名 = "值";

常用构造

String(byte[] bytes) //使用IDE里面默认的编码方式
String(byte[] bytes, Charset charset) 
String(byte[] bytes, String charsetName) 
String(byte[] bytes, int offset, int length)  
//将字节数组数据使用指定的编码方式转换(解码)一个字符串对象


String(char[] value) 
String(char[] value, int offset, int count)         
//将字符数组数据转换成字符串对象

 String(StringBuffer buffer) 
 String(StringBuilder builder)    

案例:字节数组转String

private static void demo1() {

    //乱码: 编码方法至少有2种存在  保证编码方式统一
    //创建String类对象
    String s = "hello";

    byte[] bytes = {-26, -120, -111, -28, -69, -84};

    //String str1 = new String(bytes,);//解码  将看不懂的字节的数据转换成字符串
    //String str1 = new String(bytes, StandardCharsets.UTF_8);
    //String str1 = new String(bytes, "UTF_8");
    String str1 = null;
    try {
        str1 = new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    //使用的是哪一种编码格式?
    //获得当前ide里面默认的编码格式  Charset 维护所有编码格式的
    System.out.println(Charset.defaultCharset());
    System.out.println(str1);//鎴戜滑
}

案例:字符数组转String

private static void demo2() {
    //将字符数组转换成String
    char[] chars = {97, 100, 'a', '1', '我'};
    String s = new String(chars);
    System.out.println(s);

    String s1 = new String(chars, 0, 3);
    System.out.println(s1);

}

1.3 常用方法

1.3.1 与数组相关的方法

1.byte[] getBytes()  
2.byte[] getBytes(Charset charset)  
3.byte[] getBytes(String charsetName)  
//将字符串的数组转换成字节符数组  (与编码格式有关)----> 编码  
    
4.char[] toCharArray()  
 //遍历字符数据
5.String[] split(String regex)  //分割  使用指定的字符串的数据对原字符串进行分割
6.String[] split(String regex, int limit)    
 //使用指定的正则模式分割字符串  

1.3.2 字符串搜索相关的方法

1. int	indexOf​(String str);//指定字符串第一次出现的索引位置  没有找到-1
2. int	indexOf​(String str, int fromIndex)//指定的索引开始  查询指定字符串第一次出现的索引位置  没有找到-1
    
    
3. int	lastIndexOf​(String str);// 指定字符串最后一次出现的索引位置  没有找到-1
4. int	lastIndexOf​(String str, int fromIndex);
// 指定的索引开始  查询指定字符串最后一次出现的索引位置  没有找到-1

1.3.3 提取字符串相关的方法

1.char charAt(int index)  //获得指定索引字符数据  index
private static void charatdemo() {
    String str = "hello";
    for (int index = 0; index < str.length(); index++) {
        System.out.println(str.charAt(index));
    }
}
2.String substring(int beginIndex)  //截取字符串   根据指定的索引截取原字符串部分数据
3.String substring(int beginIndex, int endIndex)  //包头不包尾
private static void substringdemo() {
    String filePath = "C:\\demo.\\a\\b\\a.txt";
    //查询最后一个\\的索引位置  lastIndexOf()
    String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
    System.out.println(fileName);

    //获得文件扩展名
    //文件上传  不同的用户传的文件名以及后缀都一样
    //A: C:\\a.jpg
    //B: D:\\a.jpg
    //上传到同一个目录---> 文件名重名的文件
//        System.currentTimeMillis()
    //System.out.println(UUID.randomUUID().toString());
    String extension = filePath.substring(filePath.lastIndexOf(".") + 1);
    System.out.println(extension);
    
    String str = "hello";
    System.out.println(str.substring(2, 4));

    //案例: 152****3456
    String phone = "15234567890";//长度固定的
    String begin = phone.substring(0,3);
    String end = phone.substring(7);
    String result = begin+"****"+end;
    System.out.println(result);
}
4.String toUpperCase()  //字母 转大写
5.String toLowerCase()  //字母 转小写
6.String trim() //去除空格
  String stripLeading()
  String stripTrailing()  
7.String concat(String str)  
8.static String join(CharSequence delimiter, CharSequence... elements) 
private static void demo12() {
        //模拟用户注册  将数据转换成:  id-name-pass-age
        Scanner input = new Scanner(System.in);
        int idIndex = 1001;
        System.out.println("录入name:");
        String name = input.next();

        System.out.println("录入pass:");
        String pass = input.next();

        System.out.println("录入age:");
        int age = input.nextInt();

        //将id name age pass 转换成指定格式
        //id-name-pass-age
        //String info = idIndex + "-" + name + "-" + pass + "-" + age;
        //System.out.println(info);

        //String concat(str)  类似+
        //String concat = String.valueOf(idIndex++).concat("-").concat(name).concat("+").concat(pass).concat("-").concat(String.valueOf(age));
        //String.join();
        String info = String.join("-", String.valueOf(idIndex), name, pass, String.valueOf(age));
        System.out.println(info);
        input.close();
    }
9.String repeat(int count)  

1.3.4 可变长参数

public static void main(String[] args) {
        //调用的时候 传递参数0个
        method();
        //调用的时候 传递多个参数
        method("aa", "bb");
    }
    /**
     * 如何定义可变长参数 任意数据类型...
     * 注意点:若方法中包含可变长参数,则必须出现在最后
     * 在方法内部,把可变长参数当成数组来进行使用
     * 调用的时候 可传值  0或多个都可以
     * @param a
     */
    public static void method(String... a) {
        System.out.println(a);
        // 在方法内部,把可变长参数当成数组来进行使用
        System.out.println(a.length);
        System.out.println(Arrays.toString(a));
    }

1.3.5 比较判断方法相关的方法

1.int compareTo(String anotherString)  //比较2个字符串是否相等  返回值: 0 正整数 负整数
    
2.int compareToIgnoreCase(String str) //不区分大小写比较2个字符串是否相等  返回值: 0 正整数 负整数 
    
    
3.boolean contains(CharSequence s)  //判断字符串是否包含指定字符串
4.boolean equals(Object anObject)  //比较2个字符串是否相等
5.boolean equalsIgnoreCase(String anotherString)  //不区分大小写比较2个字符串是否相等
    
6.boolean endsWith(String suffix)  //判断字符串是否以指定字符串结尾
7.boolean startsWith(String prefix)  //判断字符串是否以指定字符串开头
    
8.boolean isEmpty()  //判断字符串是否是空 ""  length==0
    
9.boolean isBlank()  //判断字符串是否是空 ""  "   "  length==0
    
10.boolean matches(String regex)   

1.3.6 替换相关的方法

1.String replace(char oldChar, char newChar)  //使用指定的字符的数据替换原字符串里面指定的所有的字符
2.String replace(CharSequence target, CharSequence replacement)  
    //使用指定的字符串的数据替换原字符串里面指定的所有的字符串
    
3.String replaceAll(String regex, String replacement)   
4.String replaceFirst(String regex, String replacement)     
    
 // 使用字符串替换满足正则语法模式要求的字符串的数据   

1.4 运行时常量池(串池)

● 字符串是使用的最频繁的类型,如果每次使用字符串对象,都用new关键字进行创建,那么堆内存中就会出现大量的字符串对象而占用大量堆空间;
● 为了提高JVM对字符串操作的内存使用率,JVM在方法区中提供了一块区域专门用于存储字符串字面量,这块区域位于方法区的运行时常量池;
● 当直接把字面量 赋值给字符串引用的时候, JVM会先去常量池中找这个字符串对象是否存在,如果存在直接返回此对象的地址 否则就会新建一个字符串对象 然后返回这个对象的内存地址;
● 如果+两边都是常量,查询规则还是先去常量池中找字符序列是否存在,如果存在直接返回地址 否则就新建对象;
● 如果+两边一旦有变量,拼接后的字符串对象是先存放在一个缓冲区中 并没有在常量池中

/**
     * 常量池 在方法区中 :里面放的是字符序列
     */
    public static void method9() {
        String str1 = "java";
        // 如果存在字面量 直接返回地址
        String str2 = "java";
        String str3 = "javaSun";
        String str4 = "javaSun";
        String str5 = "java" + "Sun"; // 如果+两边都是常量,查询规则还是先去常量池中找字符序列是否存在,如果存在直接返回地址 否则就新建对象
        String str6 = str1 + "Sun"; //  如果+两边一旦有变量,拼接后的结果是存放在一个缓冲区中 没有在常量池中
        // new 都在堆空间
        /*String str3 = new String("java");
        String str4 = new String("java");*/
        System.out.println("equals1:" + (str1 == str2));
//        System.out.println("equals2 :" + (str1 == str3));
        System.out.println("+两边有常量了" + (str5 == str4));
        System.out.println("+两边有变量了" + (str6 == str4));
    }
  • intern(): 其功能可以做到 在运行期间 把字符对象放入常量池
private static void demo17() {

    //并发里面 充当锁对象

    String str1 = "hello";
    String intern1 = str1.intern();
    System.out.println(str1 == intern1);//true

    String str2 = new String("hello");
    String intern2 = str2.intern();
    System.out.println(str1 == str2);//false
    System.out.println(str2 == intern2);//false
    System.out.println(str1 == intern2);//true
}

1.5 字符串不可变性

  • 对象内部的成员变量的值是不可变的因此是不可变的类型,使用final修饰了!

1.6 总结String两种创建方式的区别

  1. 双引号直接赋值: 直接使用串池. 先在串池中查找是否存在指定内容, 存在则直接指向, 不存在则先在串池中创建后指向
  2. 利用构造创建: 间接使用串池. 无论如何都会开辟对象空间, 再去串池中查找指定内容, 存在则直接存储串池地址, 不存在则先在串池中创建后存储该地址
		String str1 = "abc";
        String str2 = "abc";

        System.out.println(str1 == str2);//t 串池地址相同

        String s1 = new String("edf");
        String s2 = new String("edf");

        String str3 = "edf";

        System.out.println(s1 == s2);//f 对象地址不同
        System.out.println(s1 == str3);//f 对象地址 != 串池地址

在这里插入图片描述

2.StringBuffer/StringBuilder

  • StringBuffer/StringBuilder也是用来处理字符串的,因此方法和String方法非常类似;
  • 并非常量, 值可变
  • StringBuffer : JDK1.0 线程安全,效率低
  • StringBuilder :JDK5.0 线程不安全, 效率高
    这两个类的方法一模一样

2.1 层级

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence{}

 public final class StringBuffer
    extends AbstractStringBuilder
    implements Serializable, Comparable<StringBuffer>, CharSequence{}

2.2 特点

  1. 不能使用串池

  2. 必须通过构造创建

  3. 必须调用方法操作字符串内容, 无法使用运算符

2.3 常用方法

   1. append(): 在末尾追加内容
   2. insert(index,str); 在指定的索引位置 插入字符串数据
   3. delete(startIndex,endIndex)  删除从startIndex到endIndex的字符串的数据  包头不包尾
   4. deleteCharAt(index) 删除指定索引的字符数据
   5. insert(index,str); 在指定的索引位置 插入字符串数据
   6. replace(startIndex,endIndex,newStr)  使用newStr替换从startIndex到endIndex的字符串的数据  包头不包尾
   7. reverse(): 内容反转

2.4 对比

类名值是否可变线程安全性能内存(拼接)
String不可变安全(final)其次+ new 占据更多内存
StringBuffer可变安全(synchronized)最后只有1个对象
StringBuilder可变不安全最快只有1个对象

2.5 与String的相互转换

  1. String 转 可变长字符串
 
   StringBuilder 引用名 = new StringBuilder(String引用名 | "值");

  1. 可变长字符串 转 String
   String 引用名 = StringBuilder引用名.toString();
		String str = "abc";
        //转为可变长字符串
        StringBuilder sb = new StringBuilder(str);

        //转String
        String str2 = sb.toString();

当对String进行运算符操作时, 如+=, 会在底层中将其转换为StringBuilder完成操作, 再将StringBuilder转换回String

String s1 = "abcdefg";
String s2 = "abcd";

 s2 += "efg";//先将s2内容转换进StringBuilder, 在SB中完成拼接操作, 再转换回String

 System.out.println(s1 == s2);//f

 //以下动作不会操作StringBuilder
 String str = "abc";
 str = "edf";
 str = "123"; 

3 正则表达式

能够读懂即可,一般在前端的js,校验数据。(判断用户客户端提交的数据是否满足正则要求)
● 后端编程语言 java也是支持正则匹配

3.1 概念

● 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。
● 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,
● 通常被用来检索、替换那些符合某个模式(规则)的文本

String类的方法中: 支持正则编写。
 1.  String[] split(String regex,int limit); //根据正则模式要求分割源字符串的数据
 2.  boolean  matches(String regex); //检索/判断字符串的数据(文本数据)是否满足正则模式的要求。
 3.  String replaceAll(String regex,String replacement);
      //使用replacement替换原字符串中满足正则模式要求的文本数据
     String replaceFirst(String regex,String replacement);
      // 使用replacement替换原字符串中第一个满足正则模式要求的文本数据

3.2 语法

● 参考正则在线手册: https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
语法: String regx = “^([]{})([]{})([]{})([]{})$”;
● ^:可以省略。以xxx开头。
● $:可以省略。以xxx结尾。
● (): 可以省略。代表的是一个组/域。简称域段。域和域之间没有关系的。正则模式里面: \n代表第n个域。从1开始。一般用于执行"替换功能"的时候,域段必须编写的。动态的获得第n个域里面的内容作为替换内容的话 $n
● []:可以省略。编写限定的字符数据。[a-zA-Z0-9_]{1}
● {}: 可以省略。 限定[]里面字符内容的次数。[ab]{1,3} {正整数}
● : 转义符号
: 匹配前面的子表达式零次或多次 [a]{0,} [a] a*
● +: 匹配前面的子表达式一次或多次 [a]{1,} a{1,} a+
● .: 匹配除“\n”之外的任何单个字符 [.]{1} 匹配任意一个字符
● x|y: 匹配x或y
● [xyz]: 匹配所包含的任意一个字符 [a-z]{1} [A-Z]{1} [0-9]{1} \d 等价于[0-9] \d{1}
● \s: 匹配的是空白字符 \s+ 匹配字符串里面出现>=1次的空格内容
● \w: 等价于[A-Za-z0-9_]

4.String方法汇总

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.StringBuilder方法总结

在这里插入图片描述

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

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

相关文章

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…

QT事件循环

文章目录 主事件循环事件循环事件调度器事件处理投递事件发送事件 事件循环的嵌套线程的事件循环deleteLater与事件循环QEventLoop类QEventLoop应用等待一段时间同步操作模拟模态对话框 参考 本文主要对QT中的事件循环做简单介绍和使用 Qt作为一个跨平台的UI框架&#xff0c;其…

3-知识图谱-知识图谱的存储与查询

基于关系型数据库的知识图谱存储 基于原生图的知识图谱存储 关系型数据库的局限性 因为关系数据库&#xff0c;不善于处理“关系” 图数据库&#xff1a; Relations Are First-class citizens 在关系数据库中&#xff0c;关系是隐藏表达的。通过外键关联实体&#xff0c;表达…

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

SpringCloud-Eureka初步使用

什么是REST是一组用于规范资源在网络中转移的表现形式软件架构设计风格.简单来说就是客户端和服务器之间的一种交互形式 什么是RESTful,满足了REST风格的接口或者程序,RESTful API是其中的接口,spring中提供了RestTemplate这个类,他强制执行了REST的规范,包括使用HTTP协议的状…

SpringBoot+uniApp日历备忘录小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.日历渲染代码&#xff1a;2.保存备忘录代码&#xff1a;3.删除备忘录代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开…

推荐给 Easysearch 新用户的几个 Elasticsearch 可视化工具

Easysearch 作为国产化的 Elasticsearch&#xff08;ES&#xff09;替代方案&#xff0c;兼容 Elasticsearch 生态系统中的多种工具。本文将介绍几款适合 Easysearch 用户的可视化工具&#xff0c;帮助您更高效地管理和查询数据。 1. Elasticsearch Head 插件 在ES培训经常提…

PHP+Apache+MySQL安装(Windows)

一、安装教程 参考链接1 参考链接2 二、问题描述 PHP安装目录下找不到php8apache2_4.dll PHP安装包下载错误 Apache Service Monitor: request operation has failed! 定位问题&#xff1a; 查看【事件查看器】 解决问题 安装或更新与PHP版本相对应的Visual C Redistribu…

捷米特 JM - RTU - TCP 网关应用 F - net 协议转 Modbus TCP 实现电脑控制流量计

一、项目背景 在某工业生产园区的供水系统中&#xff0c;为了精确监测和控制各个生产环节的用水流量&#xff0c;需要对分布在不同区域的多个流量计进行集中管理。这些流量计原本采用 F - net 协议进行数据传输&#xff0c;但园区的监控系统基于 Modbus TCP 协议进行数据交互&…

【Mysql】我在广州学Mysql 系列—— 有关日志管理的示例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天星期四了&#xff0c;明天周五&#xff0c;美好的周末又要到了&#xff01;&#xff01;&#x1f606; 本文是对MySQL日志管理内容进行练习&#xff0c;后续将添加更多相关知识噢&#xff0c;谢谢各位的支持&#x1f64f; 复习…

JUC并发—8.并发安全集合二

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

金融时间序列【量化理论】

业界常用的技术分析指标都与价格本身有关&#xff0c;而时间序列分析由于对数据平稳性的要求常常是基于收益率这样更加偏稳定的数据&#xff08;收益率由于会涨停和跌停每天最多10%&#xff09; 平稳性&#xff1a; 强平稳性&#xff1a;随时间变化&#xff0c;各个统计特征都…

nvm安装、管理node多版本以及配置环境变量【保姆级教程】

引言 不同的项目运行时可能需要不同的node版本才可以运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理。 本人在配置时&#xff0c;通过网络搜索教程&#xff0c;由于文章时间过老&#xff0c;或者文章的互相拷贝导致配置时…

8 SpringBootWeb案例(上): 查询【分页功能(分页插件)】、删除、新增、修改

文章目录 前言:SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建1.2 开发规范1.2.1 开发规范-REST(不强求非要这种风格,传统风格有时候更方便)1.2.2 开发规范-统一响应结果和异常处理1.2.3 开发流程2. 部门管理2.1 查询部门2.1.1 原型和需求…

新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)

视频教程和更多福利在我主页简介或专栏里 &#xff08;不懂都可以来问我 专栏找我哦&#xff09; 如果对你有帮助你可以来专栏找我&#xff0c;我可以无偿分享给你对你更有帮助的一些经验和资料哦 目录&#xff1a; 一、XSS的三种类型&#xff1a; 二、XSS攻击的危害&#x…

用《软件方法》引导AI全流程高效开发

和“敏捷”的拍脑袋“试错”不同&#xff0c;《软件方法》一直强调严谨地思考、推导和建模。 如何尽量借助现有AI的力量&#xff0c;降低建模人员A→B→C→D的推导工作量&#xff0c;是一个非常有价值的课题。我们将用一个实例来分享和展示《软件方法》作者潘加宇的建议实践。…

全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践

#作者&#xff1a;任少近 文章目录 说明&#xff1a;一 Redis的适配exporter版1.1 Redis的exporter源码版本1.2 Redis的exporter的releases版1.3 Redis_exporter版本选择理由1.4 Redis_exporter docer镜像 二 Zookeeper的适配exporter版2.1 Zookeeper的exporter源码版本2.2 Zo…

npm在install时提示要安装python问题处理

使用npm\yarn\pnpm下载以来的时候&#xff0c;一直提示python异常&#xff0c;有的项目安装了python之后&#xff0c;下载依赖还是异常 而且旧版本项目使用python2,新的使用Python3…很烦 解决方案1&#xff1a;cnpm 使用cnpm 安装教程&#xff1a; npm安装cnpm&#xff0c;解…

浅谈网络 | 容器网络之Cilium

目录 Cilium介绍Cilium是什么Cilium 主要功能特性为什么用Cilium&#xff1f; 功能概述组件概况BPF 与 XDPeBPF (Extended Berkeley Packet Filter)XDP (eXpress Data Path) Cilium介绍 Cilium是什么 Cilium 是一个开源网络和安全项目&#xff0c;专为 Kubernetes、Docker 和…

前端知识点---vue的声明周期(vue)

文章目录 创建挂载更新销毁 vue的生命周期有四个阶段: 创建 挂载, 更新和销毁 创建 是vue组件从创建到准备渲染的过程 dom还没挂载到页面中 进行了初始化工作: 初始化数据(data,props) . 设置计算属性computed 初始化方法 methods 绑定事件watch 创建阶段的钩子函数beforeCrea…