JavaSE-15-String类

String 类 与 特点

(你说一下 “” 与equals 区别?)
1**.字符串是一个特殊的对象** String str= “abc” "abc"是一个对象 str 是类变量
String str=“abc”;
str=“bbb”;// 引用变量重新指向字符串 “bbb” ,当是之前的 "abc"不会改变。
String s1=“abc”;
**System.out.println(s1
s) ;??? true** 指向同一个地址。(选择题)
解释:字符串在字符串常量区 如果没有“abc”则创建,当String s1=“abc”; 因为已经存在“abc”,所以地址赋值给s1;
(总结:字符串定义的第一种方式,字符串常量区无则建立,有则直接用)。
2.字符串一但初始化就不能改变可共享。
对于基本数据类型 “== ”比较的是“值” ,对于String 比较的是地址。对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

在这里插入图片描述

面试题下面两种创建对象有什么区别?

String s =“abc”;//常量池中产生一个对象
String s1= new String(“abc”);//创建两个对象一个 new 一个字符串对象在堆内存中。
System.out.println(s==s1);// flase
System.out.println(s.equals(s1));// true 重点: String 类对 Object 本来是比较对象地址的 equals 方法依据自身要求进行了覆写----比较的是内容不是地址。

常见API 使用

/*

  • 按照面向对象的思想对字符串进行功能分类。
  • “abcd”
  • 1,获取:
  • 1.1 获取字符串中字符的个数(长度).
  • int length();
  • 1.2 根据位置获取字符。
  • char charAt(int index);
  • 1.3 根据字符获取在字符串中的第一次出现的位置.
  • int indexOf(int ch)
  • int indexOf(int ch,int fromIndex):从指定位置进行ch的查找第一次出现位置
  • int indexOf(String str);
  • int indexOf(String str,int fromIndex);
  • 根据字符串获取在字符串中的第一次出现的位置.
  • int lastIndexOf(int ch)
  • int lastIndexOf(int ch,int fromIndex):从指定位置进行ch的查找第一次出现位置
  • int lastIndexOf(String str);
  • int lastIndexOf(String str,int fromIndex);
  • 1.4 获取字符串中一部分字符串。也叫子串.
  • String substring(int beginIndex, int endIndex)//包含begin 不包含end 。
  • String substring(int beginIndex);
  • 2,转换。
  • 2.1 将字符串变成字符串数组(字符串的切割)
  • String[] split(String regex):涉及到正则表达式.
  • 2.2 将字符串变成字符数组。
  • char[] toCharArray();
  • 2.3 将字符串变成字节数组。
  • byte[] getBytes();
  • 2.4 将字符串中的字母转成大小写。
  • String toUpperCase():大写
  • String toLowerCase():小写
  • 2.5 将字符串中的内容进行替换
  • String replace(char oldch,char newch);
  • String replace(String s1,String s2);
  • 2.6 将字符串两端的空格去除。
  • String trim();
  • 2.7 将字符串进行连接 。
  • String concat(string);
  • 3,判断
  • 3.1 两个字符串内容是否相同啊?
  • boolean equals(Object obj);
  • boolean equalsIgnoreCase(string str);忽略大写比较字符串内容。
  • 3.2 字符串中是否包含指定字符串?
  • boolean contains(string str);
  • 3.3 字符串是否以指定字符串开头。是否以指定字符串结尾。
  • boolean startsWith(string);
  • boolean endsWith(string);
  • 4,比较。
  • 5.public String intern()
    返回字符串对象的规范表示。
    最初为空的字符串池由String类String 。
    当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自池的字符串。
    否则,此String对象将添加到池中,并返回对此String对象的引用。
    由此可见,对于任何两个字符串s和t , s.intern() ==
    t.intern()是true当且仅当s.equals(t)是true

*/

package string;
public class StringDemo {
    public static void main(String[] args) {
        // 02String类  构造函数
        String  s= new String();//  知识点1: 等价于  String s=""    ;“” 是一个对象 不等于 String s=null  这个是空   ;
       //知识点2 : String(byte[] bytes)   字节数组-----》构造一个新的String
        byte arr[]=new  byte[]{97,66,67};
        String s2=  new String(arr);
        System.out.println(" s2="+s2);
        //字符数组
        char  arr2[]= new char[]{'a','b','c'};
        String s3= new String(arr2,0,1);//一部分变成字符串
        System.out.println("s3:"+s3);
        //字符串
        String s4="boo:and:foo";
        String[]  s4_1=s4.split(":");
        for(int i=0;i<s4_1.length;i++){
            System.out.println(" s4_1:"+s4_1[i]);
            /***
             *  s4_1:boo
             *  s4_1:and
             *  s4_1:foo
             *
             */
        }
        //按照正则表达式匹配
        System.out.println("字符串切割 split");
        String s5="张三,李四,王五";
      //  String[]  s5_1=s5.split(",");
        String[]  s5_1=s5.split("\\,");
        for(int i=0;i<s5_1.length;i++){
            System.out.println(" s5_1:"+s5_1[i]);
            /***
             *
             */
        }
        String s6="abc";
       char[] chs= s6.toCharArray();
        for(int i=0;i<chs.length;i++){

            System.out.println("chs "+chs[i]);//  a b  c
        }
        // getBytes
        s6="ab你";
        byte[] bytes =s6.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);
        }//  97   98    -28  -67   -96
        //将所有在此字符 String使用默认语言环境的规则大写。
        s="abcd";
        System.out.println(s.toUpperCase());
        // 字符替换
        System.out.println(s.replace('a','z'));// zbcd
        s="the war of baronets".replace('r', 'y');
        System.out.println(s);

        String S1 = "java";
        String S2 = S1.replace('q', 'z');//不包含q
        System.out.println(S1==S2);//true
        System.out.println("S1:"+S1);
        System.out.println("S2:"+S2);
        //trim()
        //返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。
        System.out.println("   a b  c  ".trim());//a b  c
        //判断字符串内容是否相同?
        String  s8_1="abc";
        String  s8_2="abcd";
        System.out.println(s8_1.equals(s8_2));//false
        //equalsIgnoreCase不区分大小写判断字符串是否相同
        String  s8_3="Abc";
        String  s8_4="abc";
        System.out.println(s8_3.equalsIgnoreCase(s8_4));//true
        //字符串中是否包含子串
        String  s9_1="Abc_zengjx";
        String  s9_2="zeng";
        System.out.println(s9_1.contains(s9_2));//true
      //  3.3 字符串是否以指定字符串开头。是否以指定字符串结尾。
        String  s10_1="Abc_zengjx";
        String  s10_2="Abc";
        String  s10_3="jx";
        System.out.println(s10_1.startsWith(s10_2));//true
        System.out.println(s10_1.endsWith(s10_3));//true
        //public String intern()返回字符串对象的规范表示。
        //对于任何两个字符串s和t , s.intern() == t.intern()是true当且仅当s.equals(t)是true 。
        String  s11_1="Abc";
        String  s11_2=s11_1.intern();
        System.out.println(s11_1==s11_2);//true
        String  s11_3 = new  String("abc");//  new 两个对象
         String  s11_4=s11_3.intern();//获取字符串池中的数据  是共享数据
        System.out.println("intern "+(s11_4==s11_3));//false
        System.out.println("equals"+(s11_4.equals(s11_4)));//true
    }
}

练习

练习1

/*

  • 1,给定一个字符串数组。按照字典顺序进行从小到大的排序。
  • {“nba”,“abc”,“cba”,“zz”,“qq”,“haha”}
  • 对数组排序 选择 冒泡 比较字符串对象public int compareTo(String anotherString)
  • 如果String对象按字典顺序排列在参数字符串之前,结果为负整数。
    结果是一个正整数,如果String对象按字典顺序跟随参数字符串。
    如果字符串相等,结果为零; compareTo返回0 ,当equals(Object)方法将返回true

    */
package string;
//字典序字符串
public class StringTest1 {

    public static void main(String[] args) {
        sort1demo();
    }
    public   static  void sort1demo(){
     String s[]=  new  String[]  {"nba","abc","cba","zz","qq","haha"};
       for(int i=0;i<s.length;i++){
           System.out.println(s[i]);
       }
       sortString(s);
        for(int i=0;i<s.length;i++){
            System.out.println(s[i]);
        }
        sortStringByBable(s);
        for(int i=0;i<s.length;i++){
            System.out.println(s[i]);
        }
    }
    //选择
    public  static   void  sortString(String[] arr){
        for(int i=0;i<arr.length-1;i++){

         for(int j=i;j<arr.length-1;j++){

             if(   arr[j].compareTo(arr[j+1])>0){
              String  temp= arr[j];
              arr[j]=arr[j+1];
              arr[j+1]=temp;
             }
         }
        }
    }
     //冒泡
    public  static   void  sortStringByBable(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){
                    String  temp= arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
    }
}
2,一个子串在整串中出现的次数。“nbaernbatynbauinbaopnba” “nba”

思路: 使用public int indexOf(String str,int fromIndex)
返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
如果不存在这样的k值,则返回-1 。

public   static void  test2(){
  String s1=  "nbaernbatynbauinbaopnba";
  String s2="nba";
  String s3="aaa";
  // 用例 1
  int  count=  subStringTimes(s1,s2);
    System.out.println(" count ="+count);
  // 用例 2
    count=  subStringTimes(s1,s3);
    System.out.println(" count ="+count);
    // 用例3
    count=  subStringTimes(null,null);
    System.out.println(" count ="+count);
}//子串出现次数  "nbaernbatynbauinbaopnba"   "nba"
public  static  int    subStringTimes(String arr,String subarr){
    if(arr==null ||arr.length()==0||subarr==null ||subarr.length()==0){
        return -1;
    }
    int   index=0;
    int count =0;
    int fromIndex=0;
    while (true){
      index=  arr.indexOf(subarr,fromIndex);
      if(index!=-1){
          count++;
          fromIndex=index+subarr.length();
      }else{
          break;
      }
    }
  return   count;
}
3,两个字符串中最大相同的子串。

String test1 =“qwerabcdtyuiop”;
String test2=“xcabcdvbn”;

//求两个字符串最大子串
// 1. str2 是否是str1 的字串  如果是则str2   是最大字串
 //2. str2 如果不是str1字串则 str2 -1个字符  遍历这个长度的字符串
 //直到  str2长度为1
public  static  void  test3(){

    String  test1 ="qwerabcdtyuiop";
    String  test2="xcabcdvbn";
    System.out.println(maxSubString(test1,test2));

    String  test3 ="aaaaaaaabbbbbbb";
    String  test4="aba";
    System.out.println(maxSubString(test3,test4));
    String  test5 ="aaaaaaabcd";
    String  test6="abcd";
    System.out.println(maxSubString(test5,test6));
}

/** 设  s2 =  abcd
 *   leng= 4   abcd    4-0    length()-i  当前字符串长度
 *   leng=3   abc bcd   4-1
 *   leng=2   ab bc  cd  4-2
 *   leng=  1   a  b   c  d   4-3
 *   for(int i=0;i<s2.length();i++){// 字符串长度遍历
 *   for(j=0; j<=i;j++){
 
 *   }
 *
 *
 *
 *   }
 *
 *
 *
 * @param str1
 * @param str2
 * @return
 */


public static  String    maxSubString(String  str1,String str2){
    if(str1==null ||str1.length()==0||str2==null||str2.length()==0){
        return null;
    }
    String  max=  str1.length() > str2.length() ?  str1:str2;
    String  min =max.equals(str1) ? str2:str1;
    //min="abcd";
    for(int i=0;i<min.length();i++){
        int  length=min.length()-i;

        for(int j=0;j<=i;j++){
            String sub=min.substring(j,j+length);
          //  System.out.println(sub);
          if( max.contains(sub)){
            System.out.println("find "+sub);
              return  sub;
          }

        }
      //  return  null;
     //   System.out.println(" -------"+" i "+i);
    }

    return   null;
}

4,模拟一个trim功能一致的方法。
/***
 *  实现思路index 下标   charAt(index);
 *  先前面 匹配" "
 *  如果匹配到则 inde
 *  然后从  length 往前遍历
 *
 *
 * @param src
 * @return
 */

 public  static  void  mytrimtest(){
     String   s="   qqq   ";
  System.out.println("取出后:["+mytrim(s)+"]");

     System.out.println("取出后:["+mytrim("    ")+"]");
 }
  //



public static  String  mytrim(String   src){

    if(src==null || src.length()==0){
        return   null;
    }
    int index=0;
    String  string= src;
   while(string.length()>0){
      char   ch=string.charAt(index);
      if(ch==' '){
          index++;
          System.out.println(" left index"+index);
         string=string.substring(index) ;
         System.out.println("length="+string.length());
         index=0;
      }else {
          break;
      }
    }
   if(string.length()==0){
       return  "";
   }
   index=string.length()-1;
    while (string.length()>0){

        char  ch= string.charAt(index);
        if(' '==ch){

          string=  string.substring(0,index);
          index--;
            System.out.println(" right index"+index);
        }else{
            break;
        }
    }
return    string;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值