String类

作者: 我可能是个假开发 | 来源:发表于2019-01-10 14:16 被阅读57次

String类

String类描述的是文本字符串序列。

特点:

  • 字符串是常量,它的值在创建之后不能再修改。
  • 字符串的内容一旦发生了变化,那么马上会创建一个新的对象。

注意:字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象。如果需要频繁修改的字符串内容,建议使用字符串缓冲类。

一、字符串的创建

创建String类的对象的两种方式:

  1. ""直接赋值法
  2. new关键字法
public class Demo {
    
    public static void main(String[] args) {
        String str1 = "hcx";
        String str2 = "hcx";
        String str3 = new String("hcx");
        String str4 = new String("hcx");
        
        System.out.println(str1==str2);//true
        System.out.println(str1==str3);//false
        System.out.println(str3==str4);//false
        System.out.println(str3.equals(str4));//true
    }

}
  • String str = "hcx":

这种方式创建字符串的时候,jvm首先会检查字符串常量池中是否存在该字符串对象:
如果已经存在,那么就不会在字符串常量池中再创建了,直接返回该字符串常量池中的内存地址;
如果该字符串不存在于字符串常量池中,那么就会在字符串常量池中先创建该字符串对象,然后再返回。

  • new String("hcx"):

这种方式会创建字符串的时候,jvm首先会检查字符串常量池中是否存在"hcx"字符串,如果已经存在,则不会在字符串常量池中创建了;
如果还没有存在,那么就会在字符串常量池中创建"hcx"字符串对象,然后还会去到堆内存中再创建一份字符串的对象,把字符串常量池中的"hcx"字符串内容拷贝至内存中的字符串对象,然后返回堆内存中字符串对象的内存地址。

string内存分析图.png

二、String类常用方法

1.构造方法

  • String() 创建一个空内容 的字符串对象。
  • String(byte[] bytes) 使用一个字节数组构建一个字符串对象
  • String(byte[] bytes, int offset, int length)
    bytes : 要解码的数组
    offset: 指定从数组中那个索引值开始解码。
    length: 要解码多个元素。
  • String(char[] value) 使用一个字符数组构建一个字符串。
  • String(char[] value, int offset, int count) 使用一个字符数组构建一个字符串, 指定开始的索引值,与使用字符个数。
  • String(int[] codePoints,int offset,int count)
  • String(String original)
String str = new String();
byte[] buf = {97,98,99};
str = new String(buf); //使用一个字节数组构建一个字符串对象
str = new String(buf,1,2);   //使用一个字节数组构建一个字符串对象,指定开始解码的索引值和解码的个数。
char[] arr = {'明','天','是','春','节'};
str = new String(arr); //使用字符数组构建一个字符串
str = new String(arr,3,2);
int[] buf2 = {65,66,67};
str = new String(buf2,0,3);
str = new String("abc");
System.out.println("字符串的内容:"+str);

2.获取方法

  • int length() 获取字符串的长度
  • char charAt(int index) 获取特定位置的字符 (角标越界)
  • int indexOf(String str) 获取特定字符的位置(overload)
  • int lastIndexOf(int ch) 获取最后一个字符的位置

示例:

package com.hcx.string;

public class Demo1 {
    
    public static void main(String[] args) {
        String str = "hello world";
        
        System.out.println("length():"+str.length());//11
        //第一次出现字符l的下标位置
        System.out.println("indexOf():"+str.indexOf("l"));//2
        //最后一次出现字符l的下标位置
        System.out.println("lastIndexOf():"+str.lastIndexOf("l"));//9
        //不存在该字符时,返回-1
        System.out.println("indexOf():"+str.indexOf("p"));//-1
        //获取指定下标位置的字母
        System.out.println("chartAt():"+str.charAt(1));//e
        //如果位置越界,则抛出异常
        System.out.println("charAt():"+str.charAt(12));// java.lang.StringIndexOutOfBoundsException
    }

}

3.判断方法

  • boolean endsWith(String str) 是否以指定字符结束
  • boolean isEmpty()是否长度为0 如:“” null V1.6
  • boolean contains(CharSequences) 是否包含指定序列 应用:搜索
  • boolean equals(Object anObject) 是否相等
  • boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等

示例:

public class Demo2 {
    
    public static void main(String[] args) {
        String str = " ";
        System.out.println("length():"+str.length());//1
        System.out.println("isEmpty():"+str.isEmpty());//false
        
        str = "hello java world";
        System.out.println("contains():"+str.contains("java"));//true
        System.out.println("abc".equals("abc"));//true
        //String类重写了equals方法,比较的是String对象存储的字符内容
        System.out.println(new String("abc").equals(new String("abc")));//true
        
        System.out.println(new String("abc").equals(new String("Abc")));//false
        System.out.println(new String("abc").equalsIgnoreCase(new String("Abc")));//true
        str="Demo2.java";
        System.out.println("endsWith():"+str.endsWith(".java"));//true
    }

}

4.转换方法

  • String(char[] value) 将字符数组转换为字符串
  • String(char[] value, int offset, int count)
  • Static String valueOf(char[] data)
  • static String valueOf(char[] data, int offset, int count)
  • char[] toCharArray() 将字符串转换为字符数组

示例:

package com.hcx.string;

public class Demo3 {
    
    public static void main(String[] args) {
        String str = new String(new char[]{'h','e','l','l','o'});
        System.out.println(str);//hello
        
        char[] chars = str.toCharArray();
        for(int i=0;i<chars.length;i++){
            System.out.println(chars[i]);//h e l l o
        }
        
        byte[] bs = new byte[]{97,98,99};
        String str1 = new String(bs);
        System.out.println(str1);//abc
        
        byte[] bytes = str.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);//104 101 108 108 111
        }
    }
}

5.其他方法

  • String replace(char oldChar, char newChar) 替换
  • String[] split(String regex) 切割
  • String substring(int beginIndex)
  • String substring(int beginIndex, int endIndex)截取字串
  • String toUpperCase() 转大写
  • String toLowerCase() 转小写
  • String trim() 去除空格

①手动实现trim:

package com.hcx.string;

public class Demo {

    public static void main(String[] args) {
        String trim = trim("  hello world    ");
        System.out.println(trim);//hello world
    }

    // 定义一个去除字符串两边空格的函数
    public static String trim(String str) {
        // 1、定义求字串需要的起始索引变量
        int start = 0;
        int end = str.length() - 1;
        // 2. for循环遍历字符串对象的每一个字符
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ') {
                start++;
            } else {
                break;
            }
        }
        System.out.println(start);
        for (; end < str.length() && end >= 0;) {
            if (str.charAt(end) == ' ') {
                end--;
            } else {
                break;
            }
        }
        System.out.println(end);
        // 3. 求子串
        if (start < end) {
            return str.substring(start, (end + 1));
        } else {
            return "_";
        }
    }
}

②获取文件名 D:\WorkSpaces\Demo.java

    public static String getFileName2(String path) {
        return path.substring(path.lastIndexOf("\\") + 1);
    }

③将字符串逆序输出

    // 将字符串对象中存储的字符逆序输出
    public static String reaverseString(String src) {
        // 1. 将字符串转换为字符数组
        char chs[] = src.toCharArray();
        // 2. 循环交换
        for (int start = 0, end = chs.length - 1; start < end; start++, end--) {
            // 3. 数据交换
            char temp = chs[end];
            chs[end] = chs[start];
            chs[start] = temp;
        }
        // 4. 将字符数组转换为字符串
        return new String(chs);
    }

④计算子串出现的次数

    public static int getCount(String src, String tag) {
        // 1. 定义索引变量和统计个数的变量
        int index = 0;
        int count = 0;
        // 2. 写循环判断
        while ((index = src.indexOf(tag)) != -1) // jackjava
        {
            // 3. 求字串
            System.out.println(src);
            src = src.substring(index + tag.length()); // index 4 + 4 = 8
            System.out.print(src.length() + " : " + index + " :  " + tag.length());
            // 4. 累加
            count++;
        }
        return count;
    }

相关文章

  • String

    1.String类2.String类和常量池3.String类常用的方法 1.String类 1.String类又...

  • String

    String UML类图 String 被 final 修饰,String 类不可被继承,不可变类。 String...

  • Java之String类

    String 1. String类基本特性 String类再Java类中也是一个很重要的类,String类的对象是...

  • string类

    string类 1. string类常用方法 2. string类常用方法2 3. string类的查找 判断字符...

  • 二十五、String与StringBuffer/StringBu

    一、 String类 1. String类概述 查阅API中的String类的描述,发现String 类代表字符串...

  • String类概述及其构造方法

    构造方法 String类的判断功能 String类的获取功能 String的转换功能 String类的其他功能

  • Java String总结

    Java String总结 String 类 String类定代码如下: 从代码看有两点需要注意: String类...

  • 8.2-全栈Java笔记:字符串相关类(String/Strin

    字符串相关类(String/StringBuilder /StringBuffer) String类 String...

  • 10.常用API—String

    常用API(String,ArrayList) String String类概述 String类定义的变量可以用于...

  • 第四章 复合类型(3)string类简介

    (三)string类简介 1.string类的优势: 使用string类的时候,必须在头文件中包含string,...

网友评论

    本文标题:String类

    本文链接:https://www.haomeiwen.com/subject/cwharqtx.html