黑马程序员——Java基础——String类

点击打开链接 点击打开链接 点击打开链接 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):将字符串转变成整数。又学到了一招。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值