【伍】⼀篇让你搞懂Java中的字符串,两种实例化⽅式的差异以及String常⽤⽅
法的使⽤(附⽰例)
字符串⼴泛应⽤ 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串
1 String类对象的两种实例化⽅式
String并不是⼀个基本数据类型,它本⾝属于⼀个类,但是这个类在设计的过程之中加⼊了⼀些Java⾃⼰的特殊⽀持所以对于这个类的对象实例化⽅式就有两种形式:
直接赋值:String 对象=“内容”
构造⽅法;public String(String s)
//直接赋值法
String str1="Hello";
//构造⽅法
String str2=new String("World");
2 字符串⽐较
如果说现在有两个int型的变量,那么要进⾏相等的判断,则直接使⽤“==”即可。但如果现在将同样的操作形式⽤在String上呢?
String stra="hello";
String strb=new String("hello");
String strc=strb;//引⽤传递
System.out.println(stra==strb);//false
System.out.println(strb==strc);//true
System.out.println(stra==strc);//false
所以发现在程序中如果使⽤“==”⽐较的只是两个对象(任意的引⽤类型)堆内存数值,属于数值内容的⽐较并不是堆内存中保存内容的⽐较,那么要想进⾏String对象内容的⽐较则可以利⽤String类中提供的⼀个⽅发完成:
字符串⽐较:public boolean equals(String str)
String stra="hello";
String strb=new String("hello");
String strc=strb;//引⽤传递
System.out.println(stra.equals(strb));//true
System.out.println(strb.equals(strc));//true
System.out.println(strc.equals(strc));//true
拓展:请解释在String⽐较重“==”与“equals()”的区别?
==:是直接⽐较的两个对象的堆内存地址,如果相等,则说明这两个引⽤实际是指向同⼀个对象地址的.
更多内容请参考链接:
3 String类匿名对象
字符串的描述在很多语⾔之中都使⽤字符数组表⽰。在Java的设计之初为了解决这样的问题,专门提供了⼀个String类来进⾏描述。但是随着发展,为了能够让程序变得更加的,易于开发,所以在Java⾥⾯也提供双引号声明的数据,⽽这些数据,在Java中并不是普通的变量,⽽是属于String类的匿名对象。
String str="hello";
System.out.println("hello".equals(str));//true
现在发现,此时已经可以通过字符串调⽤equals()⽅法,那么就证明⼀点,字符串的确是String类的匿名对象。那么之前的String字符串对象=“字符串”;本质就是为⼀个字符串的匿名对象起了⼀个名字。
4 String类对象两种实例化⽅式⽐较(重点)
4.1 直接实例化形式分析
开辟⼀块堆内存空间,并且⼀个栈内存将直接指向该堆内存空间
String str="hello";//假设为输⼊数据
System.out.println(str);
String stra="hello";
String strb="hello";
String strc="nihao";
System.out.println(stra==strb);//true
System.out.println(stra==strc);//false
System.out.println(strb==strc);//false
补充:对象池概念(Object Pool)
在Java设计的过程之中为了⽅便⽤户的代码编写开发,针对于⼏个特殊的类使⽤了共享设计思路,其中String就属于这其中⼀员。这种设计思路是java⾃⼰的⽀持,⽽且只针对于直接赋值的情况。
在使⽤直接赋值实例化String类对象的操作之中,字符串的内容定义之后实际上会⾃动将其保存在⼀个对象池之中,后如果现在有其他的字符串对象也采⽤了直接赋值的形式,并且内容与之前的字符串内容完全相同,那么不会开辟新的堆内存空间,⽽是通过对象池知道⾃⼰有的堆内存空间地址,直接引⽤即可,所以就会造成若⼲个字符串直接赋值之后,当内容相同时,地址是完全相同的,所“==”的结果也是相同的,这样的设计就是共享设计模式。
4.2 构造⽅法实例化对象
通过此时的内存分析可以发现,如果采⽤了构造⽅法进⾏String类对象的实例化操作,那么最终将产⽣两块堆内存,其中有⼀块是垃圾空间。
String str=new String("hello");
System.out.println(str);
我们刚才有了解过对象池的概念,但是如果使⽤了构造⽅法来进⾏String类对象实例化,那么所产⽣的的对象不会保存在对象池之中,也就是说此对象⽆法重⽤。
如果⽤户需要让这个对象⼊池,只能通过⼿⼯的⽅式来实现:
⼿⼯⼊池:public String Intern()
String stra=new String("hello").intern();//构造⽅法
String strb="hello";//直接赋值
System.out.println(stra==strb);//true
拓展:解释String类两种对象实例化⽅法的区别
直接赋值:只会开辟⼀块堆内存空间,并且会⾃动保存在对象池之中,以供下次重复使⽤
构造⽅法:会开辟两块堆内存空间,其中有⼀块空间将成为垃圾,并且不会⾃动⼊池,但是⽤户可以使⽤intern()⾃动⼊池
参考链接:
5 字符串修改分析
字符串⼀旦声明则不可改变,通过“+”可实现字符串改变,下⾯请看代码和内存分析加深理解。
String str="Hello";
str+="World";
str=str+"";
System.out.println(str);//HelloWorld
可以发现整个的操作流程之中,都是String类对象的引⽤发⽣着改变,⽽字符串的内容没有改变,因此,这样的操作会产⽣垃圾,所以在实际开发中,不要进⾏频繁的修改操作。
6 String类常⽤⽅法
6.1 字符与字符串
⽅法名称类型描述
1public String(char[] value)构造将全部的字符数组作为String的内容
2public String(char[] value,int offset,int count)构造将部分的字符数组变为字符串,设置字符数组的开始索引与使⽤个数
3public char charAt(int index)普通返回指定索引位置上的字符
4public char[] toCharArray()普通将字符串以字符数组的形式返回
⽰例1:charAt()⽅法
String str="hello";
char c=str.charAt(0);
System.out.println(c);//h
//在程序中字符串索引是从0开始的
⽰例2:将字符串变为字符数组
String str="helloworld";
char[] CharArray();//将字符串变为字符数组
for(int x=0;x<data.length;x++){
System.out.print(data[x]+" ");
}//h e l l o w o r l d
//当字符串变为字符数组之后就可以针对于⾥⾯的每⼀个字符进⾏操作。
⽰例3:将字符串中的⼩写字母变为⼤写字母
String str="helloworld";
char[] CharArray();//将字符串变为字符数组
for(int x=0;x<data.length;x++){
data[x]-=32;//编码减去32,成⼤写
}
System.out.println(new String(data));
System.out.println(new String(data,5,5));//第5个索引,之后取5个长度的内容
6.2 字符串⽐较
现在⾄少应该知道了字符串⽐较有⼀个equals()⽅法,但是此⽅法本⾝是属于区分⼤⼩写的⽐较,为此在Java⾥⾯针对于字符串的⽐较实际上还有其他⽅法。
⽅法名称类型描述1public boolean equals(Object anObject)构造区分⼤⼩写的字符串⽐较2Public boolean equalsIgnoreCase(String anotherString)普通不分区⼤⼩写的字符串⽐较3public int compareTo(String anotherString)普通⽐较字符串⼤⼩
4public int compareToIgnoreCase(String str)普通不区分⼤⼩写⽐较字符串⼤⼩
⽰例1:equals
String strA="hello";
String strB="HEllo";
System.out.println(strA.equals(strB));//false
System.out.println(strA.equalsIgnoreCase(strB));//true
⽰例2:⽐较字符串⼤⼩
在进⾏字符串相等的⽐较操作之中,最为关键的⼀个⽅法是:compareTo(),这个⽅法本⾝返回⼀个int型数据,⽽这个int型数据有三种结果:⼤于(>0)、⼩于(<0)、等于(=0)
String strA="A";
String strB="a";
System.out.println(strApareTo(strB));//-32
System.out.println(strApareToIgnoreCase(strB));//0
6.3 字符串查
⽅法名称类型描述
1public boolean contains(CharSequence s)普通判断某⼀个字符串是否存在
2public int indexOf(String str)普通取得某⼀个字符串的索引位置,不到返回-1
3indexOf(String str, int fromIndex)普通从指定索引位置开始检索⼦字符串位置,不到就返回-1
4public int lastIndexOf(String str)普通从后向前查指定字符串的位置,不到返回-1
5public int lastIndexOf(String str,int fromIndex)普通从指定位置由后向前查⼦字符串的位置,不到返回-1
6public boolean startsWith(String prefix)普通判断是否以某个字符串开头
小白学java有前途吗7public boolean startsWith(String prefix,int toffset)普通从指定位置判断是否以某个字符串开头
8public boolean endsWith(String suffix)普通是否以指定的字符串结尾
⽰例1:contains()⽅法
如果要查中间的内容,那么现在基本上都使⽤contains()⽅法
String str="hello";//0:h、1:e、2:l、3:l、4:o。
ains("l")){//到此⽅法直接返回true或者是false
System.out.println("已查到!");
}
⽰例2:利⽤indexOf()⽅法判断
String str="hello";//0:h、1:e、2:l、3:l、4:o。
System.out.println(str.indexOf("l"));//2,第⼀个满⾜的位置
if(str.indexOf("l")!=-1){//现在表⽰索引查到了
System.out.println("内容已经查到到!");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论