本次学习的目标
掌握String类的两种实例化方式
掌握String的两种比价操作
深入分析String类两种那个实例化方式的区别
掌握String的使用特点
掌握String类的常用方法
具体内容
1.实例化String对象
我们新建一个项目StringDemo,再新建类StringDemo01
一:直接赋值
publicclassStringDemo01 {
publicstaticvoidmain(String[] args) {
Stringname="xiaoqiu";
}
}
二:通过关键字new
publicclassStringDemo01 {
publicstaticvoidmain(String[] args) {
String name =newString("xiaoqiu");
}
}
通过两种方式实例化结果是相同的。
2.String内容的比较
我们在前面基础数据类型中使用”==”进行数据的比较。我们来回顾一下。
publicclassStringDemo02 {
publicstaticvoidmain(String[] args) {
intx = 10 ;
inty = 10 ;
}
}
运行结果:
可以看到结果为true
那么我们再来看看String内容的比较
publicclassStringDemo03 {
publicstaticvoidmain(String[] args) {
String str1 ="a";//直接赋值
String str2 =newString("a") ;//通过new赋值
Stringstr3= str2 ;//传递赋值
}
}
运行结果:
可以看到两个是false,一个是true,这是为什么呢?
下面我们来分析一下内存。
因为我们是使用判断相等,是判断地址空间是否相等,判断的是地址值,所以,才会显示这样的结果。
如果呀想判断其内容是否相等,则就必须使用String类中提供的equals()方法完成,此方法使用如下。
publicclassStringDemo04 {
publicstaticvoidmain(String[] args) {
String str1 ="a";//直接赋值
String str2 =newString("a") ;//通过new赋值
String str3 =str2 ;//传递赋值
}
}
运行结果:
这时就可以看到结果都为true了
结论:String有两种比较方式
一种是使用“==”完成,比较的是地址值
另一种是使用“equals”方法完成,比较的事具体的内容,开发中比较常用到
3.两种实例化方式的区别
在String中可以使用直接赋值和new调用构造方法的方式完成,那么要哦使用哪种更为合适呢?如果要想解决这样的问题,则必须从字符串的特征说起。
一个字符串就是String的匿名对象
publicclassStringDemo05 {
publicstaticvoidmain(String[] args) {
}
}
字符串是实例化对象,才能调用equals方法,所以输出true
了解此处之后,实际上之前的操作
String name = “xiaoqiu”
就是表示将一个堆内存空间的指向给了栈内存空间
只有掌握这一点之后才可以分析出使用能够哪种实例化方式更合适,例如现在有一下的题目:
publicclassStringDemo05 {
publicstaticvoidmain(String[] args) {
//声明三个字符串变量,每个变量的内容都一样
String str1 ="hello";//直接赋值
String str2 ="hello";//直接赋值
String str3 ="hello";//直接赋值
}
}
可以看到结果都为true,这证明三个字符串的内存地址一样
直接赋值的方法,再开辟对空间之后,不管有多少个字符串,只要内容相同,指向的内存地址就是一样的,这样可以有效的节省内存。
那么,如果我们使用new String()的方式呢?
String str2 =newString("hello") ;
这样是开辟了两个空间
因为"hello"开辟了一个空间,new又开辟了另一个空间。
使用直接赋值的方式只需要一个实例化对象即可,而使用new String()的方式则意味着要开辟两个内存对象,开发中最好使用直接㢟的方式完成。
4.字符串的内容不可改变
这是一个重要的特征
publicclassStringDemo06 {
publicstaticvoidmain(String[] args) {
String str ="hello";//声明字符串
str = str +"world";//修改字符串
System.out.println("str = "+ str);//输出
}
}
我们可以看到字符串内容是改变了,但是字符串改变的是堆内存的指向。
实际上字符串内容的改变,改变到的是内存地址的引用关系
所以在开发中应该避免如下的使用操作。
publicclassStringDemo07 {
publicstaticvoidmain(String[] args) {
String str ="xiaoqiu";//声明字符串对象
for(inti = 0;i
str += i;//字符串到的引用不断改变
}
}
}
这样的操作,要断开连接引用100次才可以完成,这样的操作性能很低。应该避免使用,而如果非要使用这种操作,在JAVA常用类库中又StringBuffer类专门完成这样的功能。
5.String类中的常用方法
其中Sqlit()和reqalceAll()这两个方法式乣正则支持的,关于正则的应用。
5.1字符数组与字符串
一个字符串可以变为一个字符数组,同样,也可以把一个字符数组,变为一个字符串。在String类中提供了一下的操作方法。
将字符串变为字符数组:publicchar[] to CharArray()
字符数组变为字符串: public Strin(char[] value)
public String(char[] value,int offset,int count)
publicclassStringDemo08{
publicstaticvoidmain(String args[]){
String str1 ="hello";//定义字符串
charc[] = str1.toCharArray() ;//将一个字符串变为字符数组
for(inti=0;i
}
System.out.println("") ;//换行
String str2 =newString(c) ;//将全部的字符数组变为String
String str3 =newString(c,0,3) ;//将部分字符数组变为String
System.out.println(str2) ;//输出字符串
System.out.println(str3) ;//输出字符串
}
};
运行结果:
5.2从字符串中取出制定位置的字符
如果要想使用此操作,则肯定此方法的返回值是一个char类型。public char cahrAt(int index)
publicclassStringDemo09{
publicstaticvoidmain(String args[]){
String str1 ="hello";//定义String对象
System.out.println(str1.charAt(3)) ;//取出字符串中第四个字符
}
};
运行结果:
5.3字符串与byte数组的转换
byte数组(字节数组),在一般的IO操作中会经常使用到
在String类中提供农了一下的方法可以进行字符串与字节数组间的转换:
字符串变为字节数组:publicbyte[] getBytes()
将一个字节数组变为字符串:
将去阿奴字节数组变为String:publicString(byte[] bytes)
将部分字节数组变为String:publicString(byte[] bytes,int offset,int length)
publicclassStringDemo10{
publicstaticvoidmain(String args[]){
String str1 ="hello";//定义字符串
byteb[] = str1.getBytes() ;//将字符串变为byte数组
System.out.println(newString(b)) ;//将全部的byte数组变为字符串
System.out.println(newString(b,1,3)) ;//将部分的byte数组变为字符串
}
};
运行结果:
5.4取得一个字符串的长度
要想取得字符串的长度:punliic int lenggth()
publicclassStringDemo11{
publicstaticvoidmain(String args[]){
String str1 ="hello xiaoqiu";//定义字符串变量
}
}
运行结果:
5.5查找指定的字符串是否存在
在实际操作中,经常会使用到判断一个字符串是否存在某些内容,此时就可以使用以下的方法:
从头开始查找:public intindexOf(String str)
从指定位置开始查找:public intindexOf(String str,int fromIndex)
查找的时候方法的返回值事宜个int类型的数据,此数据表示的是一个字符串的具体位置,如果没有查找到此字符串,则返回“-1”
publicclassStringDemo12{
publicstaticvoidmain(String args[]){
String str1 ="abcdefgcgh";//声明字符串
System.out.println(str1.indexOf("c")) ;//查到返回位置
System.out.println(str1.indexOf("c",3)) ;//查到返回位置,从第4个位置开始查找
System.out.println(str1.indexOf("x")) ;//没有查到返回-1
}
}
运行结果:
5.6去掉空格
如果假设一些信息是由用户输入的话,则就有可能出现多余的空格,在这种操作中就可以使用trim()去掉字符串的左右空格,但是字符串中间的空格是不可能去掉的。
publicclassStringDemo13{
publicstaticvoidmain(String args[]){
String str1 =" hello ";//定义字符串
System.out.println(str1.trim()) ;//去掉左右空格后输出
}
}
运行结果:
5.7字符截取
从一个指定的字符串取出里面的部分内容,使用的方法:
从制定位置开始一直截取到结束位置:publicString substring(int beginIndex)
截取指定范围的字符串:punlicString substring(int beginIndex,int endIndex)
publicclassStringDemo14{
publicstaticvoidmain(String args[]){
String str1 ="hello world";//定义字符串
System.out.println(str1.substring(6)) ;//从第7个位置开始截取
System.out.println(str1.substring(0,5)) ;//截取0~5个位置的内容
}
}
运行结果:
5.8拆分字符串
如果现在需要按指定的字符串去拆分一个字符串的话,则使用:
public String[] split(String regex)
publicclassStringDemo15{
publicstaticvoidmain(String args[]){
String str1 ="hello world";//定义字符串
String s[] =str1.split("") ;//按空格进行字符串的拆分
for(inti=0;i
}
}
}
运行结果:
5.9大小写转换
此功能在一般额开发语言中都会存在,将一个大写的字符串全部字母变为小写或者将以个小写的字符串中的全部字母变为大写
小写变大写:publiic StringtoUpperCase()
大写变小写:public StringtoLowerCase()
publicclassStringDemo16{
publicstaticvoidmain(String args[]){
}
}
运行结果:
5.10判断是否以指定的字符串开头或结尾
在String中可以使用以下的两个方法完成:
判断是否以指定的字符串开头:publicboolean startsWith(String prefix)
判断是否以指定的字符串结尾:publicboolean endsWith(String suffix)
publicclassStringDemo17{
publicstaticvoidmain(String args[]){
String str1 ="**HELLO";//定义字符串
String str2 ="HELLO**";//定义字符串
if(str1.startsWith("**")){//判断是否以“**”开头
}
if(str2.endsWith("**")){//判断是否以“**”结尾
}
}
}
运行结果:
5.11不区分大小写的比较
在String类中equals()方法式可以用来进行字符串比较的,但是此种比较方法只能针对于大小写完全一样的字符串进行比较,如果现在要是想进行不区分大小写的比较,则可以使用以下的方法:
public booleanequalsIgnoreCase(String anotherString)
publicclassStringDemo18{
publicstaticvoidmain(String args[]){
String str1 ="HELLO";//定义字符串
String str2 ="hello";//定义字符串
+str1.equalsIgnoreCase(str2)) ;//不区分大小写的比较
}
}
运行结果:
5.12字符串替换功能
在String类中提供以下的方法用于字符串的替换操作
public StringreplaceAll(String regex,String replacement)
publicclassStringDemo19{
publicstaticvoidmain(String args[]){
String str ="hello";//定义字符串
String newStr= str.replaceAll("l","x") ;//现在将所有的l替换成x
}
}
运行结果:
总结
1.String要使用直接赋值的方式,以为使用new会开辟两个空间,造成内存浪费
2.一个字符串就是String的匿名对象
3.字符串的比较有两种方式:==、equals
4.掌握String中最常用的操作方法
关爱IT人,关注挨踢栏
领取专属 10元无门槛券
私享最新 技术干货