String和StringBuilder和StringBuffer的必练好题

本文介绍了String、StringBuffer和StringBuilder的区别,包括可修改性、线程安全性和常用方法。还探讨了字符串中的第一个唯一字符、最后一个单词的长度和回文串验证的算法。

目录

1. String、StringBuffer、StringBuilder的区别

2.字符串中的第一个唯一字符

 方法:辅助数组法

 3.字符串最后一个单词的长度

方法1:使用split

方法2:使用lastIndexOf,substring

4.验证回文串


1. StringStringBufferStringBuilder的区别

(1)String的内容不可修改,StringBufferStringBuilder的内容可以修改.。

(2)StringBufferStringBuilder的方法大部分相同,但与String有差异。

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

补充1:

StringBuilder StringBuffer 类,这两个类大部分功能是相同的,这里介绍 常用的一些方法
方法
说明
StringBuff append(String str)
在尾部追加,相当于 String += ,可以追加: boolean char char[] 、 double、 flfloat int long Object String StringBuffff 的变量
char charAt(int index)
获取 index 位置的字符
int length()
获取字符串的长度
int capacity()
获取底层保存字符串空间总的大小
void ensureCapacity(int
mininmumCapacity)
扩容
void setCharAt(int index, char ch)
index 位置的字符设置为 ch
int indexOf(String str)
返回 str 第一次出现的位置
int indexOf(String str, int
fromIndex)
fromIndex 位置开始查找 str 第一次出现的位置
int lastIndexOf(String str)
返回最后一次出现 str 的位置
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找 str 最后一次出现的位置
StringBuff insert(int
offset, String str)
offset 位置插入:八种基类类型 & String 类型 & Object 类型数据
StringBuffer
deleteCharAt(int index)
删除 index 位置字符
StringBuffer delete(int
start, int end)
删除 [start, end) 区间内的字符
StringBuffer replace(int
start, int end, String str)
[start, end) 位置的字符替换为 str
String substring(int start)
start 开始一直到末尾的字符以 String 的方式返回
String substring(int
start int end)
[start, end) 范围内的字符以 String 的方式返回
StringBuffer reverse()
反转字符串
String toString()
将所有字符按照 String 的方式返回

补充2:

尽量避免直接对 String 类型对象进行修改,因为 String 类是不能修改的,所有的修改都会创建新对象,效率 非常低下。

2.字符串中的第一个唯一字符

字符串中的第一个唯一字符icon-default.png?t=N7T8https://leetcode.cn/problems/first-unique-character-in-a-string/

 

 方法:辅助数组法
class Solution {
    public int firstUniqChar(String s) {
     int[] arr=new int[26];
     for(int i=0;i<s.length();i++){
         arr[s.charAt(i)-97]++;
     }
     for(int i=0;i<s.length();i++){
         if(arr[s.charAt(i)-97]==1){
             return i;
         }
     }
     return -1;
    }
}

解析:

我们可以对字符串进行两次遍历,第一次遍历时,我们使用辅助数组统计出字符串中每个字符出现的次数。 arr[s.charAt(i)-97]++;

在第二次遍历时,我们只要遍历到了出现一次的字符,那么就返回它的索引

if(arr[s.charAt(i)-97]==1){
             return i;
   }

否则在遍历结束后返回 −1


 3.字符串最后一个单词的长度

问题非常简单,只要用好String的库函数中的方法即可。

方法1:使用split
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s= in.nextLine();
        String[] arr=s.split(" ");
        System.out.println(arr[arr.length-1].length());
    }
}
方法2:使用lastIndexOf,substring
public class Main {
   public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s=in.nextLine();
        int x=s.lastIndexOf(" ");
        System.out.println(s.substring(x+1).length());
    }
}

4.验证回文串

验证回文串icon-default.png?t=N7T8https://leetcode.cn/problems/valid-palindrome/

 

class Solution {
     public static boolean isNumOrCharacter(char ch) {
        if (ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z') {
            return true;
        }
        return false;
    }

    public static boolean isPalindrome(String s) {
        s = s.toLowerCase();
         int i=0,j=s.length()-1;
         while(i<j){
             while(i<j&&!isNumOrCharacter(s.charAt(i))){
                 i++;
             }
             while(i<j&&!isNumOrCharacter(s.charAt(j))){
                 j--;
             }

             if(s.charAt(i)!=s.charAt(j)){
                 return false;
             }
             i++;
             j--;
         }
         return true;
    }
}

 解析:


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值