【JavaSE】String类(创建、常量池、常见操作、优化)

目录

一、字符串的创建

二、字符串常量池

三、字符串的常见操作

1.常见操作

2.例题

四、字符串的优化


一、字符串的创建

1.字符串常量直接构建

String str = "hello";

2.构造函数

String类的构造函数有多个,常见的方法如下:

String str2=new String("hello");

char[] helloArray = { 'h', 'e', 'l', 'l', 'o'};

String helloString = new String(helloArray);

二、字符串常量池

        字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable。目的是为了提高性能,减小内存开销。所在位置、大小和JDK的版本相关。我们先来看下面的例子

public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s3 == s4); // false
}

s1和s2是字符串字面量直接赋值,s3和s4是new一个新的字符串。其中前者绘入池,后者不会入池。

三、字符串的常见操作

1.常见操作

equals:不解释

length:注意,不要和Arrays的length属性弄混

charAt:返回指定索引处的char值

toCharArray:将此字符串转换为新的字符数组

indexOf:返回指定字符或字符串第一次出现的字符串中的索引。可以从指定位置开始搜索

lastIndexOf:与上面类似,返回指定字符最后一次出现的字符串中的索引

valueOf:返回参数的字符串表现形式

contains:当且仅当此字符串包含指定的char值序列时,才返回true

startsWith:测试此字符串是否以指定的前缀开头

endsWith:测试此字符串是否以指定的后缀结尾

toUpperCase:将此字符串所有字符转换为大写

toLowerCase:将此字符串所有字符转换为小写

format:使用指定的格式字符串和参数返回格式化字符串

replace:将字符串中的所有oldChar替换为newChar

substring:返回一个字符串,该字符串是此字符串的子字符串

split:将此字符串拆分为字符串数组

join:将一些字符串合并为一个字符串

trim:删除首尾的空格

2.例题

2.1. 第一个只出现一次的字符

思路:我们可以遍历两遍字符串,第一遍遍历记录字符出现的频次。第二遍遍历同时查看出现的频次,如果频次为1则直接输出。代码如下:

class Solution {
    public int firstUniqChar(String s) {
        int[] count=new int[26];
        for (char c : s.toCharArray()) {
            int i=c-'a';
             count[i]++;
        }
        int index=0;
        for (char c : s.toCharArray()) {
            int i=c-'a';
            if(count[i]==1){
                return index ;
            }
            index++;
        }
        return -1;
    }
}

2.2最后一个单词的长度

思路:我们可以直接找到最后一个空格的索引,然后通过字符串最后一个数字的索引计算出最后一个单词的长度

import java.util.Scanner;

class Solution{
    public int LengthOfLastWorld(String s){
        //用来实现
        return s.length()-1-s.lastIndexOf(" ");
    }
    public int LengthOfLastWorld02(String s){
        int i = s.lastIndexOf(" ");
        String substring = s.substring(i + 1);
        return substring.length();
    }
    public int LengthOfLastWorld03(String s){
        String[] split = s.split(" ");
        return split[split.length - 1].length();
    }


}
public class Main {

    public static void main(String[] args) {
        //专心处理输入输出

        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        Solution solution = new Solution();
        int length = solution.LengthOfLastWorld(s);
        System.out.println(length);
    }
}

2.3检测字符串是否为回文 

思路:将字符串转变为小写,然后转变为字符数组。通过一次遍历,将是数字和字母的转存到一个新的字符数组中,然后再通过前后两个指针来比较,如果不相等,直接输出false,遍历结束输出true。

class Solution {
    public boolean isABC(char c){
        if(c>='0'&&c<='9'){
            return true;
        }
        return c>='a'&&c<='z';
    }
    public boolean isPalindrome(String s) {
        char[] c =s.toLowerCase().toCharArray();
        char[] c2=new char[c.length];
        int k=0;
        for (char c1 : c) {
            if(isABC(c1)){
               c2[k++]=c1;
            }
        }
        int i=0;
        int j=k-1;
        while(i<j){
            if(c2[i]!=c2[j]){
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
}

四、字符串的优化

        任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。 通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和 StringBuilder类。 StringBuffer 和 StringBuilder 大部分功能是相同的。这里介绍 StringBuilder常用的一些方法,其它需要用到了大家可参阅 StringBuilder在线文档

public static void main(String[] args) {
    StringBuilder sb1 = new StringBuilder("hello");
    StringBuilder sb2 = sb1;
    
    // 追加:即尾插-->字符、字符串、整形数字
    sb1.append(' '); // hello
    sb1.append("world"); // hello world
    sb1.append(123); // hello world123
    System.out.println(sb1); // hello world123
    System.out.println(sb1 == sb2); // true
    System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
    System.out.println(sb1.length()); // 获取字符串的有效长度14
    System.out.println(sb1.capacity()); // 获取底层数组的总大小
    sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
    sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
    System.out.println(sb1);
    System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
    System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
    sb1.deleteCharAt(0); // 删除首字符
    sb1.delete(0,5); // 删除[0, 5)范围内的字符
    String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
    System.out.println(str);
    sb1.reverse(); // 字符串逆转
    str = sb1.toString(); // 将StringBuffer以String的方式返回
    System.out.println(str);
}

String、StringBuffer、StringBuilder的区别

        String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.

        StringBuffer与StringBuilder大部分功能是相似的

        StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程 不安全操作

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值