黑马程序员——String类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

String类

字符串是一个特殊的对象,一旦被初始化就不可以被改变

String s1="abc";

String s2=new String("abc");

String s3="abc";

System.out.println(s1==s2);//false

s1和s2有什么区别?

s1 是一个类类型变量,在内存中只有"abc"一个对象。

s2在内存中有两个对象,new一个,”abc”一个

System.out.println(s1==s3);//true

建立s1对象后,又建立一个s3,发现常量池中,已经有abc字符串,为了节约内存,直接把S3的引用指向和s1同一个对象;

System.out.println(s1.equals(s2));//true

String复写了Object类中的equals方法,该方法用于判断字符串是否相同

记住:String s=new String() 等效于String s =""; 不等效String s = null;

String常见的操作

1、获取

int  length():获取长度。

char  charAt(int index):获取index位置上的字符

int  indexOf(int ch):返回的是ch在字符串中第一次出现的位置

int  indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置

int  indexOf(String str):返回的是str在字符串中第一次出现的位置

int  indexOf(String str, int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置

int  lastIndexOf(int ch) :反向索引一个字符串出现的位置,从右往左数

2、判断

boolean  contains(str):字符串中是否包含某一个子串

indexOf(str):可以索引str第一次出现位置,如果返回-1,表示该str不在字符串中存在。也可以用于判断是否包含指定子串

if(str.indexOf("aa")!=-1)该方法即可以判断,又可以获取出现的位置

boolean  isEmpty(): 字符中是否有内容,原理就是判断长度是否为0

boolean  startsWith(str);字符串是否是以指定内容开头

boolean  endsWith(str);字符串是否是以指定内容结尾

boolean  equals(str);判断字符串内容是否相同

boolean  equalsIgnoreCase();判断内容是否相同,并忽略大小写

3、转换

String(char[]):将字符数组转成字符串(构造函数)

String(char[],offset,count):将字符数组中的一部分转成字符串(构造函数)

char[]  toCharArray():将字符串转成字符数组

String(byte[])将字节数组转成字符串

String(byte[],offset,count):将字节数组中的一部分转成字符串

byte[]  getBytes():将字符串转成字节数组

将基本数据类型转成字符串:

static String valueOf(int):

static String valueOf(double):

3+"";//String.valueOf(3);

特殊:字符串和字节数组在转换过程中,是可以指定编码表的。

4、替换

String  replace(oldchar,newchar);如果要替换的字符不存在,返回的还是原串

5、切割

String[] split(regex);regex切割的依据

6、获取字符串中的一部分

String  substring(begin);从指定位置到结尾

String  substring(begin,end);包含头,不包含尾

7、转换,去除空格,比较。

String  toUpperCase();将字符串转成大写

String  toLowerCase();将字符串转成小写

String  trim();将字符串两端的多个空格去除

int  compareTo(string);对两个字符串进行自然顺序的比较


String常见操作练习

1、去除字符串两端空格。

思路:

1、判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。结尾处判断空格也是如此。

2、当开始和结尾都判断到不是空格时,就是要获取的字符串。

public staticString myTrim(String str)
         {
                   intstart = 0,end = str.length()-1;
                   while(start<=end&& str.charAt(start)==' ')
                            start++;
                   while(start<=end&& str.charAt(end)==' ')
                            end--;
                   returnstr.substring(start,end+1);
         }

2、将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg";abfedcg

思路:

1、学习过对数组的元素进行反转。

2、将字符串变成数组,对数组反转。

3、将反转后的数组变成字符串。

4、只要将反转的部分的开始和结束位置作为参数传递即可。

 public static String reverseString(String s,int start,int end)
    {
        //字符串变数组。
        char[] chs = s.toCharArray();
        //反转数组。
        reverse(chs,start,end);
        //将数组变成字符串。
        return new String(chs);
    }
    private static void reverse(char[] arr,intx,int y)
    {
        for(int start=x,end=y-1; start<end ;start++,end--)
        {
            swap(arr,start,end);
        }
    }
    //将整个数组反转
    public static String reverseString(String s)
    {
        return reverseString(s,0,s.length());
    }
    private static void swap(char[] arr,intx,int y)
    {
        char temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }

3、获取一个字符串在另一个字符串中出现的次数。 "abkkcdkkefkkskk

思路:

1、定义个计数器。

2、获取kk第一次出现的位置。

3、从第一次出现位置后剩余的字符串中继续获取kk出现的位置。每获取一次就计数一次。

4、当获取不到时,计数完成。

方法一

 public static int  getSubCount(Stringstr,String key)
    {
        int count = 0;
        int index = 0;
        while((index=str.indexOf(key))!=-1)
        {
            sop("str="+str);
            str =str.substring(index+key.length());
            count++;   
        }
        return count;
    }

方法二

    public static int getSubCount_2(Stringstr,String key)
    {
        int count = 0;
        int index = 0;
        while((index=str.indexOf(key,index))!=-1)
        {
            sop("index="+index);
            index = index + key.length();
            count++;
        }
        return count;
    }

4、获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印。

        "abcwerthelloyuiodef"       "cvhellobnm"

思路:

1、将短的那个子串按照长度递减的方式获取到。

2、将每获取到的子串去长串中判断是否包含,如果包含,已经找到。

public static String  getMaxSubString(Strings1,String s2)
    {
        String max = "",min ="";
        max = (s1.length()>s2.length())?s1:s2;
        min = (max==s1)?s2: s1;
        for(int x=0; x<min.length(); x++)
        {
            for(int y=0,z=min.length()-x;z!=min.length()+1; y++,z++)
            {
                String temp =min.substring(y,z);
                sop(temp);
                if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
                    return temp;
            }
        }
        return "";
    }

StringBuffer

StringBuffer是字符串缓冲区,是一个容器。

字符串的组成原理就是通过该类实现的

特点:

1、长度是可变化的。

2、可以存储不同的类型数据。

3、可以对字符串进行修改。

4、最终通过toString方法变成字符串。

StringBuffer常见操作

1、存储

StringBuffer  append():将指定数据作为参数添加到已有数据结尾处

StringBuffer  insert(index,数据):可以将数据插入到指定index位置

2、删除

StringBuffer  delete(start,end):删除缓冲区中的数据,包含start,不包含end

StringBuffer  deleteCharAt(index):删除指定位置的字符

3、获取

char  charAt(int index):获取指定下标处的字符

int  indexOf(String str):返回指定字符串在缓冲区出现的位置

int  lastIndexOf(Stringstr):

int  length():返回缓冲区长度

String  substring(int start, int end):获取从start到end-1下标的字符串

4、修改

StringBuffer  replace(start,end,stri);用指定字符串替代从start到end-1的字符串

void  setCharAt(int index, char ch) ;用ch替代指定下标的字符

5、反转

StringBuffer  reverse();将字符串反转

6、将缓冲区中指定数据存储到指定字符数组中

void  getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将src中角标为begin到(end-1)的数据存放到数组dst中,从dst角标为begin开始存储

JDK1.5 版本之后出现了StringBuilder

StringBuffer和StringBuilder的区别

StringBuffer是线程同步。

StringBuilder是线程不同步。

 以后开发,建议使用StringBuilder

JDK升级三个因素:

1、提高效率。

2、简化书写。

3、提高安全性。


基本数据类型

基本数据类型对应的对象包装类

byte Byte

short short

int Integer

long Long

boolean Boolean

float   Float

double  Double

char        Character

基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换

基本数据类型转成字符串

方法一、基本数据类型+" "

方法二、基本数据类型.toString(基本数据类型值);

 如: Integer.toString(34);//将34整数变成"34";

字符串转成基本数据类型

xxx a =Xxx.parseXxx(String);

int  a = Integer.parseInt("123");

double  b =Double.parseDouble("12.23");

boolean  b = Boolean.parseBoolean("true");

Integer  i = new Integer("123");

int  num = i.intValue();


十进制转成其他进制:

toBinaryString();

toHexString();

toOctalString();

其他进制转成十进制:

parseInt(string,radix);

Int  a =Integer.ParseInt("3c",16)


自动装箱(JDK1.5新特性)

Integer  x = 4;//自动装箱//new Integer(4)

等价于:Integer x = new Integer(4);

x = x+ 2;

x先进行自动拆箱 x.intValue(),变成了int类型,和2进行加法运算。再将和进行装箱赋给x。

  特殊:

Integer m = 128;

Integer n = 128;

sop("m==n:"+(m==n));//false

 

Integer a = 127;

Integer b = 127;

sop("a==b:"+(a==b));//结果为true。因为a和b指向了同一个Integer对象。

因为当数值在byte范围内容,对于新特性,如果该数值已经存在,则不会在开辟新的空间。

 练习:

1、对字符串排序。"zxcvbasdfg"

思路:

1、字符串变数组。

2、数组排序。

3、数组变字符串。           

    String str = "zxcvbasdfg";

    char[] arr = str.toCharArray();

<pre name="code" class="java">    public static String sortString(String str)
    {
        char[] arr = stringToArray(str);
        sort(arr);
        return arrayToString(arr);
    }
 
    private static char[] stringToArray(Stringstr)
    {
        return str.toCharArray();
    }
 
    private static void sort(char[] arr)
    {
        for(int x=0; x<arr.length-1; x++)
        {
            for(int y=x+1; y<arr.length; y++)
            {
                if(arr[x]>arr[y])
                {
                    swap(arr,x,y);
                }
            }
        }
    }
    private static void swap(char[] arr,intx,int y)
    {
        char temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
 
    private static String arrayToString(char[]arr)
    {
        return new String(arr);
    }


 
  

2、需求:对字符串中的数值进行排序。生成一个数值从小到大新字符串。"-7 0 4 12 13 3099 100"

思路:

1、将字符串切割。变成字符串数组。

2、将字符串数组转成int数组。

3、int数组排序。

4、将int数组变成字符串。

           String str = "12 0 99 -7 30 4100 13";

           str = numberStringSort(str);

           System.out.println(str);

public static String  numberStringSort(String str)
      {
           String[] arr = splitString(str);
           int[] nums = toIntArray(arr);
           Arrays.sort(nums);
           return intArraytoString(nums);
      }
 
      private static String[] splitString(Stringstr)
      {
           return str.split(" ");
      }
 
      private static int[] toIntArray(String[]arr)
      {
           int[] nums = new int[arr.length];
           for(int x=0; x<arr.length; x++)
           {
                 nums[x] =Integer.parseInt(arr[x]);
           }
           return nums;
      }
 
      private static String  intArraytoString(int[] arr)
      {
           StringBuilder sb = newStringBuilder();
           for(int x=0; x<arr.length; x++)
           {
                 if(x!=arr.length-1)
                       sb.append(arr[x]+"");
                 else
                      sb.append(arr[x]);
           }
           return sb.toString();
      }





------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值