代码如下:
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();i0;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;i0;i--){
//j为子串的脚标
for(int j=0;jlen-i+1;j++){
str3=str1.substring(j,j+i);
if(str2.contains(str3))
break outer;
}
}
return str3;
}
}