JavaSE——String

一、什么是String

        String对象用于保存字符串,字符串常量对象是用双括号引起的字符序列。序列中的字符使用Unicode字符编码,一个字符无论是汉字还是字母都占两个字节。常用的构造器:

String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
String s5 = new String(byte[] b);

一些细节:

  1. String实现了接口Serializable,这使得String可以串行化,也就是可以在网络中传输。还实现了接口Comparable,让String对象可以比较大小。
  2. String是final类,不能被其它类继承。
  3. String真正用来存放字符串内容的是一个字符数组:private final char value[]。
  4. value一个final类型,它指向的地址不可以修改,但是可以修改数组的内容。

二、String类创建剖析

String s = "hello world"

        这中创建方式先从常量池查看是否有"hello world"的数据空间,如果有直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址

String s2 = new String("hello world");

        这种方式先在堆中创建空间,里面维护了value的属性,指向常量池的"hello world"空间,如果常量池中没有则重新创建,如果有直接通过value指向。最终指向的是堆中的空间地址。就是s2指向value,value指向常量池的空间地址。

三、String类的常见方法

equals方法:判断字符串的内容是否相等,它是区分大小写的。

String a = new String("hello");
String b = "hello";
System.out.println(a.equals(b));

 equalsIgnoreCase方法:忽略大小写,判断内容是否相等。

String a = new String("HeLlo");
String b = "hello";
System.out.println(a.equalsIgnoreCase(b));

length方法:获取字符的个数,返回字符串的长度 。

String a = new String("HeLlo");
System.out.println(a.length());

indexOf方法:获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1 。

System.out.println("we are we".indexOf("we"));

lastIndexOf方法:获取最后一次出现的位置,索引从0开始,如果找不到,返回-1。

System.out.println("we are we".lastIndexOf("we"));

 subtring方法:截取指定范围的子串。

//从索引0开始截取,截取到索引5之前的一个字符
System.out.println("hello,张三".substring(0,5));
//从索引6开始截取完后面所有内容
System.out.println("hello,张三".substring(5));

toUpperCase方法:将字符串的小写字母全部转换成大写。

System.out.println("Hello World".toUpperCase());

toLowerCase方法:将字符串的大写字母全部转换成小写。 

System.out.println("Hello World".toLowerCase());

concat方法:拼接字符串。

String str1 = "hello ";
String str2 = "world";
String str3 = str2.concat(str1);
System.out.println(str3);//也可以这样
System.out.println("Hello ".concat("World").concat("!"));

replace方法:替换字符串中的字符,返回的结果才是替换过的,本身对str1没有影响。

String str1 = "hello ";
String str2 = str1.replace('l','k');
System.out.println(str2);

split方法:分割字符串,对于某些分割字符,需要转义才能正确使用。

String str1 = "hello world wo shi";
String[] strs = str1.split(" ");
for(String s : strs){System.out.println(s);}

toCharArray方法:将String转换为字符数组。

String str = "Hello World";
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {System.out.print(chars[i]);}

compareTo方法:比较两个字符串的大小。

  1. 如果长度相同,且每个字符相同,返回0。
  2. 如果长度相同或者不相同,但是在进行比较时,可以区分大小们就返回不相同的字符的ASCLL码值之差。
  3. 如果前面都相同,则返回str1.len-str2.len。
String str1 = "JACK";
String str2 = "JACL";
System.out.println(str1.compareTo(str2));//'K'-'L' = -1;String str1 = "JACK";
String str2 = "JACKLOM";
System.out.println(str1.compareTo(str2));//4 - 7 = -3

format方法: 使用占位符,%s表示字符串替换,%d表示用整数替换,%,2f表示用小数来替换。

String formatStr = "我是%s,年龄是%d,成绩是%.2f,性别是%c";
String name = "小王";
int age = 18;
float grade = 97.34f;
char gender = '男';
System.out.println(String.format(formatStr, name, age, grade, gender));
System.out.printf((formatStr) + "%n", name, age, grade, gender);

四、StringBuffer类

4.1什么是StringBuffer类

        StringBuffer类的直接父类是AbstractStringBuilder,在父类中,有属性char[] value,不是final类型的。该数组存放字符串类型,存放在中。所以StringBuffer代表可变长度的字符序列,可以对字符串的内容进行增删。

        StringBuffer也是一个final类,不可被继承。

4.2String类与StringBuffer类

  1. String类保存的是字符串常量,里面的值不能更改,每次String类的更新实际上是更改地址
  2. StringBuffer类保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容不用不用每次都更新地址

4.3StringBuffer类的构造器

//默认构造器,创建一个容量为16的字符缓冲区
StringBuffer s1 = new StringBuffer();//创建一个指定大小的字符串缓冲区
StringBuffer s2 = new StringBuffer(100);//创建一个指定内容的字符串缓冲区
StringBuffer s3 = new StringBuffer(String str); 

4.4StringBuffer类与String类的互相转换 

String——>StringBuffer

//String ->StringBuffer
//方式一,通过构造器
String str = "hello world";
//返回的是StringBuffer对象,对str本身没有影响
StringBuffer strb = new StringBuffer(str);
//方式二,使用append方法
StringBuffer strb2 = new StringBuffer();
strb2 = strb2.append(str);

 StringBuffer——>String

StringBuffer strb = new StringBuffer("hello world");
//方法一,使用toString方法
String s = strb.toString();
//使用构造器来搞定
String s1 = new String(strb);

4.5StringBuffer方法 

appned方法 

StringBuffer strb = new StringBuffer("hello world");
strb.append(",");
System.out.println(strb);

delete方法

StringBuffer strb = new StringBuffer("hello world");
//delete(int start, int end)
//删除索引>=start &&  < end处的字符strb.delete(5,strb.length());
System.out.println(strb);

replace函数

StringBuffer strb = new StringBuffer("hello world");
//replace(int start, int end, String str)
//将索引在[start,end)之间的字符替换为字符串 strstrb.replace(1,2,"hello");
System.out.println(strb);

indexOf方法

StringBuffer strb = new StringBuffer("hello world");
//indexOf(String str)
//必须传递String参数,否则需要使用toString方法
//返回指定的字串在字符串中第一次出现的索引
System.out.println(strb.indexOf("l"));StringBuffer strb = new StringBuffer("hello world");
StringBuffer str1 = new StringBuffer("l");
System.out.println(strb.indexOf(str1.toString()));

insert方法

StringBuffer strb = new StringBuffer("hello world");
StringBuffer str1 = new StringBuffer("李");
//insert(index,String str)
//下面两种写法都可以
//索引为index的内容自动后移System.out.println(strb.insert(5,str1));
System.out.println(strb.insert(5,str1.toString()));

五、StringBuilder类

5.1什么是SrringBuilder类

        一个可变的字符序列,这个类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全的),这个类被设计用作StringBuffer的一个简易替换。建议优先采用该类,因为在大多数实现中,它比StringBuffer类要快。

        StringBuffer类和StringBbuilder均代表可变的字符序列,方法是一样的。StringBuilder的方法没有做互斥处理,所以在单线程的情况下使用。

5.2String、StringBuiler与StringBuffer类的比较

  1. StringBuilder与StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
  2. String:不可变字符序列,效率低,但是复用率高。
  3. StringBuffer:可变字符序列,效率较高,线程安全。
  4. StringBuilder:可变字符序列,效率最高,线程不安全。
  5. String使用的注意说明:
    1. String s = 'a';创建了一个字符串,再执行s += 'b';这样的指令实际上把原来的'a'丢弃了,现在又产生了一个字符串s + "b"。如果多次执行这样改变字符串的操作,会导致大量的副本字符串对象存留在内存中。所以,如果要对String进行大量的修改,建议不适用String。

        结论就是:

  1. 如果字符串存在大量修改操作,使用StringBuffer或者StringBuilder。
  2. 如果字符串存在大量的修改操作,并且在单线程的情况下,使用StringBuilder。
  3. 如果字符串存在大量的修改操作,并且是多线程的情况,使用StringBuffer。
  4. 如果我们字符串很少修改,并被多个对象引用,则使用String,比如说配置信息等。

        

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

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

相关文章

Python:使用随机森林分类器进行模型评估:ROC 曲线与 AUC 指标计算

前言 这段代码的目标是使用 随机森林分类器&#xff08;Random Forest Classifier&#xff09; 来进行二分类任务&#xff0c;并基于每个数据子集计算 ROC 曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;以及 AUC&#xff08;Area Under Curve&#xf…

【JAVA练习】力扣1232.缀点成线

题目&#xff1a; 解题思路&#xff1a; 直线上面的点满足公式&#xff1a;&#xff0c; 如果所有点在一条直线上&#xff0c;即任意两点的斜率相同&#xff0c;由于计算斜率存在精度的问题&#xff0c;可以将除法等价于乘法。 等价于 class Solution {public boolean che…

【SKFramework框架核心模块】3-12、网络请求模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

C# 反射(Reflection)

文章目录 前言一、反射的优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 二、反射的用途&#xff08;一&#xff09;查看特性&#xff08;attribute&#xff09;信息&#xff08;二&#xff09;审查集合中的各种类型并实例化&#xff08;三&#xff09;实…

Jdk配置、maven配置、gradle配置、Java开发常用的依赖库

一、配置JDK环境变量&#xff1a; 1. 安装 JDK 首先确保已经安装了 JDK。如果还没有安装&#xff0c;可以从 Oracle 官网 或者 AdoptOpenJDK 下载并安装合适的 JDK 版本。 我建议下载这个&#xff1a;https://adoptium.net/zh-CN/temurin/releases/?oswindows&archx64&…

【AI系统】FBNet 系列

FBNet 系列 本文主要介绍 FBNet 系列&#xff0c;在这一章会给大家带来三种版本的 FBNet 网络&#xff0c;从基本 NAS 搜索方法开始&#xff0c;到 v3 版本的独特方法。在本节中读者会了解到如何用 NAS 搜索出最好的网络和训练参数。 FBNet V1 模型 FBNetV1:完全基于 NAS 搜…

二十三、Linux可视管理之webmin和bt运维工具

1、webmin 基本介绍 Webmin 是功能强大的基于 Web 的 Unix/linux 系统管理工具。管理员通过浏览器访问 Webmin 的各种管理功能并完成相应的管理操作。除了各版本的 linux 以外还可用于&#xff1a;AIX、HPUX、Solaris、Unixware、Irix 和 FreeBSD 等系统安装webmin&配置 …

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置…

Transformer真的是机器人技术的基础吗?

生成式预训练Transformer&#xff08;GPT&#xff09;被吹捧为将彻底改变机器人技术。但实际应用中&#xff0c;GPT需要庞大且昂贵的计算资源、冗长的训练时间以及&#xff08;通常&#xff09;非机载无线控制&#xff0c;诸多限制之下&#xff0c;GPT技术真的实用吗&#xff1…

使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(2)

接《使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(1)》 一、添加分析组 1.1 代码实现 #添加分析组 addanalysisgroup(); set("name", "grating_R"); set("x", 0); set("y", 2.5*um); addanalysisgrou…

【Java】异常处理见解,了解,进阶到熟练掌握

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好我们今天来学习Java面向对象的的抽象类和接口&#xff0c;我们大家庭已经来啦~ 目录 1.(throws和throw&#xff09;我们不管这个异常&…

Oracle数据库 用户管理模式下的冷备份与热备份

1. 用户管理模式下的冷备份 1.1. 通过数据库相关视图查询 查实例 select instance_name,version,status,archiver,database_status from v$instance; 查数据库 select dbid,name,log_mode from v$database; 查数据文件状态 select file_name,tablespace_name,status,o…

Solon 3.0.4 发布(Spring 的替代方案,备胎计划)

Solon 框架&#xff01; 面向全场景的 Java 应用开发框架。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有灵活的接口规范与开放生态。新一代 Java 应用软件的生态基座。开放原子开源基金会&#xff0c;孵化项目。 追求&#xff1a; 更快、更小、更简单…

严格单元测试造就安全软件

在信息技术迅速发展的今天&#xff0c;软件在各个行业中扮演着至关重要的角色&#xff0c;尤其是在汽车行业&#xff0c;其中软件的可靠性和安全性直接影响到人们的生命安全。软件缺陷所带来的潜在风险不容小觑&#xff0c;尤其在涉及到自动驾驶和车辆控制等关键系统时&#xf…

基于CALMET诊断模型的高时空分辨率精细化风场模拟技术应用

在研究流场时&#xff0c;常用观测、模型风洞测试和数值模拟方法进行研究。但时常遇到研究区气象站点分布稀疏&#xff0c;不能代表周边复杂地形的风场。风洞模拟需要对地形进行实景的微缩&#xff0c;但实际过程中可能更关心近地表边界层的风场。风洞模拟一方面费用较高&#…

手写签名OCR识别-提升文档处理效率

随着数字化办公和智能化管理的普及&#xff0c;企业在日常业务中处理的各类单据和文件数量与日俱增。这些文件不仅包括了繁琐的文字信息&#xff0c;还涉及到重要的签名和印章等手写元素。尤其是在合同、协议、发票、审批单等文档中&#xff0c;手写签名不仅是身份确认的重要标…

Flutter:webview打开网页

官方文档地址 下方代码来自官方文档&#xff0c;先简单记录下如何通过webview打开某个http地址 添加权限&#xff1a;android/app/src/main/AndroidManifest.xml <uses-permission android:name"android.permission.INTERNET"/>pubspec.yaml webview_flutter: …

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…

重生之我在异世界学编程之C语言:初识一维和二维数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文数组的基本类型&#xff1a;一维…

Ubuntu 新加硬盤分區

1. 查看系統是否識別新的硬盤 lsblk 假設硬盤的名字為&#xff1a;sudo fdisk /dev/sda 注意硬盤類型為gpt&#xff0c;大小沒有限制 2. 硬盤分區 sudo fdisk /dev/sda 根據提示&#xff1a; n 新加分區&#xff0c;設置分區大小。 p 查看分區情況以及大小 d: 刪除也…