找回密码
 会员注册
查看: 44|回复: 0

Java第二讲:字符串相关类

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
73602
发表于 2024-9-3 20:04:26 | 显示全部楼层 |阅读模式
个人主页:深情秋刀鱼@-CSDN博客 Java专栏:Java程序设计目录 一、String1.Java中的数据类型2.字符串概述3.字符串构造方法4.字符串构造内存原理 5.字符串比较6.字符串常见方法二、StringBuilder 1.定义2.常用方法 3.StringBuilder内存分析三、StringJoiner1.定义2.常用方法 一、String1.Java中的数据类型        在Java中数据类型被分为基本数据类型和引用数据类型。基本数据类型:数值存储在自己的空间而不是堆内存或其他的空间中,如int、float、double、boolean等引用数据类型:数值存储在其他的空间,本身的空间存储的是地址值,如数组、创建的对象、字符串等。    在本节中,我们将介绍的字符串就是一种引用数据类型。2.字符串概述        a.在Java中所有字符串的定义都在java.lang.String中,在使用String定义字符串时应先导包。    //导包java.lang.String;//定义Strings="abcdef";        b.字符串参与的所有运算都属于字符串的拼接操作。由于字符串的内容自创建之后就不能改变,所以每次执行字符串的拼接操作时都会在内存中重新申请空间储存拼接后的字符串。Strings1="abc";Strings2="123";System.out.println(s1+s2);//执行结果:abc123        在执行上面的代码时一共产生了三个字符串,分别是s1("abc")、s2("123")以及拼接后新产生的字符串"abc123"。    Strings1="abc";s1="三连+关注";System.out.println(s1);//执行结果:三连+关注        c.字符串的值被创建后是无法改变的,因此在执行上面的代码时并没有改变"abc"里原本的内容,而是创建了一个新的字符串"三连+关注"并重新赋值给了s1。    d.对于没有变量参与的字符串拼接操作是不同于有变量参与的拼接操作的。如果没有变量参与,系统会检查串池,如果串池中有该字符串,直接复用,没有再开辟新的内存空间。如果有变量参与,每一行代码都会创建新的字符串。3.字符串构造方法        a.直接定义Strings1="abc";System.out.println(s1);//执行结果:abc    b.通过new关键字获取一个空字符串Strings1=newString();System.out.println("!"+s1+"!");//执行结果:!!    c.传递一个字符串,根据传递的字符串再构造一个新的字符串Strings1=newString("abc");System.out.println(s1);//执行结果:abc    d.传递一个字符数组,根据字符数组的内容构造新的字符串char[]ch={'a','b','c'};Strings1=newString(ch);System.out.println(s1);//执行结果:abc    e.传递一个字节数组,根据字节数组的内容构造新的字符串byte[]by={97,98,'c'};Strings1=newString(by);System.out.println(s1);//执行结果:abc    在字节数组中,97和98不再代表整形,而是ASCII码表中码值为97、98的符号,即a、b。4.字符串构造内存原理    在Java中内存主要被分为栈、堆、方法区三部分(如下图)。栈:主要存储方法,方法开始执行时进栈,结束执时出栈。堆:存储对象或数组,使用new关键字时是在堆内存中开辟了空间。从键盘获取的字符串也是存储在堆中。方法区:存储可执行的class文件。     在堆内存中,有一块被称作串池(StringTable)的内存空间,它是专门用来存储字符串的内存空间。    如果选择直接赋值(参考2.a)的形式构造字符串,系统会在串池中检查,如果两个字符串的内容完全相同,则直接服用已经构造好的字符串,而不会重新开辟空间存储,减少了空间浪费。Strings2="abc";Strings1="abc";//s1和s2中地址值是一样的        而如果使用new关键字构造,系统不会检查串池并直接在堆空间中开辟内存。Strings2=newString("abc");Strings1=newString("abc");//使用new关键字构造的字符串地址不同 5.字符串比较    a.如果直接用==符号比较,可能并不能反馈正确的结果。由String定义的字符串是一种引用数据类型,在String创建的对象本身的空间中存储的是地址值,而不是数据,==符号比较的是对象本身内存中的数据,因此可能会输出错误的结果。Scannersc=newScanner(System.in);//在键盘上输入"abc",输入的数据是存储在堆内存中的Strings1=sc.next();Strings2="abc";System.out.println(s1==s2);//执行结果:false    b.比较两个字符串内容是否相同可以使用String类中的equals方法。Scannersc=newScanner(System.in);//输入"abc"Strings1=sc.next();Strings2="abc";booleanres=s1.equals(s2);//equals的返回值是boolean类型System.out.println(res);//执行结果:true    c.比较两个字符串内容是否相同且忽略大小写,使用String类中的equalsIgnoreCase方法。此处的忽略大小写只针对于英文字母而不针对于中文(如"1"和"一")。Scannersc=newScanner(System.in);//输入"abc"Strings1=sc.next();Strings2="Abc";booleanres=s1.equalsIgnoreCase(s2);System.out.println(res);//执行结果:true6.字符串常见方法publiccharcharAt(intindex);根据索引(索引下标从0开始)返回字符。Strings1="abcde";charch=s1.charAt(0);System.out.println(ch);//执行结果:apublicintlength();返回字符串的长度。Strings1="abcde";intlen=s1.length();System.out.println(len);//执行结果:5Stringsubstring(intbegin,intend);从字符串中截取并返回下标从begin开始到end-1(不包含end)结束的字符串。Strings1="abcde";Stringsubs1=s1.substring(0,2);//截取下标从0~1的字符串System.out.println(subs1);//执行结果:ab二、StringBuilder 1.定义    StringBuilder可以看作一个容器,不同于String,用StringBuilder创建的对象内容是可变的,它可以提高字符串的操作效率。StringBuildersb=newStringBuilder();    括号中可传参可不传参。2.常用方法 toString();将StringBuilder类型的对象转换为String类型。StringBuildersb=newStringBuilder("abc");Strings1=sb.toString();System.out.println(s1);//执行结果:abc    需要注意的是,通过StringBuilder创建的对象无法直接使用String中的方法,需要经过toString转换才能使用String中的方法。append();向StringBuilder创建的对象中添加数据。StringBuildersb=newStringBuilder("abc");System.out.println(sb.toString());//执行结果:abcsb.append("123");System.out.println(sb.toString());//执行结果:abc123reverse();反转对象中的数据。StringBuildersb=newStringBuilder("abc123");System.out.println(sb.toString());//执行结果:abc123sb.reverse();System.out.println(sb.toString());//执行结果:321cbalength();返回容器中字符串的长度。StringBuildersb=newStringBuilder("abc123");intlen=sb.length();System.out.println(len);//执行结果:6capacity();返回目前容器的容量。一个空的StringBuilder对象默认容量时16.StringBuildersb=newStringBuilder();System.out.println(sb.capacity());//执行结果:16 3.StringBuilder内存分析        在创建StringBuilder的对象时,在内存中默认开辟容量为16的字节数组,如果载入的数据超容,则系统会自动为StringBuilder扩容,新容量=老容量*2+2=34;如果新数据超容且超出自动扩容时的容量,那么新的容量以实际为准。    需要注意的是,capacity指的是容器能容纳数据的空间大小,而length可以理解为存储在容器中的有效数据的长度。初始容量:16StringBuildersb=newStringBuilder();System.out.println(sb.capacity());//执行结果:16数据内存没有超出默认扩容的内存空间(34)sb.append("abcdefghijklmnopq");System.out.println(sb.length());//执行结果:17System.out.println(sb.capacity());//执行结果:34数据内存超出了默认扩容的内存空间sb.append("abcdefghijklmnopqrstuvwxyz123456789");System.out.println(sb.length());//执行结果:35System.out.println(sb.capacity());//执行结果:35三、StringJoiner1.定义     StringJoiner和StringBuilder一样。都可以看作一种容器,创建之后里面的内容是可变的。StringJoiner的代码编写十分简洁,可以快速有效的完成程序员指定的字符串拼接操作。StringJoiner是不支持空参构造的。StringJoinersj=newStringJoiner("---");创建一个对象,指定拼接时的间隔符号("---")。StringJoinersj=newStringJoiner("---");StringJoinersj=newStringJoiner("---","[","]");创建一个对象,指定拼接时的间隔符号("---")、开始符号("[")、结束符号("]")。StringJoinersj=newStringJoiner("---","[","]");2.常用方法publicStringJoineradd(添加的内容);添加数据,并返回数据本身StringJoinersj=newStringJoiner("---","[","]");sj.add("aaa");sj.add("bbb");sj.add("ccc");System.out.println(sj);//执行结果:[aaa---bbb---ccc]publicintlength();返回长度。这里的length同时包含间隔符号、开始符号、结束符号在内。StringJoinersj=newStringJoiner("---","[","]");sj.add("aaa");sj.add("bbb");sj.add("ccc");intlen=sj.length();System.out.println(len);//执行结果:17publicStringtoString();返回一个字符串。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-13 09:25 , Processed in 3.180402 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表