Java学习【String类详解】

Java学习【String类详解】

  • String的介绍及定义方式
  • String类型的比较
  • String类型的查找
    • charAt()访问字符
    • indexOf()查找下标
  • 转化和替换
    • 数值和字符串转化
    • 大小写的转换
    • 字符串转数组
    • 格式化
    • 替换
  • 字符串的拆分和截取
    • split()拆分
    • substring()截取
    • trim()去除两边空格
  • StringBuilder和Stringjoiner
    • StringBuilder
    • StringJoiner

在这里插入图片描述

String的介绍及定义方式

String也就是字符串类型,并不是基本数据类型,String在Java中是一个类,属于引用数据类型
在这里插入图片描述
可以看出String类实现的接口和一些属性,既然是类,我们先去了解它的构造方法
在这里插入图片描述
可以看出,String类又很多构造方法,下面介绍一下常用的定义方法
直接赋值

String s1 = “hello”;

注意:

内存中其实还有一块专门用来存放字符串常量的区域,叫做串池,只有通过直接赋值的方式创建的字符串才会被存储到串池中,通过new关键字获取到的对象就不会存储在这里
当使用直接赋值的方式创建字符串时,系统会检查该字符串是否在串池中,如果有就复用,没有才会创建新的字符串
例如:
String s1 = “hello”;
String s2 = “hello”;
这s2会复用s1,它们的地址值相同,这样也就节省了内存

通过创建对象的方式赋值

String s2 = new String(“hello”);

传入char类型数组
根据上面的构造方法,String类型在创建对象时可以传入一个char类型数组

char[] chars = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};
String s3 = new String(chars);

也可以传入一个byte类型的数组

byte[] bytes = {97,98,99};
String s1 = new String(bytes);
System.out.println(s1);//输出abc

这里要注意,输出的是数组中ASCII码对应的字符

String类型的比较

String因为不是基本数据类型,所以不能用 > ,< 这些比较符比较,当用 " = " 比较引用数据类型时,比的是两边的地址值是否相同

        String s1 = "hello";String s2 = s1;String s3 = new String("hello");System.out.println(s2);System.out.println(s1);System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//false

因为s1和s3并不是指向同一个对象,虽然内容一样,但还是会输出false,如果要比较内容的话就需要调用equals()方法,所有的类都默认继承Object类,String类中也重写了equals()方法

System.out.println(s1.equals(s3));//true

equals()方法的返回值是boolean类型的,比较大小的话就需要用到compareTo()方法,String类Comparable接口,也重写了compareTo方法.

String s1 = "hello";
String s2 = "abc";
System.out.println(s2.compareTo(s1));//-7

输出-7,此时表示s2和s1比较,先比第一个字符,‘a’ 的ASCII码值比 ‘h’ 小7,所以就输出了-7,如果第一位一样就比第二位

String类型的查找

charAt()访问字符

通过传入下标可以对字符串中的字符进行访问

        String string = "aabcc";for (int i = 0; i < string.length(); i++) {System.out.println(string.charAt(i));}

既然是传入一个下标进行访问,所以也存在越界的情况,如果传入的值大于字符串的最大下标,就会报错。

indexOf()查找下标

在这里插入图片描述
index()有很多重载,只传入一个字符时,indexOf()会返回要查找的字符的下标,还可以传入第二个参数,表示从第几个下标开始往后找,还可以传入一个字符串,返回的也是第一个找到该字符串的字符下标,对应的lastIndexOf() 也就是从后往前找,第一次遇到的字符或字符串。
在这里插入图片描述
通过重载,同样的方法名,通过传入参数的不同,实现不同的效果,非常的灵活。

转化和替换

数值和字符串转化

valueOf() 通过传入一个数值,将传入的数值转化为字符串,也重载了多个类型
在这里插入图片描述

String s1 = String.valueOf(123);
System.out.println(s1);
valueOf是直接通过类名调用的,是一个静态方法,点进去也可以看出,是通过static修饰的
在这里插入图片描述

上面的重载中还可以传入一个Object类型,可以把一个对象转化为字符串类型

class Student{private String name;private int age;public Student(String name,int age){this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public static void main(String[] args) {Student student = new Student("张三",20);String.valueOf(student);System.out.println(student);}
}

接下来看一下字符串转数值
在这里插入图片描述

大小写的转换

String s2 = "Hello";
System.out.println(s2.toUpperCase());//转大写
System.out.println(s2.toLowerCase());//转小写
System.out.println(s2);//还是原来的

大小写转化都并不是在原来的的字符串上进行修改,而是又创建了一个新的字符串,还有需要注意的是,大小写的转化只针对有大小写的字符才能转化,如果是一个数字等其他类型就无法转换

字符串转数组

字符串转数组是通过toCharArray()来实现的,数组转字符串又可以由String的构造方法实现,在开篇已经介绍过

String s3 = "hello";
char[] chars = s3.toCharArray();
for (int i = 0; i < chars.length; i++) {System.out.println(chars[i]);
}

格式化

String s4 = String.format(“%d年%d月%d日”,2023,5,13);
System.out.println(s4);

这里的%d和c语言的占位符一样,此外format()方法也是一个静态方法。

替换

第一个replace()就是把目标字符替换为新的字符
在这里插入图片描述
在这里插入图片描述
replaceFirst只替换第一个目标字符串,replaceAll就是替换所有的目标字符串

字符串的拆分和截取

split()拆分

通过使用split()函数可以对字符串实现拆分,返回值是一个数组

String s6 = "name = 张三,age = 20";
String[] split = s6.split(",");
for (String s : split) {System.out.println(s);
}

上面就会分为两个部分,下标0表示字符串"name = 张三",下标1表示"age = 20"

还可以继续根据"= "进行拆分:

String s6 = "name = 张三,age = 20";
String[] split1 = s6.split(",");
for (String s : split1) {String[] split2 = s.split("= ");
for (String s1 : split2){System.out.println(s1);}
}

还可以根据其他不同的需求,传入正则表达式进行拆分

substring()截取

String s7 = "abcdefg";
System.out.println(s7.substring(2));//cdefg
System.out.println(s7.substring(2, 5));//cde

当传入一个参数就表示从该下标截取到最后,传入两个就表示截取的下标区间

trim()去除两边空格

String s8 = " trim haha ";
System.out.println(s8.trim());//trim haha

trim只用于去除两边的空格,中间的空格不会被去掉

StringBuilder和Stringjoiner

StringBuilder

由于字符串常量是不可变的,所以只要是涉及到String类型的转变,都不是在原有的字符串上进行修改,都会产生一个新的对象,所以当我们进行字符串拼接的操作时,如果采用"+="的方式,就会涉及到三个对象的创建,这样效率非常底下,同时也浪费内存,StringBuilder的出现就很好的解决了这个问题
在这里插入图片描述
通过append方法就实现了字符串的拼接,从源码可以看到,是在当前字符串的基础上进行操作的,所以并不需要像之前那样创建一堆对象
在这里插入图片描述
常用操作:

StringBuilder sb = new StringBuilder();//空参构造
sb.append(“Hello”);
StringBuilder sb1 = new StringBuilder(“hello”);//有参构造
System.out.println(sb1.length());//获取长度
System.out.println(sb1.reverse());//字符串反转

还有一点需要注意,当前的字符串是StringBuilder类型,如果想要变为String类型还需要调用toString方法:

String string = sb1.toString();

StringJoiner

如果要将数组按照指定格式拼接成字符串时,使用StringBuilder写的代码就会显得有些麻烦,就像下面这样:

        int[] arr = {1,2,3};StringBuilder sb2 = new StringBuilder();sb2.append("[");for(int i = 0;i < arr.length;i++){if(i== arr.length - 1){sb2.append(arr[i]);}else{sb2.append(arr[i]).append(",");}}sb2.append("]");System.out.println(sb2);

这样还要写一堆判断条件,如果使用StringJoiner就可以在创建对象的时候指定拼接的格式

public StringJoiner(间隔符号)
public StringJoiner(间隔符号,开始符号,结尾符号)

StringJoiner sj = new StringJoiner(",","[","]");
for (int i = 0; i < arr.length; i++) {sj.add(arr[i] + "");
}
System.out.println(sj);

这样就更加方便了,不同的是,这里的拼接是add() 方法,不是之前的**append()**了
同时,StringJoiner也有length(),不过需要注意的是此时的length就是带上间隔符拼接之后的总长度了

int len = sj.length();
System.out.println(len);//7: [1,2,3]

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

521源码-免费源码下载-在线变量命名工具前端源码-新手开发者工具

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 本工具地址&#xff1a;在线变量命名工具前端源码-新手开发者工具 - 521源码

多输入多输出 | MATLAB实现PSO-SVM粒子群优化支持向量机多输入多输出

多输入多输出 | MATLAB实现PSO-SVM粒子群优化支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现PSO-SVM粒子群优化支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | MATLAB实现PSO-SVM粒子群优化支持向量机多输入多输出…

Java大厂面试题第2季

一、本课程前提要求和说明 面试题1&#xff1a; 面试题2&#xff1a; 面试题3&#xff1a; 面试题4&#xff1a; 面试题5&#xff1a; 高频最多的常见笔试面试题目 ArrayList HashMap 底层是什么东东 JVM/GC 多线程与高并发 java集合类

JS脚本打包成一个 Chrome 扩展(CRX 插件)

受这篇博客 如何把CSDN的文章导出为PDF_csdn文章怎么导出-CSDN博客 启发&#xff0c;将 JavaScript 代码打包成一个 Chrome 扩展&#xff08;CRX 插件&#xff09;。 步骤&#xff1a; 1.创建必要的文件结构和文件&#xff1a; manifest.jsonbackground.jscontent.js 2.编写…

云计算如何助力金融科技企业实现高效运营

一、引言 随着信息技术的飞速发展,云计算作为一种新兴的计算模式,正在逐渐改变着传统金融行业的运营模式。金融科技企业作为金融行业的重要组成部分,面临着日益增长的业务需求和技术挑战。在这一背景下,云计算凭借其弹性扩展、高可用性、低成本等优势,成为金融科技企业实…

0基础学习Elasticsearch-Quick start

文章目录 1 背景2 前言3 快速部署ES4 快速部署Kibana5 发送请求给ES5.1 打开Kibana控制台5.2 通过REST API发送请求5.3 通过curl发送请求5.4 添加数据5.4.1 添加单个document5.4.2 添加多个document 5.5 搜索数据5.5.1 搜索所有documents5.5.2 match查询 6 总结 1 背景 因电商项…

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

HTML的标签(标题、段落、文本、图片、列表)

HTML的标签1 标题标签&#xff1a;段落标签&#xff1a;文本标签&#xff1a;图片标签:列表标签&#xff1a;有序列表&#xff1a;无序列表&#xff1a;定义列表&#xff1a;列表案例&#xff1a; 标题标签&#xff1a; 标签&#xff1a;h1~h6 注意&#xff1a;如果使用无效标…

【Linux】日志管理

一、日志进程 1、处理日志的进程 rsyslogd&#xff1a;系统专职日志程序 观察rsyslogd程序&#xff1a; ps aux | grep rsyslogd 2、常见的日志文件 1、系统主日志文件: /var/log/messages 动态查看日志文件尾部&#xff1a; tail -f /var/log/messages 2、安全…

Nginx实战:浏览器缓存

浏览器缓存 浏览器缓存是为了加速浏览&#xff0c;浏览器在用户磁盘上&#xff0c;对最近请求过 的文档进行存储。当访问者再次请求这个页面时&#xff0c;浏览器就可以从 本地磁盘显示文档&#xff0c;这样&#xff0c;就可以加速页面的阅览&#xff0c;缓存的方式节 约了网络…

深入分析 Android Service (完)

文章目录 深入分析 Android Service (完)1. Service 的生命周期管理2. Service 的生命周期方法2.1 onCreate()2.2 onStartCommand(Intent intent, int flags, int startId)2.3 onBind(Intent intent)2.4 onUnbind(Intent intent)2.5 onRebind(Intent intent)2.6 onDestroy() 3.…

2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图

ABoVE: Tundra Plant Functional Type Continuous-Cover, North Slope, Alaska, 2010-2015 2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图 简介 文件修订日期&#xff1a;2021-08-27 数据集版本: 1 摘要 该数据集以 30 米的分辨率提供了阿拉斯加北坡约 12.5 万平方…

[数据集][图像分类]轮胎纹理识别裂纹和正常轮胎分类数据集1028张2类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1028 分类类别数&#xff1a;2 类别名称:["cracked","norma…

GIt快速入门(一文学会使用Git)

GIt快速入门 文章目录 GIt快速入门一、为什么要学习Git二、Git的安装1.安装Git2.下载GUI 三、Git的概念1、版本控制2、集中式控制3、分布式控制4、多人协作开发1.并行开发2.分支管理3.冲突解决4.代码审查5.分布式特性 四、Git客户端操作1.界面介绍2.提交操作3.创建分支4.合并分…

前端框架安全防范

前端框架安全防范 在现代Web开发中&#xff0c;前端框架如Angular和React已经成为构建复杂单页面应用&#xff08;SPA&#xff09;的主流工具。然而&#xff0c;随着应用复杂度的增加&#xff0c;安全问题也变得越来越重要。本文将介绍如何在使用Angular和React框架时&#xf…

HashMap在Go与Java的底层实现与区别

在Java中 在Java中hash表的底层数据结构与扩容等已经是面试集合类问题中几乎必问的点了。网上有对源码的解析已经非常详细了我们这里还是说说其底层实现。 基础架构 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,…

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境&#xff0c;可以显著提升生产设备的自动化程度&#xff0c;改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平&#xff0c;并提供具体的实施策略与…

[数据集][图像分类]骨关节炎严重程度分类数据集14038张4分类

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;14038 分类类别数&#xff1a;4 类别名称:[“grade0”,“grade2”,“grade3…

如何定义“智慧校园”这个概念

在信息爆炸的时代&#xff0c;教育面临着前所未有的挑战&#xff1a;如何让每个学生在海量知识中找到属于自己的路径&#xff1f;如何让教师的智慧与科技的力量相得益彰&#xff1f;如何让校园成为培养创新思维的摇篮&#xff1f;智慧校园&#xff0c;这一概念的提出&#xff0…

基于 Redis 实现分布式锁的全过程

前言 这一篇文章拖了有点久&#xff0c;虽然在项目中使用分布式锁的频率比较高&#xff0c;但整理成文章发布出来还是花了一点时间。在一些移动端、用户量大的互联网项目中&#xff0c;经常会使用到 Redis 分布式锁作为控制访问高并发的工具。 一、关于分布式锁 总结&#x…