String类:
描述字符串的java类就是String类,
想要对这个类进行对象的建立,有几种方式:
- 最简单的方法,直接用双引号来表示这个字符串。
String str=“abc”;用双引号标识就变为字符串,变成字符串就是一个对象!
因为String是一个类,str就是一个类类型的变量,类类型变量指向一个实体,所以"abc"是一个对象。 - 采用构造方法实例化的方式:
使用构造方法实例化一定要用到new关键字,而一旦使用了new就表示要分配新的内存空间。
String str = new String(“Hello”) ;
字符串的一些特殊的地方 :
字符串对象一旦被初始化就不会被改变。
例如:
String s="abc";
s="nba";
System.out.println("s="+s);
输出:s=nba
但并不是s值被改变。
而是因为:有两个字符串对象,s先指向"abc"再指向"nba",“abc"依然是"abc”。
String s="abc";
String s1="abc";
System.out.println(s==s1);//"=="表示地址
运行结果为“true”。
原因:字符串建立时,在内存中有一个字符串缓冲区(字符串常量池),如果没有就创建,如果有,就直接用。
第一次没有"abc",创建一个,并把"abc"的地址赋给s,
第二次有"abc",则直接把"abc"的地址赋给s1,
所以,s,s1实际上指向的是同一个"abc"。
两种方式的区别
如果是:
String s = "abc";
String s1 = new String("abc");
System.out.println("s="+s);
System.out.println("s1="+s1);
运行结果是:
s=abc
s1=abc
但我们再看:
String s = "abc";
String s1 = new String("abc");
System.out.println(s==s1);
它的运行结果却是:
false
原因:
String s = “abc”; 的意思是在字符串常量池中创建了一个abc字符串,并把地址赋给了s引用型变量,而String s1 = new String(“abc”);的意思是在堆内存中用new的方式创建了一个string对象,这个对象在构造时接收了一个字符串这个对象,这个动作并没有在字符串常量池中做任何事情,这个动作是在堆里创建了两个对象。所以地址是不同的。
要想比较对象是否相同,则应该:
System.out.println(s.equals(s1));
运行结果是:
true
string类中的equals复写Object中的equals建立了string类自己的判断字符串对象是否相同的依据。
其实就是比较字符串内容。
String类的匿名对象
在各个语言中并没有提供字符串的数据类型定义,很多语言都是使用字符数组来描述字符串的概念,在Java中也没有字符串的概念,只是Java自己做了简单处理。但是在Java中字符串依然不属于基本数据类型,字符串是作为String类的匿名对象的形式存在的。
字符串是匿名对象的验证:
public class StringDemo {
public static void main(String args[]) {
String str = "Hello" ;
// 通过字符串调用方法
System.out.println("Hello".equals(str)) ;
}
}
运行结果:
true
匿名对象可以调用类中的方法与属性,而以上的字符串调用了equals()方法,所以它一定是一个对象。
String常用的方法
- 字符串比较
public boolean equals(Object obj) //区分大小写的比较
public boolean equalsIgnoreCase(String anotherString) //不区分大小写的比较
public int compareTo(String anotherString) //比较两个字符串大小关系
例如:
String str1 = "Hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); //false
System.out.println(str1.equalsIgnoreCase(str2)); //true
在String类中compareTo()方法是一个非常重要的方法, 该方法返回一个整型, 该数据会根据大小关系返回三类内容:
相等: 返回0
小于: 返回内容小于0
大于: 返回内容大于0
例: compareTo()比较
System.out.println("A".compareTo("a"));//-32
System.out.println("a".compareTo("A"));//32
System.out.println("A".compareTo("A"));//0
System.out.println("AB".compareTo("AC"));//-1
compareTo()是一个可以区分大小关系的方法, 是String方法中非常重要的方法。
- 字符串查找
public boolean contains(CharSequence s) // 判断一个子字符串是否存在
public int indexOf(String str) //从头开始查找指定字符串的位置, 查到了返回位置的开始索引, 如果查不到返回-1
public int indexOf(String str, int fromIndex) //从指定位置开始查找子字符串位置
public int lastIndexOf(String str) //由后向前查找字符串位置
public int lastIndexOf(String str, int fromIndex) //从指定位置由后向前查找
public boolean startsWith(String prefix) //判断是否以指定字符串开头
public boolean startsWith(String prefix, int toffset) //从指定位置开始判断是否以指定字符串开头
public boolean endsWith(String suffix) //判断是否以指定字符串结尾
例子: 字符串查找最好用的就是contains() , 该方法是JDK1.5后开始追加的
String string = "helloworld";
System.out.println(string.contains("world"));//true
例:使用indexOf()方法进行位置查找
String str3 = "helloworld";
System.out.println(str3.indexOf("world"));//5
System.out.println(str3.indexOf("compute"));//-1, 没有找到
if(str3.indexOf("hello")!= -1)
{
System.out.println("可以找到指定字符串!");
}
注意:
a. 使用indexOf(), 如果内容重复, 他只能返回查找的第一个位置;
b. 在进行查找的时候往往会判断开头或结尾;
c. 很多时候用标记做参数处理, 就要用startsWith()与endsWith()来判断
例:
String str4 = "helloworld";
System.out.println(str4.indexOf("1"));//2
System.out.println(str4.indexOf("1",5));//8
System.out.println(str4.lastIndexOf("1"));//8
String str5 = "**@@helloworld!!";
System.out.println(str5.startsWith("**"));//true
System.out.println(str5.startsWith("@@",2));//true
System.out.println(str5.endsWith("!!"));//true
- 字符串转换
String(char[],num1.num2)将字符数组转换成字符串,由num1起到num2结束。
将字符串转化成字符数组
char[] arr=new char[10];
String s1="abcd";
arr=s1.toCharArray();
System.out.println(arr.length);
- 字符串切割
字符串的切割:split(“mark”);以mark为标志切割字符串。
例:
String s1="aba,bcd,ef";
String[] arr=new String[10];
arr=s1.split(",");
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);