String类:
专门用来表示字符串字类型的
学习一个类 一定 要从它的 构造方法开始学
1.String是引用类型,其本身不存储字符串本身
通过调试我们可以发现是str这个引用指向了存有value 和 hash 的对象,这个对象的引用又指向一个字符数组
2.String当中的一些方法
(1).length:通过变量名直接调用方法/用字符串直接去调用 可以获得字符串的长度
(2).isEmpty:查看字符串是否为空,为空返回true
字符串的比较
存在的两种场景:
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;
}
}