String类的常见用法

article/2025/8/15 12:44:13

目录

1、创建字符串的四种方式:(方式一和方式四最常用)

2、字符串的字面量(也是字符串的对象)

3、字符串比较

4、关于字符串的常量池问题

 5、手工入池—String 类提供的 intern 方法

6、字符串的不可变性:

7、修改字符串的内容

8、字符和字符串的相互转换。

9、字符串和字节的相互转换

 10、字符串的查找

11、字符串的替换(替换操作不会修改原字符串的内容)

 12、字符串的拆分操作

13.字符串的截取处理

 14、字符串的其他常用操作

15、小练习:将字符串的首字母大写处理


 JDK中String类的声明:

 String类被final修饰:被final修饰的类无法被继承,Strring 类不存在子类,这样就可以保证所有使用JDK的人,用到的String类是同一个。继承和方法覆写带来灵活性的同时,也会带来许多子类行为不一致的问题。

1、创建字符串的四种方式:(方式一和方式四最常用)

方式一:直接赋值(String str = "hello world";)

方法二:通过构造方法产生对象(String str1 = new String("hello world";))

方法三:通过字符数组产生对象

char[] data = new char[]{'a','b','c'};

String str3 = new String(data);

方式四:通过String的静态方法valueOf(任意数据类型)->转为字符串

String str4 = String.valueOf(10);

 public static void main(String[] args) {String str1 = "hello world";String str2 = new String("hello world");char[] data = new char[]{'a','b','c'};String str3 = new String(data);String str4 = String.valueOf(10);}

2、字符串的字面量(也是字符串的对象)

字面量:直接写出来的数值就称之为字面量。如10->int类型字面量;true->boolean类型字面量;

“abc”->String类型字面量->就是一个字符串的对象

 

3、字符串比较

所有引用数据类型在比较是否相等时,使用equals方法比较。JDK的常用类,都已经覆写了equals方法,直接使用即可。

a.区分大小写的比较  public boolean equals (Object object){};

b.不区分大小写的比较  public boolean equalsIgnoreCase (String  anotherString){};

c.比较两个字符串的大小关系  public int compareTo(String  anotherString){};

字符串也实现了Comparable接口,覆写compareTo方法。字符串的compareTo方法按照字符串内部的每个数组进行ASCII码的比较。

         //equals的比较是区分大小写的比较String str1 = new String("hello");String str2 = new String("hello");String str3 = new String("Hello");//trueSystem.out.println(str1.equals(str2));//falseSystem.out.println(str1.equals(str3));//equalsIgnoreCase是不区分大小写的比较//trueSystem.out.println(str1.equalsIgnoreCase(str3));//compareTo 比较两个字符串的大小String str4 = "abc";String str5 = "AbC";System.out.println(str4.compareTo(str5));

4、关于字符串的常量池问题

当使用直接赋值法产生字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象加入字符串的常量池中。当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内容在常量池中已经存在了,则此时不再新建字符串对象,而是复用已有对象 。

 

 5、手工入池—String 类提供的 intern 方法

 调用intern方法会将当前字符串引用指向的对象保存到字符串的常量池中。

(1)若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中String对象。

(2)若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址

 String str1 = new String("hello");str1.intern();String str2 = "hello";System.out.println(str1 == str2);

  String str1 = new String("hello");str1 = str1.intern();String str2 = "hello";System.out.println(str1 == str2);

        char[] data = new char[]{'a','b','c'};String str1 = new String(data);str1.intern();String str2 = "abc";System.out.println(str1 == str2);

 

6、字符串的不可变性:

指的是字符串的内容不可变,而不是字符串的引用不可变。 

String类的所有针对字符串的操作方法都不会修改原字符串,而是产生了一个新的字符串!

        String str = "hello";str = str + "world";str += "!!!";System.out.println(str);

这里的不可变指的是“hello”、“world”、“helloworld”、“!!!”、“helloworld!!!” 这些字符串对象一旦声明后就无法修改其内容。

 为什么字符串的对象无法修改内容而其他类的对象能修改内容?

 字符串保存的值实际在数组中保存,String类外部无法访问这个value数组(String并没有提供关于value属性的getter 和setter方法,对于String类的外部而言,value完全无法使用)

7、修改字符串的内容

(1)在运行时通过反射破坏value数组的封装(了解,不推荐)

(2)更换使用StringBuilder 或者StringBuffer类。(若需要频繁进行字符串的拼接,使用StringBuiler类的append方法)

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("hello");stringBuilder.append("world");stringBuilder.append("!!!");System.out.println(stringBuilder);}

关于StringBuilder类的具体应用:

StringBuilder类和String类是两个独立的类,StringBuilder就是为了解决字符串拼接问题产生的。因为String的对象无法修改内容,为了方便字符串的拼接操作,产生了StringBuilder类,StringBuilder类的对象是可以修改内容的。

(2-1)StringBuilder 和String 类的相互转换

//String类变为StringBuilder类//(1)构造方法StringBuilder stringBuilder = new StringBuilder("ABC");//(2)append方法拼接stringBuilder.append("hello");//StringBuilder类还原为String类String str = stringBuilder.toString();System.out.println(str);

 (2-2)因为StringBuilder类可以修改内容,因此具备一些String类不具备的修改内容的功能(除append方法外)

a.字符串反转操作,StringBuilder类提供的reverse();

 

 b.删除指定范围的数据  delete(int start, int end):  [start , end)

 c.插入操作 insert(int start,各种数据类型):将新元素插入当前对象,插入后新元素的起始索引为start。

        StringBuilder stringBuilder = new StringBuilder("hello");stringBuilder.append("world");//字符串反转操作,StringBuilder类提供的reverse()方法//  stringBuilder.reverse();//删除指定范围内的数组[)stringBuilder.delete(5,10);//插入操作  hello10stringBuilder.insert(5,10);//heFly llo10stringBuilder.insert(2,"Fly ");//还原为字符串String str = stringBuilder.toString();System.out.println(str);

(2-3)String、StringBuilder、StringBuffer的区别

a.String的对象无法修改,StringBuilder、StringBuffer的对象的内容可以修改

b.StringBuilder线程不安全,但性能较高;StringBuffer线程安全,但性能较差。


8、字符和字符串的相互转换。

字符串的内部实际上就是使用字符数组存储的。

(1)字符数组转为字符串

a.通过构造方法

b.将字符数组的部分内容转为字符串对象  public String(char value[], int offset,int count) {};

(2) 字符串转为字符数组(非常重要!)

a.取出字符串中指定索引的字符  public char charAt(int index){};

b.将字符串中的内容转为字符数组  (String -> char[])  public char[] toCharArray(){};

此时产生了一个新的字符数组,将字符串的内容复制过去的,原字符串的内容不变!

public static void main(String[] args) {//将字符串中的内容转为字符数组String str = "hello";char[] data = str.toCharArray();System.out.println(data);data[0] = 'H';//字符串内容不可变System.out.println(str);//        //取出字符串中指定索引的字符
//        String str = "hello";
//        //取出索引为2的字符->l
//        System.out.println(str.charAt(2));//        //将字符数组的部分内容转为字符串对象
//        char[] ch = new char[]{'a','b','c'};
//        //offset表示字符数组开始的索引;count表示转换的字符个数
//        String str = new String(ch,1,2);
//        System.out.println(str);//        //构造方法
//        char[] ch = new char[]{'a','b','c'};
//        String str = new String(ch);
//        String str1 = String.valueOf(ch);
//        System.out.println(str);
//        System.out.println(str1);}

 (3)如何判断一个字符串的对象是由纯数字组成的?

public class StringInterconersion {//传入一个String对象,判断是否由纯数字组成public static boolean isNumber(String str){//首先转为字符数组处理char[] data = str.toCharArray();//循环遍历data中的每个字符,判断这个字符是否是数字字符//['0'...'9']for (int i = 0; i < data.length; i++) {//找到反例
//            if (data[i] < '0' || data[i] > '9') {
//                return false;
//            }//JDK中的实现   Character是char的包装类,// isDigit()方法判断字符data[i]是否是数字if(!Character.isDigit(data[i])){return false;}}return true;}public static void main(String[] args) {String str = "123";String str1 = "12a3";//trueSystem.out.println(isNumber(str));//falseSystem.out.println(isNumber(str1));}
}

9、字符串和字节的相互转换

(将字符串保存到文件中或者通过网络传输时都要用到字节数组)

(1)byte数组转为字符串(按照ASCII码值)

a.通过构造方法

 b.将byte数组的部分内容转为字符串对象  public String(byte bytes[], int offset,int length) {};

 (2)字符串转为byte数组

a.将字符串以字节数组的形式返回(按照当前默认的编码格式) public byte[] getBytes(){};

b.按照指定的编码格式转为字节数组  public byte[] getBytes( String charsetName) throws unsupportedEncodingException

在UTF-8编码下,一个汉字3个字节;在GBK编码下,一个汉字两个字节

 10、字符串的查找

a.判断一个子字符串是否存在 public boolean contains(CharSequence s){};

b.判断是否以指定字符串开头 public boolean startWith(String prefix){};

c.判断是否以指定字符串结尾  public boolean endWith(String suffix){};

 public static void main(String[] args) {String str = "hello world";//判断str中是否包含子字符串“hello”System.out.println(str.contains("hello"));//判断str是否以指定的字符串开头(严格校验)System.out.println(str.startsWith("hello"));System.out.println(str.startsWith("hello1"));//判断str是否以指定的字符串结尾(严格校验)System.out.println(str.endsWith("world"));System.out.println(str.endsWith("world1"));//从头开始查找指定字符串的位置,查到了返回位置的开始索引,查不到返回-1;System.out.println(str.indexOf("hello"));//0System.out.println(str.indexOf("hello1"));//-1System.out.println(str.indexOf("world"));//6//从指定位置开始查找子字符串位置System.out.println(str.indexOf("hello",0));//0System.out.println(str.indexOf("hello",2));//-1System.out.println(str.indexOf(" ",3));//5//由后向前查找子字符串位置System.out.println(str.lastIndexOf("world"));//6System.out.println(str.lastIndexOf("worl3"));//-1System.out.println(str.lastIndexOf(" "));//5//从指定位置右后向查找System.out.println(str.indexOf(" ",2));//true//从指定位置开始判断是否以指定字符串开头System.out.println(str.startsWith("ello",1));}

11、字符串的替换(替换操作不会修改原字符串的内容)

public static void main(String[] args) {String str = "hello world";//将字符串中所有的“l" 替换成“—”System.out.println(str.replaceAll("l","-"));//将字符串中第一个出现的的“l" 替换成“—”System.out.println(str.replaceFirst("l","-"));}

 12、字符串的拆分操作

 public static void main(String[] args) {String str = "Hello java Hello world";//按照给定的子字符串,将字符串全部拆分String[] data1 = str.split(" ");System.out.println(Arrays.toString(data1));//若str中没有指定的拆分的子字符串,拆分后仍然得到原字符串String[] data2 = str.split("/");//[Hello java Hello world]System.out.println(Arrays.toString(data2));//1System.out.println(data2.length);//按照给定的子字符串,将字符串部分拆分,拆分后的个数为limitString[] data3 = str.split(" ",2);System.out.println(Arrays.toString(data3));}

当按照指定的字符拆分字符串得到一个空数组:传入的字符是个特殊字符,需要转义处理“\\”。

 

13.字符串的截取处理

 public static void main(String[] args) {String str = "helloworld";//从索引为5的位置开始直至末尾System.out.println(str.substring(5));//world//从索引为0的位置开始,到索引为5的位置之前结束[0, 5)System.out.println(str.substring(0,5));//hello}

 14、字符串的其他常用操作

public static void main(String[] args) {String str = " hello world hello java ";String str1 = " HELLO WORD HELLO JAVA ";System.out.println(str);//去掉字符串中的左右空格,保留中间空格System.out.println(str.trim());//字符串转大写System.out.println(str.toUpperCase(Locale.ROOT));//字符串转小写System.out.println(str1.toLowerCase(Locale.ROOT));//取得字符串长度System.out.println(str.length());//24//判断是否为空数组,但不是null,而是长度为0String str2 = "";System.out.println(str.isEmpty());//falseSystem.out.println(str2.isEmpty());//true}

15、小练习:将字符串的首字母大写处理

public class StringAnother {public static void main(String[] args) {String str = "hello";String str2 = "";String str3 = "q";System.out.println(FirstUpper(str));System.out.println(FirstUpper(str2));System.out.println(FirstUpper(str3));}public static String FirstUpper(String str){//首先判空处理if (str == null|| str.isEmpty()){return null;}//边界条件(只有一个字母)if(str.length()==1){return str.toUpperCase(Locale.ROOT);}//此时str长度大于1//截取 + 大写return str.substring(0,1).toUpperCase(Locale.ROOT)+str.substring(1);}}


http://chatgpt.dhexx.cn/article/IXepcesU.shtml

相关文章

非抢占式多级反馈队列优先级调度算法 C++实现

介绍 前段时间比较忙&#xff0c;没有更新&#xff0c;这次的也是操作系统的一个实践作业 C实现非抢占式多级反馈队列优先级调度算法&#xff0c;希望可以帮到你们。 问题介绍 这里我用课件里的内容 1.应设置多个就绪队列&#xff0c;并为每个队列赋予不同的优先级。第一个队…

多级反馈队列算法补充

http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-mlfq.pdf 本文是多级反馈队列&#xff08;multi-level feedback queue&#xff0c;MLFQ&#xff09;算法的一些小补充&#xff08;两个缺陷与修改方法&#xff09;&#xff0c;参考了上面链接。因为自己用中文没有搜到想要的…

操作系统-多级反馈队列

概述 1962年&#xff0c;Corbato首次提出多级反馈队列&#xff0c;应用于兼容时分共享系统(CTSS)。Corbato因在CTSS中的贡献和后来在Multics中的贡献&#xff0c;获得了ACM颁发的图灵奖(Turing Award)。该调度程序经过多年的一系列优化&#xff0c;出现在许多现代操作系统中。 …

操作系统学习(二):浅析多级反馈队列MLFQ

目录 0、引言 1、多级反馈队列&#xff08;MLFQ&#xff09;的基本规则 2、MLFQ的规则具体说明 3、MLFQ调优及其他问题 4、总结 0、引言 在上篇文章操作系统学习&#xff08;一&#xff09;&#xff1a;浅析操作系统进程调度算法中讲到&#xff0c;在一个通用的操作系统中…

多级反馈队列调度算法(附Python3实现代码)

一、多级反馈队列调度算法 多级反馈队列调度算法是进程调度的一种算法&#xff0c;该调度算法可以不用事先知道各种进程所需的执行时间&#xff0c;还可以较好的满足各种类型进程的需要&#xff0c;是目前共认的一种较好的进程调度算法。 那你可能马上就要问了&#xff0c;多…

调度:多级反馈队列

多级反馈队列&#xff08;Multi-level Feedback Queue, MLFQ&#xff09;是有Corbato在1962年提出的&#xff0c;用于兼容时分共享系统。现在其经过多年的优化&#xff0c;已经被应用于很多现代操作系统中。多级反馈队列是为了解决两方面问题。一&#xff1a;优化周转时间。在之…

多级队列调度和多级反馈队列调度算法的实现

多级队列调度算法 操作系统实验导航 实验一&#xff1a;银行家算法 https://blog.csdn.net/weixin_46291251/article/details/115384510 实验二&#xff1a;多级队列调度和多级反馈队列调度算法 https://blog.csdn.net/weixin_46291251/article/details/115530582 实验三&…

多级反馈队列调度算法模拟实现

实验一 多级反馈队列调度算法 一. 主要实现方法和代码介绍 ​ 1.编写进程类,其只包含所需的运行时间和进程编号两个属性,还有一个运行方法,此方法就是将所需的运行时间属性减去.传入的运行时间. ​ 2.创建进程函数:创建maxp个进程,(应该不超过10,在此创建九个,即暂时不进行进…

计操实验 多级反馈队列C语言

计操实验 多级反馈队列C语言 需求&#xff1a; 1.队列4级&#xff0c;每一级的队列长度均为10&#xff1b;第一级的时间片为T&#xff0c;第二级的时间片为2T&#xff0c;第三级的时间片为4T&#xff0c;第四级的时间片为8T&#xff1b;&#xff08;T的大小自己定&#xff09; …

【操作系统】轮转和多级反馈队列

随着计算机的技术逐渐步入家用后&#xff0c;新的调度指标接踵而来&#xff0c;周转时间已经不能满足人们日常工作的需求&#xff0c;更多时候人们更希望计算机能有更好的交互性&#xff0c;使其能更快地去响应任务&#xff0c;由此针对优化响应时间的调度策略也遍地开花&#…

多级反馈队列调度算法(c++)

如果对你有帮助&#xff0c;可以给卑微的博主留个赞、关注、收藏 (不是) (骗一下数据&#xff0c;说不定以后面试就过了&#xff0c;拜谢) 操作系统基本调度算法&#xff0c;多级反馈队列调度算法。在划分时间片的调度算法中&#xff0c;多级反馈队列算法兼顾提高系统吞吐…

多级反馈队列调度算法

实验目的&#xff1a; 在Linux下编程实现多级反馈队列调度算法&#xff0c;采用三级调度策略&#xff0c;所有进程先按到达顺序进入一级队列&#xff0c;按照时间片为2轮转一次&#xff0c;一个时间片内未完成的进程被依次移入二队列尾部。当一级队列中没有进程时&#xff0c;开…

多级反馈队列调度

多级反馈队列 ​ 多级反馈队列&#xff08;Multi-level Feedback Queue&#xff0c; MLFQ&#xff09;&#xff0c;与上个世纪70年代提出&#xff0c;主要应用于时分共享系统。主要解决两方面问题&#xff1a;一个是优化周转时间&#xff0c;一个是要给用户很好的交互体验。ML…

多级反馈队列算法

步骤&#xff1a; 0时刻&#xff0c;P1到达就绪队列&#xff08;时间片为4的&#xff09;P1先执行2ms&#xff0c;P2到达还未到时间片&#xff0c;P1继续执行2ms后&#xff0c;时间片到达了&#xff0c;P1滑到下一个就绪队列&#xff08;时间片为6的&#xff09;此时&#xff…

linux多级反馈队列的实现,多级反馈队列调度算法详解

通常在使用多级队列调度算法时&#xff0c;进程进入系统时被永久地分配到某个队列。例如&#xff0c;如果前台和后台进程分别具有单独队列&#xff0c;那么进程并不从一个队列移到另一个队列&#xff0c;这是因为进程不会改变前台或后台的性质。这种设置的优点是调度开销低&…

对数线性模型

http://blog.csdn.net/pipisorry/article/details/52788947 特征和指示特征 对数线性模型log linear model 对数线性模型有&#xff1a;最大熵模型和逻辑斯谛回归。 [概率图模型原理与技术] [PGM&#xff1a;无向图模型&#xff1a;马尔可夫网 ] 皮皮blog 最大熵模型的一般形式…

广义线性模型(Generalized Linear Model)之三:Poisson回归

广义线性模型&#xff08;Generalized Linear Model&#xff09;之三&#xff1a;Poisson回归 一、泊松回归&#xff08;Poisson regression&#xff09;简介&#xff08;一&#xff09;泊松回归&#xff08;二&#xff09;计数数据&#xff08;三&#xff09;泊松分布1&#x…

MIT自然语言处理第五讲:最大熵和对数线性模型

MIT自然语言处理第五讲&#xff1a;最大熵和对数线性模型&#xff08;第一部分&#xff09; 自然语言处理&#xff1a;最大熵和对数线性模型 Natural Language Processing: Maximum Entropy and Log-linear Models 作者&#xff1a;Regina Barzilay&#xff08;MIT,EECS Depar…

机器学习教程 之 线性模型:线性回归、对数几率回归、线性判别分析

常用的三个线性模型的原理及python实现——线性回归&#xff08;Linear Regression&#xff09;、对数几率回归&#xff08;Logostic Regression&#xff09;、线性判别分析&#xff08;Linear Discriminant&#xff09;。 这可能会是对线性模型介绍最全面的博客 文章目录 一、…

机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

一、线性回归 线性回归&#xff08;linear regression&#xff1a;试图学得一个线性模型以尽可能准确地预测实值输出标记。 1.最简单的形式&#xff1a;输入属性的数且只有一个&#xff0c; 最小二乘法&#xff1a;基于均方差误差最小化来进行模型的求解&#xff0c;在线性回…