java中使用了面向对象的思想,把字符串封装到java.lang包下的String类中,供我们使用和操作。
一,String类的创建和初始化。
1,使用字符串常量初始化:
String s="abc";
以这种方式初始化的字符串,“abc”是保存在一个字符串缓冲区当中的,也就是堆内存当中。
在这里要将两个小插曲:一个就是字符串对象一旦被初始化就不会被改变。
String s="qwe";
s="nbx";
System.out.println("s="+s);
这里的打印结果显然是nbx;其实在这,是两个字符串对象(“qwe”和“nbx”),s只是引用型变量,实际在内存当中的字符串对象是没有改变的。
还有一个注意的地方,先看例子吧:
String s="abc"
String s1="abc";
System.out.println(s==s1)
这里对s和s1进行的比较,显然是对地址的比较,你会神奇 的发现,这个例子的运行结果竟然是true,我们会发现这两个变量所指的地址值是相同的,这是为什么呢?
首先,在字符串建立的时候,在内存中有一个字符串缓冲区,当字符串进入的时候,先寻找,看是否有该字符串(abc),没有就存入,然后到第二句代码,进入到缓冲区中,查找到已有abc,所以就把已有的abc的地址值赋给了s1,所以就导致了s和s1的地址值相同。
2,使用String类中的构造方法初始化。
String s1=new String("abc");
这种的初始化,实际上是创建了两个对象,一个new和一个字符串对象在堆内存中。
String s="abc"
String s1=new String("abc")
System.out.println(s==s1);
所以,当我们再次使用这个方法来比较两个地址值是否相同时,就是发现是false。s是创建在一个字符缓冲区当中的,而s1是创建在对象中的,就会导致两个地址不相同。
再提一点,当然这两个内容是相同的,我们可以使用String类中的equals()方法来验证。
二,String类的功能分类。
这里只列举一些常用的方法,更多的请大家查看API文档,进行更多的学习。
1.获取
获取字符串中字符的个数
int length();
根据位置获取字符
char charAt(int index);
根据字符获取在字符串中的第一次出现的位置
int indexOf(int ch);
int indexOf(int ch,int fromIndex);//从指定位置进行ch的查找第一次出现的位置
根据字符获取在字符串中的最后一次出现的位置
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);//从指定位置进行ch的查找最后一次出现的位置
获取字符串中一部分字符串
String substring(int beginIndex,int endIndex);//包括起始索引,但是不包含结束索引(左闭右开)
String substring(int beginIndex);
2.转换
将字符串变成字符串数组
String[] split(String regex)
String s="小强,小王,小李";
String[] arr=s.split(",");
for(int i=0;i<arr.length;i++ {
System.out.println(arr[i]);
}
将字符串变成字符数组。
char[] toCharArray();
将字符串变成字节数组。
byte[] getBytes();
将字符串中的字母转成大小写。
String toUpperCase();//大写
String toLowerCase();//小写
将字符串中的内容进行替换。
String replace(char oldChar,char newChar);
String replace(String s1,String s2);
将字符串两端的空格去除。
String trim();
将字符串进行连接。
String concat(string);
3.判断
两个字符串内容是否相同?
boolean equals(Object obj);
boolean equalsIgnoreCase(String str);//忽略大写比较字符串内容
字符串是否包含指定字符串?
boolean contains(String str);
字符串是否以指定字符开头,是否以指定字符结尾。
startWith(String str);
endsWith(String str);
4.比较
compareTo(String str);
通过对这些方法的了解,我们就可以对字符串的操作游刃有余了。
小结:
将字符串转换为字符数组用toCharArray。
将字符数组转换为字符串用字符串构造函数。
三,练习
接下来就练习2个小题目,让我们更熟悉String类中的这些方法。
1:给定一个字符串数组,按照字典顺序进行从小到大排序。
{“man”,“abc”,“cba”,“xx”,“zz”,“xixi”}。
分析:
- 对于排序,有很多种排序算法,诸如选择排序,冒泡排序,这里我们就使用冒泡排序。
- 但是,之前排序的是整数,现在要对字符串进行排序,怎么办呢?不用担心,我们可以使用字符串中对象比较的功能。
public static void main(String[] args) {
String[] arr={"man","abc","cba","xx","zz","xixi"};
sortString(arr);
printArray(arr);
}
public static void sortString(String[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if(arr[i].compareTo(arr[j])>0)//字符串比较用compareTo方法
swap(arr,i,j);
}
}
}
public static void swap(String[] arr, int i, int j) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
2,一个子串在整串中出现的次数。“nbaernbatynbauinbaopnba”
public static void main(String[] args) {
String str = "nbaernbatnbaynbauinbaopnba";
String key = "nba";
int count = getKeyStringCount(str,key);
System.out.println("count="+count);
}
public static int getKeyStringCount(String str, String key) {
//定义计数器。
int count = 0;
//定义变量记录key出现的位置。
int index = 0;
while((index = str.indexOf(key))!=-1){
str = str.substring(index+key.length());
count++;
}
return count;
}