Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)

news2024/9/23 13:19:27

Java---第八章

  • 字符串
    • String
    • 字符串的常用方法
    • StringBuilder和StringBuffer
      • 常用方法
    • 对比String 和StringBuilder 和 StringBuffer

在这里插入图片描述

字符串

String

特性:

  • String 类位于java.lang包中,无需引入,可直接使用
  • String 类是由final修饰的,表示String 类是一个最终类,不能被继承
  • String 类构建的对象不可再被更改
package org.device.Device;

public class DeviceTest {
    public static void main(String[] args) {
        //当使用一个字面量给字符串赋值的时候,首先会去字符串常量池里检测是否
        //存在其字面量,如果存在
        //则直接使用这个字面量的地址赋值即可,如果不存在,
        //则需要在字符串常量池中创建这个字面量,然后
        //再将地址赋值过去
        String s = "超用心";
        s += "在线学习";//这里的字符串拼接发生在堆内存上
        System.out.println(s);
    }
}

常见的构造方法:

public String(String original);

public String(char value[]);

public String(char value[],int offset,int count);

public String(byte bytes[]);

public String(byte bytes[].int offset,int length);

public String(byte bytes[],Charset charset);//字符集

分别解释:

public String(String original);


    public static void main(String[] args) {
        String s = "超用心在线学习";
        System.out.println(s);
        //这里会创建两个对象,一个是字面量会在常量池中创建一个对象
        //另一个是new String()构造方法创建出来的对象
        String s1 = new String("超用心在线学习");
        System.out.println(s1);
    }
}

上面有String s = “超用心学习”,下面再创建就会先去常量池里查找,发现有一个,然后只创建一个堆内存对象


public String(char value[]);

public String(char value[],int offset,int count);



    public static void main(String[] args) {
        char[] values = {'a','d','m','i','n'};
        String s2 = new String(values);
        System.out.println(s2);
        String s3 = new String(values,1,3);
        //跳过1个,再继续输出3个
        System.out.println(s3);
    }

输出:

admin
dmi

public String(byte bytes[]);

public String(byte bytes[].int offset,int length);


    public static void main(String[] args) {
        byte[] bytes = {97,98,99,100,101,102};
        String s4 = new String(bytes);
        System.out.println(s4);
        String s5 = new String(bytes,2,3);
        System.out.println(s5);
    }

输出:

abcdef
cde

字节可以存储整数,字符也可以用整数表示,这个整数就是ASCII码对应的整数值

public String(byte bytes[],Charset charset);//字符集

    public static void main(String[] args) {
        byte[] bytes = {97,98,99,100,101,102};

        Charset charset= Charset.forName("UTF-8");
        String s6 = new String(bytes,charset);//bytes编码为UTF-8
        System.out.println(s6);
    }

字符串的常用方法

获取长度:

public int length();//获取字符串长度

举例:

    public static void main(String[] args) {
        String s1 = "超用心学习";
        int length = s1.length();
        System.out.println(length);
    }

字符串比较:

public boolean equals(Object anObject);//比较两个字符串是否相等

public boolean equalsIgnoreCase(String anotherString);
//忽略大小比较两个字符串是否相等

举例:
字符串之间比较时,首先会看两个字符串的长度是否相等,如果相等,再看其中每个字符是否相等

    public static void main(String[] args) {
        String s2 = "abc";
        String s3 = "abc";
        String s4 = "ABC";
        System.out.println(s2.equals(s3));
        System.out.println(s2.equals(s4));
        System.out.println(s2.equalsIgnoreCase(s4));
    }

字符串大小写转换:

public String toLowerCase();//转换成小写

public String toUpperCase();//转换成大写

举例:

    public static void main(String[] args) {
        String s2 = "abc";
        String s4 = "ABC";
        String s5 = s2.toUpperCase();
        System.out.println(s5);
        String s6 = s4.toLowerCase();
        System.out.println(s6);
    }

获取字符在字符串中的下标:

public int indexof( int ch);//获取指定字符在字符串中第一次出现的下标

public int lastIndexof(int ch);//获取指定字符在字符串中最后一次出现的下标

获取字符串在字符串中的下标:

public int indexof(String str);//获取指定字符串在字符串中第一次出现的下标

public int lastIndexof(String str);//获取指定字符串在字符串中最后一次出现的下标

获取字符串中的指定下标的字符:

public char charAt(int index);

举例:

    public static void main(String[] args) {
        String s = "kliy@aliyun.com";
        int index1 = s.indexOf("@");//打印该字符串中第一个@的下标
        System.out.println(index1);
        int index2 = s.lastIndexOf("@");//打印该字符串中最后一个@的下标
        System.out.println(index2);
        int index3 = s.indexOf(".");
        int index4 = s.lastIndexOf(".");
        boolean case1 = (index1 == index2);
        boolean case2 = (index3 == index4);
        boolean case3 = (index3 - index2 > 1);
        boolean case4 = (index1 > 0 && index4 < s.length());
        if(case1 && case2 && case3 && case4){
            System.out.println("字符串"+s+"是一个邮箱地址");
        }
        System.out.println(s.charAt(0));//k
    }

字符串截取:

public String substring(int beginIndex);//从指定开始位置截取字符串,直到字符串末尾

public String substring(int beginIndex,int endIndex);
//从指定开始位置到指定结束位置截取字符串

示例:

字符串截取,截取时使用左闭右开区间 [0,4)

    public static void main(String[] args) {
        String s = "Java是一门非常高深的语言";
        String sub1 = s.substring(0,4);
        System.out.println(sub1);
        
        String sub2 = s.substring(7);
        System.out.println( sub2);
    }

输出:

Java
非常高深的语言

字符串替换:

public String replace(char oldChar,char newChar);
//使用新的字符替换字符串中旧的字符

public String replace(CharSequence target,CharSequence replacement);
//使用替换的字符串来替换字符串中的字符串

public String replaceAll(String regex,String replacement);
//使用替换的字符串来替换字符串中满足正则表达式的字符串

示例:

    public static void main(String[] args) {
        String s = "hello world";
        String s1 = s.replace('o','a');
        System.out.println(s1);

        String s2 = s.replace("o","a");
        System.out.println(s2);

        String info = "a1b2c3d4";
        //regular expresssion 正则表达式
        //三至五位数字的正则表达式
        //[1-9][0-9]{2,4}
        //英文字符串的正则表达式
        //[a-zA-Z]+
        //+ 表示任意长度
        String result = info.replaceAll("[0-9]","");
        //把其字符串中的数字替换成空
        
    }

获取字符数组:

public char[] toCharArray();

获取字节数组:

public byte[] getBytes();.//获取字节数组

public byte[] getBytes(Charset cahrset);//获取指定编码下的字节数组

示例:

    public static void main(String[] args) {
        String s = "my god";
        char[] values = s.toCharArray();
        for(int i=0;i<s.length();i++){
            System.out.println(values[i]);
        }

        byte[] bytes = s.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);
        }

        byte[] bytes1 = s.getBytes(Charset.forName("GB2312"));
        System.out.println(bytes1);
    }

字符串拼接:

public String concat(String str);//将字符串追加到末尾

去除字符串两端的空白字符:

public String trim();

示例:

    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "World";
        String s3 = s1 + s2;
        System.out.println(s3);

        String s4 = s1.concat(s2);
        System.out.println(s4);

        String s5 = "  ab  cd  ";
        String s6 = s5.trim();//将字符串两端空格剪掉
        System.out.println(s6);
    }

字符串分割:

public String[] split(String regex);//将字符串按照匹配的正则表达式分割

字符串匹配正则表达式:

public boolean matches(String regex);//检测字符串是否匹配给定的正则表达式

示例:

    public static void main(String[] args) {
        String s = "a1b2c3d4";
        String[] arr = s.split("[0-9]");
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
        String personInfo = "刘德华,男,53,很帅气";
        String[] arr1 = personInfo.split(",");
        for(int i=0;i<arr1.length;i++){
            System.out.println(arr1[i]);
        }

        String regex = "[a-z0-9]+";
        boolean match = s.matches(regex);
        System.out.println(match);
    }

不得不提到的intern()方法:

public native String intern();

示例:

    public static void main(String[] args) {
        String s1 = "超用心";
        String s2 = "在线学习";
        String s3 = s1 + s2;
        String s4 = "超用心在线学习";
        System.out.println(s3 == s4);//false
        //将字符串s3放入常量池,放入时会先检测常量池中是否存在s3字符串,
        //如果s3已经存在了,s5就直接使用s3的字符串地址即可,
        //若不存在,就在常量池中创建字符串s3
        String s5 = s3.intern();
        System.out.println(s5 == s4);//true
    }

StringBuilder和StringBuffer

特性介绍:

  • 位于Java.lang包中,无需引入,可以直接使用
  • 是由final修饰的,表示一个最终类,不可以被继承
  • 所构建的对象可以实现字符序列的追加,但不会产生新的对象,只是将这个字符序列保存在字符数组中

构造方法:
以StringBuilder为例,这两个都一样的

public StringBuilder();//构建一个StringBuilder对象,默认容量为16

public StringBuilder(int capacity);//构建一个StringBuilder对象并指定初始化容量

public StringBuilder(String str);
//构建一个StringBuilder对象,并将指定的字符串存储在其中

示例:

    public static void main(String[] args) {
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder(1024);
        StringBuilder sb3 = new StringBuilder("超用心学习");
    }

常用方法

追加:

public StringBuilder append(String str);//将一个字符串添加到StringBuilder存储区

public StringBuilder append(StringBuffer sb);
//将StringBuffer存储的内容添加到StringBuffer存储区中

示例:

    public static void main(String[] args) {
        StringBuilder sb1 = new StringBuilder(1024);
        sb1.append("超用心学习");
        sb1.append(1);
        sb1.append(1.0);
        sb1.append(true);
        sb1.append('a');
        System.out.println(sb1);
    }

输出:

超用心学习11.0truea

删除指定区间存储的内容:

public StringBuilder delete	(int start,int end);
//将StringBuilder存储区指定的开始位置到指定的结束位置直接的内容删除

删除存储区指定下标位置存储的字符:

public StringBuilder deleteCharAT(int index);

示例:

    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("abcdefg");
        builder.delete(1,5);//区间(1,5),不包括1和5
        System.out.println(builder);//afg

        builder.deleteCharAt(0);
        System.out.println(builder);//fg
    }

在StringBuilder存储区指定偏移位置处插入指定的字符串:

public StringBuilder insert(int offset,String str);

将存储区的内容倒序:

public	StringBuilder reverse();

示例:

    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("admine");
        builder.reverse();
        System.out.println(builder);//enimda
        
        builder.insert(2,",");
        System.out.println(builder);//en,imda
        
        //需要注意的是:length()方法返回的是char[]中使用的数量
        System.out.println(builder.length());//6
    }

获取指定字符串在存储区中的位置:

public int indexof(String str);//获取指定字符串在存储区中第一次出现的位置

public int lastIndexof(String str);//获取指定字符串在存储区中最后一次出现的位置

例题:

将从控制台输入的数字转换成财务数字(101,111,001.25)(使用StringBuilder完成)

    public static void main(String[] args) {
        //将从控制台输入的数字转换成财务数字(101,111,001.25)
        //(使用StringBuilder完成)
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一串数字:");
        double money = sc.nextDouble();
        StringBuilder builder = new StringBuilder();
        builder.append(money);
        int index = builder.indexOf(".");//打印.的下标
        if(index>3){
            for (int i=index-3;i>0;i-=3){
                builder.insert(i,".");
            }
        }
        System.out.println(builder.toString());
    }

对比String 和StringBuilder 和 StringBuffer

都是用来处理字符串的,在处理少量字符串的时候,它们之间的处理效率几乎没有任何区别,但是处理大量字符串时,
由于String类的对象不可更改,因此在处理字符串会产生新的对象,对内存消耗较大。

StringBuilder和StringBuffer使用的是对字符串的字符数组内容进行拷贝不会产生新的对象,因此效率较高。

StringBuffer为了保证在多线程情况下字符数组中的内容正确使用,在每个成员方法上面加了,有锁就会增加消耗,因此StringBuffer在处理效率上低于StringBuilder

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

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

相关文章

【cpolar内网穿透工具】

文章目录 cpolar内网穿透工具.md概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpol…

SpringBoot使用Redis对用户IP进行接口限流

使用接口限流的主要目的在于提高系统的稳定性&#xff0c;防止接口被恶意打击&#xff08;短时间内大量请求&#xff09;。 一、创建限流注解 引入redis依赖 <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId&g…

RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析

🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…

Ansys 光学解决方案在 A/VMR 中的应用 | 以Apple Vision Pro 为例(1)

说明 苹果公司于近期在 WWDC23 上发布了其第一代空间计算设备 Apple Vision Pro。作为一款跨世代的融合现实产品&#xff0c;Apple Vision Pro 融合了业界尖端的光学技术以实现最佳的用户体验。在这个系列的文章中&#xff0c;我们将以 Apple Vision Pro 中的各项光学应用为引子…

获奖!CFS十二届财经峰会,群硕持续耕耘数字化科技沃土

7月26-27日&#xff0c;CFS2023第十二届财经峰会暨2023可持续商业大会&#xff0c;于北京成功举办。在这场中国经济影响力思想盛会上&#xff0c;群硕获评2023数字化转型推动力奖。 ## 开拓创新&#xff0c;屡获殊荣 CFS财经峰会设立于2012年&#xff0c;是国内众多财经及大众…

【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…

苍穹外卖Day01项目日志

1.软件开发流程和人员分工是怎样的&#xff1f; 软件开发流程 一个软件是怎么被开发出来的&#xff1f; 需求分析 先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。 需要得到需求规格说明书、产品原型。 需求规格说明书 其中前后端工程师要关注的就是产品原…

C# 继承,封装,多态等知识点

一&#xff1a;面向对象的三大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 1&#xff1a;继承性&#xff1a;继承主要描述是类与类之间的关系&#xff0c;通过继承可以在无需重新编写原有的类的情况下&#xff0c;对原有的类的功能进行扩展。 2&#xff1a;封…

【Lua学习笔记】Lua进阶——协程

文章目录 协程协程的定义和调度StatusRunning 协程 协程是一种并发操作&#xff0c;相比于线程&#xff0c;线程在执行时往往是并行的&#xff0c;并且线程在创建销毁执行时极其消耗资源&#xff0c;并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行&…

法大大携手盘子女人坊,以数字化唤醒国风摄影新体验

第三方数据显示&#xff0c;目前&#xff0c;我国共有163万家摄影相关企业&#xff0c;有约1900个从事摄影相关业务的品牌&#xff0c;且预计到2025年艺术摄影市场规模将达到7063.18亿元。艺术摄影行业作为在时代进步、科技发展以及人民生活水平提高的推动下逐渐发展起来的行业…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

day42-Live User Filter(实时用户过滤器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day42-Live User Filter&#xff08;实时用户过滤器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport…

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows11下使用【Instant Neural Surface Reconstruction】算法时需要…

饱和(非饱和)激活函数

1.什么是饱和&#xff08;非饱和&#xff09;激活函数 若h(x)满足&#xff1a;&#xff0c;则h(x)称为饱和激活函数&#xff0c;例如sigmoid和tanh&#xff0c;否则为非饱和激活函数&#xff0c;例如Relu及其变体。 2.非饱和激活函数的优势有两点 能解决所谓的“梯度消失”问…

剑指offer10-II.青蛙跳台阶问题

这道题和上一道斐波那契一模一样&#xff0c;如果你要到达第n个台阶&#xff0c;你有两种方法&#xff0c;第一种是到达n-1级然后跳一下&#xff0c;第二种是到大n-2级然后跳两下&#xff0c;所以到达n级的方法数就是到达n-1级的方法数加上到达n-2级的方法数。其实就是和斐波那…

Hightopo 使用心得(5)- 动画的实现

在前一篇文章《Hightopo 使用心得&#xff08;4&#xff09;- 3D 场景 Graph3dView 与 Obj 模型》中&#xff0c;我们通过使用 ht.Default.startAnim() 让一个直升飞机飞了起来。其实&#xff0c;在 HT for Web 中&#xff0c;有多种手段可以用来实现动画。 我们这里仍然用直升…

20.1:ABC对应123问题

规定1和A对应、2和B对应、3和C对应…26和Z对应 那么一个数字字符串比如"111”就可以转化为: “AAA”、“KA"和"AK” 给定一个只有数字字符组成的字符串str&#xff0c;返回有多少种转化结果 一&#xff1a;暴力方法 public static int number(String str) {…

使用 NVM(Node Version Manager)管理 Node.js 版本

使用 NVM&#xff08;Node Version Manager&#xff09;管理 Node.js 版本 步骤一&#xff1a;安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先&#xff0c;你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装&#xff1a; nvm …

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…

【已解决】 Celery 报错:AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘

【已解决】 Celery 报错&#xff1a;AttributeError: EntryPoints object has no attribute get 1、起因2、实验环境3、解决方案 1、起因 今天闲来无事学习 Celery 分布式任务队列&#xff0c;写好代码发布并执行&#xff0c;报错了 AttributeError: EntryPoints object has n…