[JavaSE] 认识String类 (字符、字节、字符串)
认识String类
-
- 字符, 字节与字符串
-
- 字符与字符串
- 字节与字符串
- 小结
- 字符串常见操作
-
- 字符串比较
-
- equals
- equalsIgnoreCase
- compareTo
- 字符串查找
-
- contains
- indexOf
- startsWith
- endWith
- 字符串替换
-
- replace
- replaceFirst
- 字符串拆分
-
- split
- 注意事项
- 字符串的截取
-
- substring
- 其他操作方法
字符, 字节与字符串
字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String(char value[]) | 构造 | 将字符数组中的所有内容变为字符串 |
2 | public String(char value[], int offset, int count) | 构造 | 将部分字符数组中的内容变为字符串 |
3 | public char charAt(int index) | 普通 | 取得指定索引位置的字符索引从0开始 |
4 | public char[] toCharArray() | 普通 | 将字符串变为数组返回 |
代码示例 No1
public static void main(String[] args) { char[] val = {'a','b','c'}; String str = new String(val); //这玩意儿不会放到常量池的,因为没用""引起来哦~ System.out.println(str); } //abc
代码示例 No2
public static void main(String[] args) { char[] val = {'a','b','c','d','e','f'}; String str = new String(val,1,3); System.out.println(str); } //bca
代码示例 No3
public static void main(String[] args) { String str="Nick_Bears"; char c = str.charAt(2);//获取2下标的字符 System.out.println(c); }//c
示例代码 No4
public static void main(String[] args) { String str="Nick_Bears"; char[] chars = str.toCharArray();//把str指向的字符串对象变成字符数组 System.out.println(Arrays.toString(chars)); } //[N, i, c, k, _, B, e, a, r, s]
代码示例: 给定字符串一个字符串, 判断其是否全部由数字所组成
思路: 将字符串变为字符数组而后判断每一位字符是否是" 0 “~”‘9’"之间的内容,如果是则为数字
//实现1 public static void main(String[] args) { String str ="5201314"; System.out.println(isNumberChar(str)); } public static boolean isNumberChar(String s){ for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if(c<'0' || c>'9'){ return false; } } return true; }//true//实现2 public static void main(String[] args) { String str ="5201314"; System.out.println(isNumberChar(str)); } public static boolean isNumberChar(String s){ for (int i = 0; i < s.length(); i++) { //判断某个字符是不是数字 char c = s.charAt(i); boolean flg = Character.isDigit(c); if(flg==false){ return false; } } return true; }//true
字节与字符串
字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换。
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String(byte bytes[]) | 构造 | 将字节数组变为字符串 |
2 | public String(byte bytes[], int offset, int length) | 构造 | 将部分节数组中的内容变为字符串 |
3 | public byte[] getBytes() | 普通 | 将字符串以字节数组的形式返回 |
4 | public byte[] getBytes(String charsetName) throws UnsupportedEncodingException | 普通 | 编码转换处理 |
代码示例 No1
public static void main(String[] args) { byte[] bytes={97,98,99,100}; String str = new String(bytes); System.out.println(str); } //abcd
示例代码 No2
public static void main(String[] args) { byte[] bytes={97,98,99,100}; String str = new String(bytes,1,3); System.out.println(str); } //bcd
当你一不小心输入一个值的时候,String上 会出现一条斜线
示例代码 No 3
public static void main(String[] args) { String str = "abcd"; byte[] bytes1 = str.getBytes(); System.out.println(Arrays.toString(bytes1)); }//[97, 98, 99, 100]
示例代码 No 4
public static void main(String[] args) throws UnsupportedEncodingException { String str = "abcd"; String str1 = "abcd好可爱!"; byte[] bytes = str.getBytes("utf-8"); // 英文 1字节 中文 3字节 byte[] bytes1 = str1.getBytes("utf-8"); // 英文 1字节 中文 2字节 byte[] bytes2 = str1.getBytes("GBK"); System.out.println(Arrays.toString(bytes)); System.out.println(Arrays.toString(bytes1)); System.out.println(Arrays.toString(bytes2)); }//[97, 98, 99, 100]//[97, 98, 99, 100, -27, -91, -67, -27, -113, -81, -25, -120, -79, 33]//[97, 98, 99, 100, -70, -61, -65, -55, -80, -82, 33]
小结
那么何时使用 byte[], 何时使用 char[] 呢?
- byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
- char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候
回忆概念: 文本数据 vs 二进制数据
一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容
- 如果看的懂, 就是文本数据(例如 .java 文件)
- 如果看不懂, 就是二进制数据(例如 .class 文件)
字符串常见操作
字符串比较
- 真假比较
- 大小比较
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean equals(Object anObject) | 普通 | 区分大小写比较 |
2 | public boolean equalsIgnoreCase(String anotherString) | 普通 | 不区分大小写比较 |
3 | public int compareTo(String anotherString) | 普通 | 比较两个字符串大小关系 |
equals
源码分析:
- this == anObject 判断地址是否相同,不同false
- anObject instanceof String 判断是否为String类型,不同false
- n == anotherString.value.length 判断长度,不同false
- v1[i] !=v2[i] 最后一个个比较,若不同为false
代码示例:不区分大小写比较
public static void main(String[] args) { String str1 = "Nick"; String str2 = str1; String str3 = "luck"; System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); } //ture //false
equalsIgnoreCase
代码示例:区分大小写比较
public static void main(String[] args) { String str1 = "Nick"; String str2 = "nick"; System.out.println(str1.equalsIgnoreCase(str2)); } //true
compareTo
范例:观察compareTo()比较
public static void main(String[] args) { String str1 = "Nick"; String str2 = "nick"; String str3 = "Nick"; System.out.println(str2.compareTo(str1));//32 System.out.println(str1.compareTo(str3));//0 System.out.println(str1.compareTo(str2));//-32 }
compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一个字符的大小(根据unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容 。
字符串查找
从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean contains(CharSequence s) | 普通 | 判断一个子字符串是否存在 |
2 | public int indexOf(String str) | 普通 | 从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1 |
3 | public int indexOf(String str, int fromIndex) | 普通 | 从指定位置开始查找子字符串位置口 |
4 | public int lastIndexOf(String str) | 普通 | 由后向前查找子字符串位置 |
5 | public int lastIndexOf(String str, int fromIndex) | 普通 | 从指定位置由后向前查找· |
6 | public boolean startsWith(String prefix) | 普通 | 从指定位置开始判断是否以指定字符串开头 |
7 | public boolean startsWith(String prefix, int toffset) | 普通 | 判断是否以指定字符串结尾口 |
8 | public boolean endsWith(String suffix) | 普通 | 判断是否以指定字符串结尾口 |
contains
代码示例: 字符串查找,最好用最方便的就是contains()
public static void main(String[] args) { String str = "abcdefg"; String tmp = "eg"; String tmps = "ab"; System.out.println(str.contains(tmp));//false System.out.println(str.contains(tmps));//true }
该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完成
indexOf
代码示例: 使用indexOf()方法进行位置查找
使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
public static void main(String[] args) { String str = "abcdefg"; String tmp = "de"; System.out.println(str.indexOf(tmp));//类似于c的strstr-> KMP算法 System.out.println(str.indexOf(tmp,4));//设置开始找的位置 -1 System.out.println(str.indexOf(tmp,3));// 3 }//3
public static void main(String[] args) { String str = "dededeabcdefg"; String tmp = "de"; //从后往前找 System.out.println(str.lastIndexOf(tmp));//9 System.out.println(str.lastIndexOf(tmp,6));//4 }
startsWith
endWith
在进行查找的时候往往会判断开头或结尾
代码示例: 判断开头或结尾
public static void main(String[] args) { String str ="NickNickNickNick"; String tmp = "k"; //起始位置 System.out.println(str.startsWith("N"));//true System.out.println(str.startsWith("c"));//false //设置起始偏移量 System.out.println(str.startsWith("N",4));//true System.out.println(str.startsWith("N",5));//false //判断结尾 System.out.println(str.endsWith("CK"));//false System.out.println(str.endsWith("ck"));//true }
字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String replace(char oldChar, char newChar) | 普通 | 替换指定所有内容 |
2 | public String replaceFirst(String regex, String replacement) | 普通 | 替换首个内容 |
replace
replace 和 replaceAll 效果一样的
代码示例: 字符串的替换处理
public static void main(String[] args) { String str = "abababacbacbancabcba"; //相同返回this,不同会new String str2 = str.replace('a', 'b');//这里两个参数是char System.out.println(str2);//bbbbbbbcbbcbbncbbcbb } public static void main(String[] args) { String str = "abcabcabcabc"; //相同返回this,不同会new String str2 = str.replace("ab", "er");//这里两个参数是String System.out.println(str2);//ercercercerc }//------------------------------------------------------------------------------ public static void main(String[] args) { String str = "abababacbacbancabcba"; //相同返回this,不同会new String str2 = str.replaceAll('a', 'b');//这里两个参数是char System.out.println(str2);//bbbbbbbcbbcbbncbbcbb } public static void main(String[] args) { String str = "abcabcabcabc"; //相同返回this,不同会new String str2 = str.replaceAll("ab", "er");//这里两个参数是String System.out.println(str2);//ercercercerc }
replaceFirst
代码示例: 替换首个内容
public static void main(String[] args) { String str = "abcabcabcabc"; String str2 = str.replaceFirst("ab", "er"); System.out.println(str2);//ercabcabcabc }
字符串拆分
split
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String[] split(String regex) | 普通 | 将字符串全部拆分 |
2 | public String[] split(String regex, int limit) | 普通 | 将字符串部分拆分,该数组长度就是limit极限 |
代码示例: 实现字符串的拆分处理(多次拆分)
public static void main(String[] args) { String str = "name=Nick&age=20&classes=大数据一班"; String[] str1 = str.split("&"); for (String s:str1){ String[] str2 = s.split("="); for (String ss:str2){ System.out.print(ss+" "); //name Nick age 20 classes 大数据一班 } } }
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义
代码示例: 拆分IP地址
public static void main(String[] args) { String str = "192.168.1.1"; String[] arr1 = str.split("\\."); for (String s:arr1){ System.out.println(s); } }
注意事项
- 字符"|“,”*“,”+"都得加上转义字符,前面加上 \
- 而如果是" \ \ ",那么就得写成 \ \ \ \ .
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符
**代码示例: | 作为连接符 **
public static void main(String[] args) { //我要将str的全部分割! String str = "name Nick&age=20#classes=大数据一班"; String[] arr = str.split(" |&|=|#"); for(String s:arr){ System.out.print(s+" "); //name Nick age 20 classes 大数据一班 } }
字符串的截取
substring
从一个完整的字符串之中截取出部分内容。可用方法如下:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String substring(int beginIndex) | 普通 | 从指定索引截取到结尾 |
2 | public String substring(int beginIndex, int endIndex) | 普通 | 截取部分内容 |
代码示例: 观察字符串截取 No 2
public static void main(String[] args) { String str ="Nick1234567890"; String sub = str.substring(2,3);//左闭右开[ ) System.out.println(sub);//提取字串 c }
其他操作方法
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String trim() | 普通 | 去掉字符串中的左右空格,保留中间空格 |
2 | public String toUpperCase() | 普通 | 字符串转大写 |
3 | public String toLowerCase() | 普通 | 字符串转小写 |
4 | public native String intern() | 普通 | 字符串入池操作 |
5 | public String concat(String str) | 普通 | 字符串拼接,等同于“+”,不入池 |
6 | public int length() | 普通 | 取得字符串长度 |
7 | public boolean isEmpty() | 普通 | 判断是否为空字符串,但不是null,而是长度为0 |
代码示例: 观察trim()方法的使用
public static void main(String[] args) { String str = " 520 1 3 14"; System.out.println(str.trim());//去除左右两边空格,中间的空格不会被删除 //520 1 3 14 }
代码示例: 大小写转换
public static void main(String[] args) { String str = "nick"; String str1="NICK"; System.out.println(str.toUpperCase()); //NICK System.out.println(str1.toLowerCase());//nick }//这两个函数只转换字母
代码示例:字符串入池
public static void main(String[] args) { String str2=new String("ni")+new String("ck"); str2.intern(); String str="nick"; System.out.println(str==str2);//true } //这里不去过多去讲入池了,详情看第一篇String
代码示例:拼接
public static void main(String[] args) { String str = "Nick"; String ret = str.concat("很宠粉哦~"); //不入池是指拼接好new 出的这个对象不会自动入池 System.out.println(ret); }//Nick很宠粉哦~
代码示例: 字符串length()
public static void main(String[] args) { String str="12345"; System.out.println(str.length()); int[] array = {1,2,3,4,5}; System.out.println(array.length); //搞清楚方法和参数,括号带不带看清楚哦 //Java 里面的数组 非常特殊 机制很多 }
代码示例:观察isEmpty()方法
public static void main(String[] args) { String str="123"; String str1=" "; String str2=""; String str3=new String(); System.out.println(str.isEmpty());//false System.out.println(str1.isEmpty());//false System.out.println(str2.isEmpty());//true System.out.println(str3.isEmpty());//true }
String类并没有提供首字母大写操作,需要自己实现
代码示例: 首字母大写
public static void main(String[] args) { String str="interesting"; System.out.println(FirstUpper(str));//Interesting } public static String FirstUpper(String s){ if("".equals(s) || s==null){ return s; } if(s.length()>1){ return s.substring(0,1).toUpperCase().concat(s.substring(1)); } return s.toUpperCase(); }