String && StringBuilder

第一章.String

1.String介绍

1.1Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现
    凡是带双引号的,都是String 的 对象

1.2字符串是常量;它们的值在创建之后不能更改
    String s = "hello"
    s+="world"

1.3因为 String 对象是不可变的,所以可以共享
    String s1 = "abc"
    String s2 = "abc" 

2.String的实现原理

2.1.String的底层其实是一个被final修饰的数组,这个数组保存了字符串内容中的每一个字符
2.2.注意:
  jdk8:底层是一个被final修饰的char数组
       private final char[] values;

  jdk9:底层是一个被final修饰的byte数组
       private final byte[] value
2.3.为啥由char数组改成了byte数组:节省内存资源
  char类型数据占内存2个字节
  byte类型数据占内存1个字节  

3.String的创建

3.1.String()-> 根据无参构造创建String对象
3.2.String(String s)->根据字符串创建String对象
3.3.String(char[] chars) -> 根据char数组创建String对象

1.String s = new String("abc")共有几个对象?  2个
  第一个:abc
  第二个:new String
    
2.String s = new String("abc")共创建了几个对象? 1个或2个
  a.如果在new String之前abc已经创建出来了,那么针对这句话就创建了一个,就是new String
  b.如果在new String之前 abc 没有创建出来,那么针对这句话就创建了两个,一个是先创建abc,第二个是new

4.字符串常见问题

public class Demo{
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        String s4 = "hello"+"world";
        String s5 = s1+"world";
        String s6 = s1+s2;

        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s5==s6);//false

    }
}

1.拼接字符串的时候,如果之前有这个字符串,并且拼接的时候等号右边都是字符串字面值,不会产生新对象

2.拼接字符串的时候等号右边一旦有变量参数,就会产生新的字符串对象

第二章.String的方法

1.判断方法

boolean equals(String s) -> 比较字符串内容
boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写    

 public static void main(String[] args) {
        String s1 = "abcdefg";
        String s2 = new String("abcdefg");
        String s3 = "ABCDEFG";
        //boolean equals(String s) -> 比较字符串内容
        System.out.println(s1.equals(s2));
        //boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写
        System.out.println(s1.equalsIgnoreCase(s3));
    }

2.获取方法

int length() -> 获取字符串长度
String concat(String s)-> 字符串拼接,返回新串儿
char charAt(int index) -> 根据索引获取对应的字符
int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束
                                                 含头不含尾,返回新串儿

 public static void main(String[] args) {
        String s = "abcdefg";
        //int length() -> 获取字符串长度
        int len = s.length();
        System.out.println("len = " + len);
        //String concat(String s)-> 字符串拼接,返回新串儿
        String newStr = s.concat("hahaha");
        System.out.println("newStr = " + newStr);
        //char charAt(int index) -> 根据索引获取对应的字符
        char data1 = s.charAt(0);
        System.out.println("data1 = " + data1);
        //int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
        int index = s.indexOf("c");
        System.out.println("index = " + index);
        //String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
        String newStr2 = s.substring(2);
        System.out.println("newStr2 = " + newStr2);
        //String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束 含头不含尾,返回新串儿
        String newStr3 = s.substring(0, 3);
        System.out.println("newStr3 = " + newStr3);
    }

3.转换方法

1.char[] toCharArray() -> 将字符串转成char数组
2.byte[] getBytes() -> 将字符串转成byte数组
3.String replace(CharSequence c1,CharSequence c2)-> 替换字符
                 CharSequence->String的接口
    
4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组    

 public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "abcdefg";
        //1.char[] toCharArray() -> 将字符串转成char数组
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
        System.out.println("========================");
        //2.byte[] getBytes() -> 将字符串转成byte数组
        byte[] bytes = s.getBytes();
        System.out.println(Arrays.toString(bytes));
        //3.String replace(CharSequence c1,CharSequence c2)-> 替换字符 CharSequence->String的接口
        String newStr = s.replace("a", "z");
        System.out.println("newStr = " + newStr);
        System.out.println("========================");
        //4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组->编码不区分大小写
        byte[] bytes1 = "你".getBytes();
        System.out.println(Arrays.toString(bytes1));

    }

4.分割方法

String[] split(String regex)->按照指定的规则分割字符串

下面案例中的用"."去分割需要借助转义字符"\",括号中的内容是正则表达式,而"."在正则表达式中代表通配符

 public static void main(String[] args) {
        String s = "abc,java,haha";
        String[] arr = s.split(",");
   
        System.out.println(Arrays.toString(arr));

        System.out.println("====================");
        String s1 = "haha.java";
        String[] arr2 = s1.split("\\.");
        System.out.println(Arrays.toString(arr2));
    }

5.其他方法

boolean contains(CharSequence s)  -> 判断字符串中是否包含指定的串儿
boolean endsWith(String suffix) -> 判断字符串是否以指定的串儿结尾
boolean startsWith(String s) -> 判断字符串是否以指定的串儿开头
String toLowerCase() 将字符串转成小写
String toUpperCase()将字符串转成大写
String trim()去掉字符串两端空格,中间空格不能去

 public static void main(String[] args) {
        //boolean contains(CharSequence s)  -> 判断字符串中是否包含指定的串儿
        boolean result01 = "abcdefg".contains("g");
        System.out.println("result01 = " + result01);
        //boolean endsWith(String suffix) -> 判断字符串是否以指定的串儿结尾
        boolean result02 = "abcdefg".endsWith("g");
        System.out.println("result02 = " + result02);
        //boolean startsWith(String s) -> 判断字符串是否以指定的串儿开头
        boolean result03 = "abcdefg".startsWith("a");
        System.out.println("result03 = " + result03);
        //String toLowerCase() 将字符串转成小写
        String s = "avsdfaEWRWEREW".toLowerCase();
        System.out.println("s = " + s);
        //String toUpperCase()将字符串转成大写
        String s1 = "fadsfad".toUpperCase();
        System.out.println("s1 = " + s1);
        //String trim()去掉字符串两端空格,中间空格不能去
        String s3 = " a     b c     d  ";
        System.out.println(s3);
        String trim = s3.trim();
        System.out.println(trim);

        String newStr = s3.replace(" ", "");
        System.out.println("newStr = " + newStr);
    }

第三章.String新特性_文本块

在Java中,通常需要使用String类型表达HTML,XML,SQL或JSON等格式的字符串,在进行字符串赋值时需要进行转义和连接操作,然后才能编译该代码,这种表达方式难以阅读并且难以维护。

文本块就是指多行字符串,例如一段格式化后的XML、JSON等。而有了文本块以后,用户不需要转义,Java能自动搞定。因此,文本块将提高Java程序的可读性和可写性。

"""
<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
""";

使用“”“作为文本块的开始符和结束符,在其中就可以放置多行的字符串,不需要进行任何转义。

第四章.StringBuilder类

1.StringBuilder的介绍

String拼接字符串每拼接一次都会产生一个新的字符串对象,如果拼接次数多了,太占用内存了,而且效率比较低,所以我们要学StringBuilder来拼接字符串

StringBuilder的特点:
  a.StringBuilder底层是一个没有被final修饰的byte数组,数组的地址值可以改变的
  b.StringBuilder底层默认自带长度为16的缓冲区(数组),字符串拼接之后会自动放到这个缓冲区中,不会随意产生新对象  
  c.如果拼接的字符串超过了16,会自动扩容(创建新数组,指定新容量,将老数组中的元素复制到新数组中,然后将新数组的地址值给老数组)
  d.默认扩容:2倍+2

扩容机制详解:
  a.如果一次性拼接的字符个数,没有超过默认的2倍+2,那么扩容的时候就遵循默认扩容容量->2倍+2
  b.如果一次性拼接的字符个数,超出了默认的2倍+2,那么扩容的时候就按照实际的存储字符个数来扩容    

2.StringBuilder的使用

1.StringBuilder append(任意类型数据)-> 字符串拼接,返回的是StringBuilder自己
2.StringBuilder reverse() -> 字符串翻转,返回是StringBuilder自己
3.String toString() -> 将StringBuilder对象转成String对象------我们用StringBuilder主要是为了拼接字符串,拼完之后,我们需要调用String中的方法处理拼接好的字符串,所以我们需要将StringBuiler对象转成String对象,调用String中的方法

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String data = sc.next();//翻转之前的字符串
        StringBuilder sb = new StringBuilder(data);
        sb.reverse();
        String s = sb.toString();//翻转之后的字符串

        if (data.equals(s)){
            System.out.println("是回文内容");
        }else{
            System.out.println("不是回文内容");
        }
    }

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值