String类、String常用API、StringBuilder

一、String

1.String介绍

概述: String类代表字符串

特点:

  • Java程序中的所有字符串字面值(如 “abc”) 都作为此类的实例(对象)实现

    String s = "abc";
    "abc" 就是对象 , String是对象的类型 ,  s是对象名
    凡是带双引号的 , 都是String的对象
    
  • 字符串是常量 , 它们的值在创建后不可更改

    String s = "abc";
    s += "de";    - >   产生了新对象
    
  • String对象是不可变的 , 所以可以共享

    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1==s2); //true
    

2.String的是实现原理

  • jdk8的时候 : 底层是一个被final修饰的char数组 - > private final char value[];
  • jdk9以及之后 : 底层是一个被final修饰的byte数组 - > private final byte value[];
    • 一个char类型占2个字节
    • 一个byte类型占1个字节 - > 省内存空间
  • 字符串定义完之后 , 数组就创建好了 , 被final修饰 , 数组的地址值直接定死
  • 字符串定义好之后 , 字符串内容就会放到数组中

3.String的创建

  1. String()

    String()  ->  利用String的空参构造 , 创建String对象
    
  2. String(String original)

    String(String original)  -> 利用String有参构造,创建String对象,传递String类型的参数
    
  3. String(char[] original)

    String(char[] original)  -> 根据char数组创建String对象
    
  4. String(byte[] bytes)

`**[String](../../java/lang/String.html#String(byte[]))**(byte[] bytes)`

注意 : 平台指的是 操作系统

​ 操作系统默认字符集 : GBK

​ GBK : 一个中文占2个字节

​ utf-8 : 一个中文占3个字节

String拓展构造

​ 1.String(char[] value,int offset,int count)

String(char[] value,int offset,int count) ->将字符数组一部分转成String
    		value:要转的数组
            offset:从数组的哪个索引开始转
            count:转多少个
char[] chars1 = new char[]{'a','b','c','d','e','f'};
String s7 = new String(chars1,2,4);
System.out.println(s7);		//cdef

​ 2.String(byte[] bytes, int offset, int length)

String(byte[] bytes, int offset, int length)->将字节数组一部分转成String
    		bytes:要转的数组
            offset:从数组的哪个索引开始转
            length:转多少个
byte[] bytes = new byte[]{97,98,99,100,101,102};
String s8 = new String(bytes,1,3);
System.out.println(s8);
4.String面试题
public class Demo03String {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//false
        System.out.println(s2==s3);//false
    }
}
1694228171952
问题: String s = new String("abc")->共创建了几个对象?
     1个或者2个
    
     a.如果new对象之前abc已经创建出来了,那么String s = new String("abc")就创建了一个
     b.如果new对象之前abc没有创建出来,那么String s = new String("abc")会创建2
1694228213568
5.字符串常见问题
public class Demo04String {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        String s4 = "hello"+"world";  	//helloworld
        String s5 = s1+"world";			//helloworld
        String s6 = s1+s2;     			//helloworld
        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s3==s6);//false
    }
}

字符串拼接:

1.等号右边如果是字符串字面值,不会产生新对象

2.等号右边如果有变量参与拼接,会产生新对象

1694228285471

二、String方法

1.判断方法
boolean equals(String s)  ->比较字符串内容
boolean equalsIngoreCase(String s)  ->比较字符串内容,忽略大小写
public class Test {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1.equals(s2));          //true

        String s3 = "AbC";
        System.out.println(s1.equalsIgnoreCase(s3));        //true
    }
}
2.练习
已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
步骤:
  1.定义两个字符串分别代表已经注册过的用户名和密码:
    String username = "root";
    String password = "1234"
        
  2.创建Scanner对象,调用next方法输入用户名和密码
  3.比较,如果用户名和密码都一样,登录成功,否则登录失败      
public class LoginTest {
    public static void main(String[] args) {
        String username = "root";
        String password = "1234";
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 3; i++) {
            System.out.print("请输入账户名:");
            String name = sc.next();
            System.out.print("请输入密码:");
            String pwd = sc.next();
            if(username.equals(name) && password.equals(pwd)){
                System.out.println("登录成功");
                break;
            }else{
                if(i==2){
                    System.out.println("账号冻结");
                }else{
                    System.out.println("登录失败");
                }
            }
        }
        sc.close();
    }
}

注意 : 比较字符串在开发中的实际使用注意事项:我们应该将确定的字符串放到前面,将不确定字符串变量放到后面,防空指针

如果对象为null , 再去点方法, 就会出现NullPointerException

我们应该将确定的字符串放到前面

将不确定字符串变量放到后面

这样就可以避免空指针异常

工具类 Objects java.util.Objects

方法: 判断两个对象是否相等

调用: Objects.equals(Object obj1 , Object obj2);

public static boolean equals(Object obj1,Object obj2){
    return (a==b) || ((a!=null) && a.equals(b));
}
public class LoginTest {
    public static void main(String[] args) {
        String username = "root";
        String password = "1234";
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 3; i++) {
            System.out.print("请输入账户名:");
            String name = sc.next();
            System.out.print("请输入密码:");
            String pwd = sc.next();
            if(Objects.equals(username,name)&&Objects.equals(password,pwd)) {
                System.out.println("登录成功");
                break;
            }else{
                if(i==2){
                    System.out.println("账号冻结");
                }else{
                    System.out.println("登录失败");
                }
            }
        }
        sc.close();
    }
}
3.练习2
遍历字符串
public class Bianli {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        for (int i = 0; i < s1.length(); i++) {
            System.out.print(s1.charAt(i)+" ");
        }
    }
}
4.获取功能
public int length():返回字符串的长度
public String concat(String str):将指定的字符串str拼接到原字符串末尾 
char charAt(int index):返回指定索引处的charint indexOf(String str):获取的是指定字符串在原字符串中第一次出现的索引值
String substring(int beginIndex):返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动
String substring(int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取													字符串,  含beginIndex,不含endIndex
public class Test {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        //获取字符串的长度
        System.out.println("s1.length() = " + s1.length());         //7
        //将指定的字符串拼接到老串的末尾
        System.out.println("s1.concat(\"hijk\") = " + s1.concat("hijk"));   					//abcdefghijk 
        //返回指定索引处的char值
        System.out.println("s1.charAt(3) = " + s1.charAt(3));       //d
        //获取的是指定字符串在老串中第一次出现的索引位置
        System.out.println("s1.indexOf(\"de\") = " + s1.indexOf("de"));     //3
        //返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动
        System.out.println("s1.substring(2) = " + s1.substring(2));     //cdefg
        //返回一个子字符串,从beginIndex到endIndex截取字符串,  含beginIndex,不含endIndex
        System.out.println("s1.substring(2,5) = " + s1.substring(2, 5));    //cde
    }
}
5.转换功能
char[] toCharArray()-> 将字符串转成char数组
byte[] getBytes() -> 将字符串转成byte数组
String replace(CharSequence c1,CharSequence c2)->替换
               CharSequence->String的一个接口
    
扩展:
byte[] getBytes(String charsetName)-> 按照指定编码将字符串转成byte数组
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s1 = "abcdefg";
        //char[] toCharArray()-> 将字符串转成char数组
        char[] chars = s1.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.print(chars[i]+" ");
        }
        System.out.println();
        System.out.println("------------------");
        //byte[] getBytes() -> 将字符串转成byte数组
        byte[] bytes = s1.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.print(bytes[i] + " ");
        }
        System.out.println();
        System.out.println("------------------");
        //String replace(CharSequence c1,CharSequence c2)->替换
        //               CharSequence->是String的一个接口
        String replace1 = s1.replace("bcd","mn");
        System.out.println(replace1);

        //byte[] getBytes(String charsetName)-> 按照指定编码将字符串转成byte数组
        byte[] bytes1 = "你好".getBytes();
        for (int i = 0; i < bytes1.length; i++) {
            System.out.print(bytes1[i]+" ");
        }
        System.out.println();
        byte[] bytes2 = "你好".getBytes("gbk");
        for (int i = 0; i < bytes2.length; i++) {
            System.out.print(bytes1[i]+" ");
        }
    }
}
6.练习4
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
步骤:
  1.创建Scanner对象,调用next方法录入一个字符串
  2.定义三个变量,分别统计大写字母,小写字母,数字个数
    int big = 0;
    int small = 0;
    int number = 0
        
  3.遍历字符串,将字符串中的每一个字符都获取出来
  4.判断,如果是大写,big++
    a.大写字母ASCII码值:  65-90
      假如B->ASCII码值66,65-90之间,证明是大写字母  
  5.如果是小写,small++
    a.小写字母ASCII码值: 97-122
      假如b->ASCII码值:98,97-122之间,证明是小写字母
  6.如果是数字,number++
    a.数字ASCII码值:48-57
      假如1->ASCII码值:49 ->48-57之间,证明是数字
          
  7.输出      
public class exercise04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int big = 0;
        int small = 0;
        int number = 0;
        System.out.print("请输入一个字符串:");
        String str = sc.next();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int num = chars[i];
            if(num >= 'A' && num <= 'Z'){
                big++;
            }
            if(num >= 'a' && num <= 'z'){
                small++;
            }
            if(num >= '0' && num <= '9'){
                number++;
            }
        }
        System.out.println("big = " + big);
        System.out.println("small = " + small);
        System.out.println("number = " + number);
        sc.close();
    }
}
7.分割功能
String[] split(String regex):按照指定规则分割字符串,返回String数组
public class exercise_split {
    public static void main(String[] args) {
        String s1 = "abc-d-e-fg";
        String[] arr = s1.split("-");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
}

三、扩展方法

1.boolean contains(String s) - > 判断调用者字符串是否包含指定的串儿
2.boolean endsWith(String s) - > 判断调用者字符串是否是以指定字符串结尾
3.boolean startsWith(String s) - > 判断调用者字符串是否是以指定字符串开头
4.String toLowerCase() - > 将所有字母变为小写
5.String toUpperCase() - > 将所有字母转为大写
6.String trim() - > 去除字符串两端的空格
public class String_extend {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        //1.boolean contains(String s) - > 判断调用者字符串是否包含指定的串儿
        System.out.println("s1.concat(\"fg\") = " + s1.concat("fg"));
        //2.boolean endsWith(String s) - > 判断调用者字符串是否是以指定字符串结尾
        System.out.println("s1.endsWith(\"fg\") = " + s1.endsWith("fg"));
        //3.boolean startsWith(String s) - > 判断调用者字符串是否是以指定字符串开头
        System.out.println("s1.startsWith(\"ab\") = " + s1.startsWith("ab"));
        //4.String toLowerCase() - > 将所有字母变为小写
        System.out.println("\"Application\".toLowerCase() = " + "Application".toLowerCase());
        //5.String toUpperCase() - > 将所有字母转为大写
        System.out.println("\"Application\".toUpperCase() = " + "Application".toUpperCase());
        //6.String trim() - > 去除字符串两端的空格
        String s2 = "  dwt haha c de ";
        System.out.println(s2);
        System.out.println(s2.trim());
        String replace = s2.replace(" ", "");
        System.out.println(replace);
    }
}

第四章.StringBuilder类

1.StringBuilder的介绍
1.概述:一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(线程不安全,效率高)
2.作用:主要作用是字符串拼接
3.问题:
  a.刚讲完String,String也能做字符串拼接,直接用+即可,但是为啥要用StringBuilder去拼接呢?
  b.原因:
    String每拼接一次,就会产生新的字符串对象,就会在堆内存中开辟一个空间,如果拼接次数多了,比较占用内存,效率比较低
    StringBuilder,底层自带一个缓冲区,拼接字符串之后都会在此缓冲区中保存,在拼接的过程中,不会随意产生新对象,比较节省内存
        
4.StringBuilder的特点:
  a.底层自带缓冲区,此缓冲区为没有被final修饰的char数组(jdk8之后是byte数组),默认长度为16
  b.如果超出了数组长度,数组会自动扩容
    创建一个指定长度的新数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
  c.每次扩容2+2
2.StringBuilder的使用
1.构造:
  StringBuilder()
  StringBuilder(String str)    
public class Exercise {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("b");
        System.out.println("sb = " + sb);
        StringBuilder sb1 = new StringBuilder("abc");
        sb1.append("def");
        System.out.println("sb1 = " + sb1);
    }
}
常用:
  StringBuilder append(任意类型数据) -> 字符串拼接,返回的是StringBuilder自己
  StringBuilder reverse()-> 字符串翻转,返回的是StringBuilder自己
  String toString() ->StringBuilder转成String ->StringBuilder拼字符串是为了快,节省内存空间,那么拼完之后我们后续可能会处理拼接好的字符串,所以我们需要将StringBuilder转成String,才能调用String中的方法去处理拼接好的字符串
public class Exercise01 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("a");
        //StringBuilder append(任意类型数据) -> 字符串拼接,返回的是StringBuilder自己
        sb = sb.append("dc").append("ef");          //链式调用
        System.out.println("sb = " + sb);

        //StringBuilder reverse()-> 字符串翻转,返回的是StringBuilder自己
        sb.reverse();
        System.out.println("sb = " + sb);

        // String toString() -> 将StringBuilder转成String
        String s = sb.toString();
        System.out.println("s.length() = " + s.length());
    }
}
3.练习
练习:键盘录入一个字符串,判断此字符串是否为"回文内容"  
    比如: 上海自来水来自海上   abcba
public class Huiwen {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        String message = sc.next();

        StringBuilder sb = new StringBuilder(message);
        sb.reverse();

        String s = sb.toString();
        
        if (s.equals(message)){
            System.out.println("是回文数");
        }else {
            System.out.println("不是回文");
        }
        sc.close();
    }
}
4.练习2
定义一个数组,[元素1, 元素2, 元素3..]的形式输出,StringBuilder拼接
public class Exercise2 {
    public static void main(String[] args) {
        String[] arr = {"a", "b", "c", "d"};
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
        }
        System.out.println("sb = " + sb);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值