点击打开链接 点击打开链接 点击打开链接 android培训、<a">点击打开链接 点击打开链接 java培训、期待与您交流!">点击打开链接 点击打开链接
String类
1. String是一种特殊的包装类数据,它有两种创建方式:
String s1=”ab”
String s2=new String(“ab”)
注:String s1=”ab”, 这种方法先在栈中创建一个对String类的对象引用变量s1,然后再去查找”ab”是否被保存在字符串常量池中,如果没有则在栈中创建两个char型的值’a’、’b’,然后在堆中创建一个String对象,它的值是刚才在栈中创建的两个char类型值组成的数组{‘a’,’b’},接着这个String对象object被存放进字符串常量池,最后将是是s1指向这个对象的地址,如果’ab’已经保存在常量池中,则在字符串常量值中找到值为’ab’的对象object,然后将s1指向这个对象的地址。
String s2=new String(“ab”),这种可以分解成两步1、Stringobject = "ab"; 2、String s = newString(object); 第一步参考第一种创建方式,而第二步由于"ab"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的两个char型值。
2. 问题:String s1=”ab”
Strings2=”ab”
String s3=new String(“ab”)
String s4=new String(“ab”)
s1==s2true 原因:s1、s2指向常量池中的同一个对象
s1==s3flase 原因:s1指向常量池中的对象”ab”,s2指向堆中新创建的对象”ab”.
S3==s4flase 原因:s3、s4指向堆中的不同变量
S1.equals(s2), S1.equals(s3) true 原因:String类复写了object类的equals方法,该方法用于判断字符串是否相同。
3. String的常见方法
① 获取
Length():返回字符串中包含的字符数,也就是字符串的长度
charAt():根据位置获取字符串上的字符,超过角标时编译会报错
indexOf(intch):返回字符第一次出现的位置,没找着时返回﹣1.
indexOf(intch,int fromIndex):从fromIndex位置开始获ch字符出现的位置。
indexOf(Stringstr):返回子字符串第一次出现的位置
indexOf(Stringstr,int fromIndex):从fromIndex开始查找str字符串出现的位置。
CodePointAt(index):返回指定位置字符的Unicode代码点。
② 判断
contains():字符串中是否包含某一个字符串
isEmpty():字符串中是否有内容
startsWith():字符串中是否以指定内容开头.
endsWith():字符串中是否以指定内容结尾.
equals():判断字符串内容是否相同
equalsIgnoreCase():判断内容是否相同,并忽略大小写比较
③ 转换
String():将字符数组转换成字符串
String(char[],inoffset,int count):将字符数组中指定开始位置、指定个数转换成字符串
toCharArray():将字符串转换成字符数组
String(byte[]):将字节数组转换成字符串
String(byte[]offset,count):将字节数组中指定起始位、指定个数转换成字符串
getBytes():将字符串转变成字节数组
valueof():将基本数据类型转成字符串
④ 替换
replace(oldString,newString):用新的字符串(字符)替换旧的字符串(字符)。
replaceAll(stringregex,string regex):正则表达式。不懂,留待以后解答
⑤ 切割
Split(regex):
⑥ 子串
subString(begin):如果角标不存在,会出现字符串角标越界异常
subString(begin,end):包含头不包含尾
⑦ 转换、去空格、比较
toOpperCase():将字符串中小写转换成大写
toLowerCase():将字符串中大写转换成小写
trim():将字符串两端的空格去除
compareTo():对两个字符串进行自然顺序的比较。
4. String练习题
import java.io.*;
import java.util.*;
public class strDemo{
public static void main(String[] args)throws IOException
{
//练习一的调用
Sop(myTrim(put()));
//练习二的调用
Sop(fanzhuan(put(),3,6));
//练习三的调用
Sop(String.valueOf(num(put(),put())));
//练习四的调用
Sop(substr(put(),put()));
}
//
public static String put() throws IOException{
BufferedReader br=new BufferedReader(newInputStreamReader(System.in));
System.out.println("请输入字符串");
String str=br.readLine();
return str;
}
//方法sop,打印传入的字符串
public static void Sop(String t)
{
System.out.println(t);
}
/*练习一模拟trim方法
思路:1.去除字符串两端的空格,先判断字符串的开始端有没有空格,如果有就去掉,直到开始端不是空格
2.再判断,字符串的结尾有没有空格,如果有,就去掉,直到不是以空格结尾
3.这样就取到了两端都不是空格的字符串
步骤:1.先用startswith()判断字符串开头是不是空格,如果是则把字符串的第一个字符砍掉,用subString(),
一直循环直到字符串不再是以空格开头。
2.再用startWith()判断字符串是不是以空格各位,如果是则如同步骤1.
3.字符串就变成了前尾都没有空格的字符串
*/
public static String myTrim(String str)
{
while(str.startsWith(" "))
{
str=str.substring(1,(str.length()));
}
while(str.endsWith(" "))
{
str=str.substring(0,(str.length()-1));
}
return str;
}
/*练习二将字符串的指定位置进行翻转
思路:1.获取指定位置的开始位置start上的字符和结束位置end上的字符,两者进行调换
2.获取指定位置的开始位置start+1上的字符和结束位置end-11上的字符,两者进行调换
3.进行(int)((start+end)/2)次,就将其翻转结束
步骤:1.此函数得传入字符串,开始位置start,结束位置end三个参数
2.将字符串转变成字符数组,用tocharArray()
3.用for循环,从i=start开始,i=(start+end)/2结束,将i位置对应的字符与(end-i+start)位置对应的字符进行调换
4.for循环完成,将字符数组转换成字符串,就大功告成
*/
public static String fanzhuan(String str,int start,int end){
char[] strArr=str.toCharArray();
for(int i=start;i<=((start+end)/2);i++){
char a=strArr[i];
strArr[i]=strArr[end-i+start];
strArr[end-i+start]=a;
}
String str1=new String(strArr);
return str1;
}
//练习三获取一个字符串在另一字符串中出现的次数
public static int num(String a,String b){
int number=0;
while(a.contains(b)){
a=a.substring(a.indexOf(b)+b.length()-1,a.length());
number=number+1;
}
return number;
}
// 练习四获取两个字符串中最大相同的子串
//思路:先找出长度较短的字符串,取出短字符串的所有子串,从最长子串开始,看长字串中是否包含它,如果是,则是两字符串中最大相同的子串
public static Stringsubstr(String a,String b){
Stringc=(a.length()<b.length()?a:b);
String d=(a.length()>=b.length()?a:b);
String str;
for(inti=c.length();i>0;i--){
for(intstart=0,end=i;end<=c.length();start++,end++){
str=c.substring(start,end);
if(d.contains(str))
return str;
}
}
return"null";
}
}
5. 习题的感想与体会
这几道题花了我将近3天的时间,期间虽然有工作,但还是感觉花的时间太长了,究其原因主要是编程的时候不够仔细,经常会缺少分号,括号,分号与逗号写错了之类的,还是练习得太少,思路也不清晰,以后要多加练习,编代码的时候要写注释,先写要求,再写思路与步骤,最后再写代码,现将这次练习遇到的问题总结如下:
①Scanner类中的next方法不能接收空格 我一开始做了一个put函数(用于接收输入的字符串),运行练习一的时候,怎么也得不到想要的答案,盯着mytrim很久,还以为是里面的String类使用错误,比较String类是一个比较特别的类,再比如这样用str=str.substring(1,(str.length()));不对之类的,半天才了解到不是,是in.next()出了问题,next里面空格被当成分割符,当有空格输入时,next就接收完了,后面的不会再接收,例如输入“ abc sdfgg ”,其实in.next()=”abc”. 如果要接收空格,可以用nextLine.
②BufferedReader这是我即将要学到的内容,我还没学就先拿来用了,实在是没有办法,走投无路时在网上搜索来的方法,BufferedReader与Scanner的相似与不同之处,在学完了BufferedReader之后要好好总结一下。
③看来毕老师的视频,才发现myStrim原来可以那样做,我的思维终究是有些死板,散发不开,然后毕老师说:我们做程序要尽可能让功能细化,我一开始是很不解的,写成一个个的函数要多敲多少字,我就喜欢在主函数里噼里啪啦地敲下一大段。其实这是很不好的一种行为,刚开始学还可以,但是如果想要真正做开发,现在就要学着写注释,写函数。
④String中会用错的方法:String(char[]),把字符数组变成字符串,我一开始用这么用String a=char.String(),或者String a=String(char[]),好像都不对,正确方法:String a=new String(char[]),或者还有什么其他方法。
valueOf():将基本数据类型转换成字符串,我一开始会这么用valueOf(int),其实应该String.valueOf(int),或Integer.valueOf(String):将字符串转变成整数。又学到了一招。