对于java程序中的字符串直接常量,jvm会使用一个字符串池来保存它们。当第一次使用某个字符串直接常量时,jvm会将它放入字符串池中进行缓存。在一般情况下,字符串池中的字符串对象不会被垃圾回收。当程序再次需要使用该字符串时,无需重新创建一个新的字符串就可以直接让引用变量直接指向字符串中已有的字符串。而使用new操作创建的字符串对象不指向字符串池中的对象,但是可以使用intern()方法使其指向字符串池中的对象。
public class stringdemo1 { public static void main(string[] args){ string str1 ="abc"; string str2 ="abc"; string str3 =new string("abc"); system.out.println(str1==str2);//true system.out.println(str1==str3);//false } }
常见问题
string str3 =new string("abc");
创建了几个对象?
答:两个
string str ="ab"+"cd";
创建了几个对象?
答:一个。"ab"和"cd"都是常量被放在字符串池中。因此只创建了一个abcd字符串池中并将字符串abcd保存在字符串池中。
public class stringdemo1 { public static void main(string[] args){ string str1 ="ab"; string str2 ="cd"; string str3 ="ab"+"cd";//创建对象并加入字符串池 string str4 =str1+str2; string str5 =str1+"cd"; system.out.println(str3==str4);//false system.out.println(str3==str5);//false } }
由上面代码可知:只有引号包含文本的方式才创建的string对象才能被添加到字符串池中,对于包含new方法新建对象的”+“连接表达式他所产生的新对象不会被加到字符串池中。
但是有一种情况需要引起我们的注意:
public class stringdemo1 { private final static string str1 ="ab"; private final static string str2 ="cd"; public static void main(string[] args){ string str3 ="ab"+"cd";//创建对象并加入字符串池 string str4 =str1+str2; string str5 =str1+"cd"; system.out.println(str3==str4);//true system.out.println(str3==str5);//true } }
这又是为什么呢?原因是这样的,对于常量来讲。它的值是固定的,因此在编译期间就能被确定了。
将上面的代码稍加改变看看会出现什么情况。
public class stringdemo1 { private final static string str1 ; private final static string str2; static{ str1="ab"; str2="cd"; } public static void main(string[] args){ string str3 ="ab"+"cd";//创建对象并加入字符串池 string str4 =str1+str2; string str5 =str1+"cd"; system.out.println(str3==str4);//false system.out.println(str3==str5);//false } }
str1和str2虽然被定义为常量,但是她们美誉马上赋值,在运算出s的值前,她们何时被赋值,以及被赋什么值都是变数,因此性质和变量一样。只能在运行时被创建。
2.字符串方法
获取方法
•int length()
•char charat(int index)根据位置获取某个字符
•int indexof(int ch) 返回的是ch在字符串中第一次出现的位置
•int indexof(int ch,int fromindex)从fromindex指定位置开始,获取ch在字符串中第一次出现的位置
•int indexof(string str)
•int indexof(string str,int fromindex)
•int lastindexof(int ch)
判断方法
•boolean contains(string str) 另一种判断方法:if(str.index(str)!=-1)
•boolean startswith(string str)
•boolean endswith(string str)
•bolean isempty(string str)
•boolean equals(string str)
•boolean equalsignorecase(string str);
转换方法
•将字符数组转换为字符串
构造函数
1.string(char[] chs)
2.string(char[] chs,offset,count)将字符数组中的一部分转成字符串。
静态方法
1.static string copyvalueof(char[] chs)
2.static string copyvalueof(char[] chs,int offset,int count)
3.static string valueof(char[] )
4.static string valueof(char[] chs,int offset,int count)
•将字符串转换成字符数组
char[] tochararray
•将字符数组转换成字符串
•将字符串转换成字节数组
byte[] tobytes
替换方法
string replace(olderstr,newstr)
切割方法
string split(regex)
获取子串[编辑分类]
string substring(begin)
string substring(begin,end)包含头不包含尾
将字符串转换成大小写android(10)
string touppercase()
string tolowercase()
将字符串两端的空格去除
string trim()
对两个字符串进行自然顺序的比较
int compareto(string str)
3.string 练习
1.字符串翻转
public class stringdemo2 { public static void main(string[] args){ string str = "avdkfasjks"; reversemethod_1(str); } public static void reversemethod_1(string str){ for(int i=str.length();i>0;i--){ system.out.print(str.charat(i-1)); } } }
2.获取最大相同子串
public class stringdemo2 { public static void main(string[] args){ string str1 = "avdkfasjks"; string str2 = "ewavdrtte"; system.out.println(commonmaxsubstring(str1, str2)); } public static string commonmaxsubstring(string str1,string str2){ int len = str1.length(); string str3 = null; outer: //i为子串的长度 for(int i = len;i>0;i--){ //j为子串的脚标 for(int j=0;j<len-i+1;j++){ str3=str1.substring(j,j+i); if(str2.contains(str3)) break outer; } } return str3; } }
以上就是java字符串详解的实例介绍的内容。
