String类

String类:

专门用来表示字符串字类型的
学习一个类 一定 要从它的 构造方法开始学

1.String是引用类型,其本身不存储字符串本身
通过调试我们可以发现是str这个引用指向了存有value 和 hash 的对象,这个对象的引用又指向一个字符数组
在这里插入图片描述
在这里插入图片描述
2.String当中的一些方法

(1).length:通过变量名直接调用方法/用字符串直接去调用 可以获得字符串的长度
(2).isEmpty:查看字符串是否为空,为空返回true
在这里插入图片描述

字符串的比较

存在的两种场景:

1.相不相同

  1. 大小

1.相不相同

(3)重写了Object类当中equals方法,调用自己的equals–>如果指向同一个引用那么相同返回true,不同的话将字符串定义成一个数组,一个下标一个下标进行循环比较,如果不同返回false,如果循环走完了,返回true
在这里插入图片描述

2.大小关系

(4)重写了compareTo 这个方法,可以按对应字符进行比较
在这里插入图片描述
如果str1字符串比str2长,那肯定str1>str2
在这里插入图片描述
忽略大小写比较compareToIgnoreCse
在这里插入图片描述
但无法忽略汉字
在这里插入图片描述
equals也可以忽略大小写进行比较
在这里插入图片描述

字符串的查找

1.charAt方法

查找当前字符串下标的某一个字符,并返回这个字符

可以通过charAt来遍历字符串
在这里插入图片描述

2.indexOf方法

返回某一个字符在字符串中第一个出现的位置,返回值是int,所以可以直接输出
在这里插入图片描述
从某一位开始找’c’第一次出现的位置

寻找字符串"abcd”第一次出现的位置,返回值是这个字符串的开始位置
在这里插入图片描述
从第八位开始找"abcd"字符串出现的位置在这里插入图片描述

字符串的转换

valueOf方法

1.数值转换为字符串
在这里插入图片描述
2.类的对象转换为字符串
在这里插入图片描述

1.字符串转换为数字;利用Integer.parseInt();方法
在这里插入图片描述
2.字符串转换为double类型的也同理
在这里插入图片描述

大小写的转换

toUpperCase 和 toLowerCase

1.小写转大写toUpperCase()方法
在这里插入图片描述
2.变小写同toLowerCase();方法
在这里插入图片描述

字符串转数组

toCharArray

利用引用对象名.toCharArray();将字符串转化为返回值为char[]的数组
在这里插入图片描述

格式化

format
s这个引用指向String.format(“%d-%d-%d”,2019,9,14);
就会格式化输出 2019-9-14

字符串替换

使用一个新的字符串替换当前已有的字符串

1.利用repalce替换一个字符

在这里插入图片描述

2.利用replace替换字符串

在这里插入图片描述

3.replaceAll与替换字符串同理

在这里插入图片描述

4.replaceFirst;替换第一个出现的字符串


注意:字符串的替换是产生一个新的字符串,原字符串不会被修改

字符串的拆分

将一个完整的字符串按照指定的分隔符划分为若子字符串。

1.利用split

用空格去分割,利用数组去接收
在这里插入图片描述

2.利用split分若干组

用空格去分,但限制最多分两组
在这里插入图片描述

3.对ip地址进行划分,对于一些特殊的符号作为划分符时,需要在划分符前加上\

在这里插入图片描述
在这里插入图片描述

4.多次拆分

在这里插入图片描述 在这里插入图片描述

字符串的截取

从一个完整的字符串之中截取出部分内容

1.利用subString方法,subString(从哪里开始截取一直截取到结束);

在这里插入图片描述

2.利用subString方法,subString(从哪里开始截取,在哪里截取结束),左闭右开

在这里插入图片描述
在这里插入图片描述

其他方法

trim

将字符串左右两边的空格删掉
在这里插入图片描述

字符串的不可变性

String是一种不可变对象。字符串当中的内容是不可改变的。
只要是双引号引起来值,都会放到字符串常量池当中,如果已经存在,直接返回这个字符串常量池的内容
字符串常量池:底层是一个哈希表 StringTable C++的
在这里插入图片描述

字符串的修改:

在这里插入图片描述
在字符串拼接的过程中产生了多个临时对象

StringBuilder和StringBuffer

一.StringBuilder

1.字符串的一个逆置,reverse

在这里插入图片描述

2.append,拼接

在这里插入图片描述
并且不会产生临时的对象
在这里插入图片描述String和StringBuilder最大的区别在于:String的内容无法修改,而StringBuilder的内容可以修改

问题:如何将StringBuilder对象变为字符串

利用ToString方法
在这里插入图片描述
如果将String类型转换为StringBuilder
在这里插入图片描述

字符串常量池的讲解

1.双引号引起来的统一放到常量池

2.如果常量池有,那么就不再额外存储了

问题的解决:

1.第一次只出现一次的字符

思路:
1.建立计数数组 每得到一个数字字母,就给其对应数字+1,数组容量给为了25,所以a代表0,b为1,c为2
2.第二次遍历数组,谁的出现次数为1,直接返回,循环走完如果还没有找到,返回-1

class Solution {
    public static int firstUniqChar(String s){
        int[] count = new int[25];
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            count[ch-'a']++;
        }

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (count[ch-'a'] == 1) {
                return i;
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        String str = "abcbcbcefe";
        int a = firstUniqChar(str);
        System.out.println(a);
        }
    }

2.最后一个单词的长度

思路:
1.首先利用lastIndexof去找最后一个空格出现的位置
2.再通过subString去截取 最后一个空格出现位置+1
3.最后在输出截取这段字符的长度

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String str = scanner.nextLine();
            int index = str.lastIndexOf(" ");
            String ret = str.substring(index+1);
            System.out.println(ret.length());
        }

3.检查字符串是否为回文

思路:
1.利用LowerCase全部转换为小写
2.双指针法,定义left和right
3.开始循环走left<right
接下来需要判断left或者right下标是否为有效数字/字母
private 一个 isValidChar方法 如果字符大于等于0或者小于等于9 或者 大于等于’a’,小于等于’z’,则为true,否则为false
4.紧接着循环一直找left有效数字 但还需保证left<right
紧接着循环一直找right有效数字 需保证left<right
5.进行判断不相同返回false,如果相同的话left++,right–,直到循环结束,返回true

class Solution {
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            while (left < right && !isValidChar(s.charAt(left))) {
                left++;
            }
            //left是有效的字符了
            while (left < right && !isValidChar(s.charAt(right))) {
                right--;
            }
            //right是有效字符了
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            } else {
                left++;
                right--;
            }
        }
        return true;
    }
     private  boolean isValidChar(char ch) {
        if ( Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值