认识Java中的String类

前言

大家好呀,本期将要带大家认识一下Java中的String类,本期注意带大家认识一些String类常用方法,和区分StringBuffer和StringBuilder感谢大家收看

一,String对象构造方法与原理

String类为我们提供了非常多的重载的构造方法让我们构造字符对象,感兴趣可以点开源码看看,下面介绍常用四种以及使用场景

1.常量池直接构造:最简便的构造方式,栈中创建的对象的引用指向常量池中的对象,如下图str

2.使用new构造:在堆区中开辟一片空间存放字符对象,如下图str1

3.字符数组构造:New的String对象传入一个字符数组构造字符对象,如下图str2

4.字节数组构造:利用字节数组构造,此时需注意字节数组中存放字母的ACCII码值,构造时需选择编码格式,一般使用UTF-8编码格式进行编码如下图str3

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str="helloWorld";//直接构造
        String str1=new String("helloWorld");//new出对象
        char[] ch={'h','e','l','l','o','W','o','r','l','d'};
        String str2=new String(ch);//字符数组构造
        byte[] bytes = {104, 101, 108, 108, 111}; // 字节数组,对应ASCII "hello"
        String str3 = new String(bytes, "UTF-8"); // 使用UTF-8编码构造字符串
        System.out.println(str+"\n"+str1+"\n"+str2+"\n"+str3);
    }
}

值得一提利用字符数组和字节数组有常见的构造方法

表示截取var1字数数组中从var2到var3的字符构造字符串,截取的区间左闭右闭,例如

二,String对象的不可变性

String对象一经创建,便不可更改,更改的话,只会在创建一个新的对象,把更改过后的内容放进去,这个就是String对象的不可变性,String的这个特性使的对String对象的操作相对低效,于是StringBuilder类就可以提高我们的效率。后面介绍StringBuilder类时会详细说明

三,String类中的常用方法

1,字符串转换

(1)大小写转换

java中使用toUpperCase和toLowercase对字符串进行大小写转换,注意这个方法不会改变原来字符串,而是返回一个新的字符串

public class Test1 {
    public static void main(String[] args) {
        String str="HELLO";
        String str1=str.toLowerCase();
        System.out.println(str1);
        String str2="hello";
        String str3=str2.toUpperCase();
        System.out.println(str3);
    }
}
(2)字符串和数值转换

Java中,如果想把一个子符转成数值需要用到它们对应类型的包装类,同样,把任意类型对象转成字符串需要用到String的valueOf方法,如下

public class Test1 {
    public static void main(String[] args) {
        String s="1234";
        System.out.println(Integer.parseInt(s));
        int i=1234;
        System.out.println(String.valueOf(i));
    }
}
(3)字符串转数组

字符串对象调用toCharArray方法,返回一个字符数组,可以得到字符串中每个字符,然后,我们可以遍历这个数组打印观察其中的字符

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        char[] ch=str.toCharArray();
        for (int i=0;i<ch.length;i++){
            System.out.println(ch[i]);
        }
    }
}

(4)格式化

String类调用format方法,优点在于可以更方便地创建复杂的输出字符串,特别是在需要格式化输出的时候,学过C语言的小伙伴们应该不陌生,例如

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        String str1="World";
       int i=10;
        System.out.println(String.format("%s %s %d", str, str1,i));
    }
}

2,寻找字符

(1)寻找某个下表对应字符--charAt

String对象调用charAt(in i)方法,传入一个字符串对应字符的下标,返回对应下标的字符,源码如下

顺带一提如果字符由数字组成也返回一个数字字符

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        String str1="World";
        String str3="16774";
        char ch=str3.charAt(1);
        char ch1=str1.charAt(0);
        System.out.println(ch);
        System.out.println(ch1);

    }
}
(2)寻找某个字符首次出现位置--indexOf

String对象调用Indexof方法传入一个字符,返回对应字符首次出现的下标值,它还可以在传入一个int值表示从这个int值对应的下表开始找对应字符,没找到返回-1。

public class Test1 {
    public static void main(String[] args) {
        String str="Hello World";
        System.out.println(str.indexOf("l"));
        System.out.println(str.indexOf("l",5));//只传入一个数,表示从5下标一直找到结尾
    }
}

(3)从字符串末尾开始向前找字符--lastIndexof

与indexof用法类似,不过这次是从后向前找字符,没找到则返回-1

public class Test1 {
    public static void main(String[] args) {
        String str="Hello World";
        System.out.println(str.lastIndexOf("l"));
        System.out.println(str.lastIndexOf("l",5));//传入一个数,表示从5一直向前找
    }
}

3,字符串比较

(1)==

实质上是比较字符串的地址,同一地址返回true否则返回false

public class Test1 {
    public static void main(String[] args) {
        String str="Hello";
        String str1=new String("Hello");
        String str2="Hello";
        String str3=new String("Hello");
        System.out.println(str==str1);//前面已经讲过字符串的构造,很明显地址不同
        System.out.println(str==str2);//都在常量池中地址相同
        System.out.println(str1==str3);//每次new都会在堆区开辟空间,二者地址不同
    }
}
(2)equals

只比较字符串内容,与地址无关(String内部重写了这个方法)

public class Test1 {
    public static void main(String[] args) {
        String str = "Hello";
        String str1 = new String("Hello");
        String str2 = "Hello";
        System.out.println(str.equals(str1));
        System.out.println(str.equals(str2));
        System.out.println(str1.equals(str2));
    }
}

(3)compareTo

这部分内容我们在接口部分讲过,主要是我们重写Comparable接口中的compareTo方法来比较两个字符类型的大小。注意String类是重写了compareTo这个方法的,我们直接使用即可,它会根据比较字符的大小返回一个整型值,对这部分内容感兴趣的朋友们可以看看CSDN这篇文章,下面说明String对象如何调用这个方法

public class Test {
    public static void main(String[] args) {
        String s="hello";
        String s1="world";
        System.out.println(s.compareTo(s1));//s小于s1,返回一个小于0的数
        System.out.println(s1.compareTo(s));//s1大于s,返回一个大于0的数
        System.out.println(s.compareTo(s));//相同字符串返回0
    }
}

4,字符串操作

(1)替换操作--replace

使用replace方法可以把字符串中特定的所有字符替换成指定字符

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String s1 = s.replace("l", "s");
        System.out.println(s+"\n"+s1);
    }
}

当然,这个方法会返回一个新对象,不会对原来字符串做任何修改

(2)分裂操作--split

Java中有将字符串根据指定字符拆分成几个子字符串的方法

由源码可以看出,这个方法传入一个字符,返回一个String类型的数组,我们可以通过遍历得到这个数组每个元素

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("l");
        for (int i = 0; i <str.length; i++) {
            System.out.println(str[i]);
        }
    }
}

当然也可以传入一个字符串

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("ll");
        for (int i = 0; i <str.length ; i++) {
            System.out.println(str[i]);
        }
    }
}

当然,要是没有这个字符那么这个字符串就不会被分割

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("k");
        for (int i = 0; i <str.length ; i++) {
            System.out.println(str[i]);
        }
    }
}

四,StringBuffer与StringBuilder应用与区分

StringBuffer与StringBuilder用法和功能都是类似的,区别就在于StringBuilder对字符串的操作都是在原字符之上修改,并不会创建新的对象,这就使得StringBuiler效率优于String类,举个例子,StringBuilder类有一个append的拼接字符串的方法,这个方法就会比String类通过+=拼接效率更高

import java.util.Timer;

public class Test {
    public static void main(String[] args) {
        String s = "hello";
        StringBuilder s1 = new StringBuilder("hello");
        Long time1=System.currentTimeMillis();
        //记录当前时间
        for (int i = 0; i <10000 ; i++) {
            s+="i";
        }
        Long time2=System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s1.append("i");
        }
        Long time3=System.currentTimeMillis();
        System.out.println(time2-time1);
        System.out.println(time3-time2);

    }
}

另外,StringBuilder对象可以通过toString方法转化成String对象

public class Test1 {
    public static void main(String[] args) {
        StringBuilder s1 = new StringBuilder("hello");
        String s=s1.toString();
    }
}

StringBuffer类于他们只有一个区别,StringBuffer类的操作属于线程安全操作,它的大部分方法都加上了

 synchronized关键字,如下

线程安全操作简单理解就是指在多线程情况下,这个方法会被执行完才会让出cpu资源,执行后面代码,这保证了代码逻辑的正确性,当然,与之相对效率差一点点,所以在单线程情况下还是常用另外两个方法。

本期博客就到到这里啦,记录个人学习欢迎大家指正错误哦,谢谢大家,我们下期见

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

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

相关文章

通过抑制治疗上调的环氧化酶-2来改善光动力性能的肿瘤归巢嵌合肽菱形体

引用信息 文 章&#xff1a;Tumor Homing Chimeric Peptide Rhomboids to Improve Photodynamic Performance by Inhibiting Therapy‐Upregulated Cyclooxygenase-2. 期 刊&#xff1a;Smal&#xff08;影响因子&#xff1a;13.3&#xff09; 发表时间&#xff1a…

Point-LIO:鲁棒高带宽激光惯性里程计

1. 动机 现有系统都是基于帧的&#xff0c;类似于VSLAM系统&#xff0c;频率固定&#xff08;例如10Hz)&#xff0c;但是实际上LiDAR是在不同时刻进行顺序采样&#xff0c;然后积累到一帧上&#xff0c;这不可避免地会引入运动畸变&#xff0c;从而影响建图和里程计精度。此外…

Duilib多标签选项卡拖拽效果:添加动画特效!

动画是小型界面库的“难题”、“通病” 几年前就有人分享了如何用direct UI制作多标签选项卡界面的方法。还有人出了一个简易的浏览器demo。但是他们的标签栏都没有Chrome浏览器那样的动画特效。 如何给界面添加布局是的动画特效呢&#xff1f; 动画使界面看起来高大上&#…

C++笔试强训day41

目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj &#xff08;简单题&#xff09;对题意进行简单模拟即可&#xff1a; class Solution { public:int dx[…

2024年政治经济学与社会科学国际会议(ICPESS 2024)

2024年政治经济学与社会科学国际会议 2024 International Conference on Political Economy and Social Sciences 会议简介 2024年政治经济学与社会科学国际会议是一个致力于探讨政治经济学与社会科学交叉领域前沿问题的国际盛会。本次会议汇聚了全球顶尖的专家学者、研究人员和…

lubuntu / ubuntu 配置静态ip

一、查看原始网络配置信息 1、获取网卡名称 ifconfig 2、查询网关IP route -n 二、编辑配置文件 去/etc/netplan目录找到配置文件&#xff0c;配置文件名一般为01-network-manager-all.yaml sudo vim /etc/netplan/01-network-manager-all.yaml文件打开后内容如下 # This …

【优化过往代码】关于vue自定义事件的运用

【优化过往代码】关于vue自定义事件的运用 需求说明过往代码优化思路优化后代码&#xff08;Vue2&#xff09;遇到问题记录 Vue2官方自定义指令说明文档 Vue3官方自定义指令说明文档 需求说明 进入某些页面需要加载一些外部资源&#xff0c;并在资源加载完后进行一些处理&…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要&#xff1a;本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富&#xff0c;本文分享终篇状态报错与启停慢篇&#xff0c;主要分为以下四个部分&#xff1a; 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

图解支付系统全自动化渠道开关设计与实现

大家好&#xff0c;我是隐墨星辰&#xff0c;前几天在渠道路由章节中提到过自动化渠道开关&#xff0c;今天聊聊支付系统中全自动化渠道开关的设计与实现。主要讲清楚在什么情况下需要考虑建设自动化渠道开关&#xff0c;以及如何设计并实现一个平衡灵敏度和噪音的自动化渠道开…

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面&#xff0c;主要包括“查询”、“添加”、“删除”、“更新”&#xff0c;四个功能模块。 查询&#xff1a;从数据库中查找所有数据的所有内容&#xff0c;并显示在左边的QListWidget控件上。 添加&#xff1a;在右边的QLineEdit标签上输入需…

分享一个按钮代码,主要有html,svg及css动画实现

按钮展示: Switch by Galahhad made with CSS | Uiverse.io 源代码: css .theme-switch {--toggle-size: 30px;/* the size is adjusted using font-size,this is not transform scale,so you can choose any size */--container-width: 5.625em;--container-height: 2.5em;-…

Linux安装Qt5.14.2

下载 qt 5.14.2下载网址 下载qt-opensource-linux-x64-5.14.2.run Linux系统下载.run文件&#xff08;runfile文件&#xff09;&#xff0c;windows系统下载.exe文件&#xff0c;mac系统下载.dmg文件。 md5sums.txt中是各个文件对应的MD5校验码。 验证MD5校验码 md5sum是li…

UE4 使用样条线做鱼儿封闭路径动画

描述&#xff1a;鱼儿的游动动画的特点 1.通常是始终保持Y (Pitch)轴角度不变 2.调头的时候改变的是Z轴角度 效果&#xff1a;调头的时候比较自然 蓝图&#xff1a; 为了让鱼儿有恒定的游动速度&#xff0c;增加以下蓝图节点&#xff0c;游动速度为50 最后&#xff0c;让鱼…

Day53 动态规划part12

LC309买卖股票的最佳时机含冷冻期 与LC122类似&#xff0c;都是可无限次购买股票&#xff0c;只不过引入了冷冻期的概念dp[i][0] 第i天持有股票收益&#xff1b;dp[i][1] 第i天不持有股票收益;情况一&#xff1a;第i天是冷静期&#xff0c;不能以dp[i-1][1]购买股票,所以以dp[…

019、有序集合_命令

它保留了集合不能有重复,有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。如图 该有序集合包含kris、mike、frank、tim、martin、tom,它们的分数分别是1、91、200、220、250、251,有序集合提…

Windows下对于Qt中带 / 的路径的处理

在Windows下&#xff0c;如果你想使用操作系统的分隔符显示用户的路径&#xff0c;请使用 toNativeSeparators()。 请看以下代码&#xff1a; void Player::on_playBtn_clicked() {if (this->m_url.isEmpty()) {openMedia();if (this->m_url.isEmpty())return;}qDebug(…

使用 Scapy 库编写 ICMP 不可达攻击脚本

一、介绍 ICMP不可达攻击是一种利用ICMP&#xff08;Internet Control Message Protocol&#xff09;不可达消息来干扰或中断目标系统的网络通信的攻击类型。通过发送伪造的ICMP不可达消息&#xff0c;攻击者可以诱使目标系统认为某些网络路径或主机不可达&#xff0c;从而导致…

idea2023如何创建普通maven工程项目

解决 1.创建新项目 1.进入创建项目 File -> new -> project 2&#xff0c;project 中有 build system 选择maven 2.在已有项目中创建普通maven工程 1.右键项目选择 new -> Module 2.选择 new Module 其实与新建maven工程没什么区别 em:问题 idea以前的版本是在Mav…

C++三大特性之多态

1.多态 1.1多态的概念 在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息&#xff0c;不同的对象在接收时会产生不同的行为(即方法)也就是说&#xff0c;每个对象可以用自己的方式去响应共同的消息。所谓消息&#xff0c;就是调用函数&#xff0c;不同的行…