一个顶层设计者眼中只有2个东西接口,类(属性,方法)
无论String 类 , HashMap实现类 , Map接口
String str = "Hello" ; // 定义字符串,工作中就用这个方法,另外的一个方法不用
对于String而言肯定是一个类,str应该就是这个类的对象,能够点出来这个类的方法。
String毕竟是一个类,那么类之中一定会存在构造方法,String类的构造:public String(String str);
String str = new String("Hello") ; // 定义字符串
可以通过构造方法为String类对象实例化。
面试题:请解释字符串比较之中“==”和equals()的区别?
· ==:比较的是两个字符串内存地址的数值是否相等,属于数值比较;
· equals():比较的是两个字符串的内容,属于内容比较。
以后进行字符串相等判断的时候都使用equals()。
public class StringDemo { public static void main(String args[]) { String str = null ; // 假设是输入的 if (str.equals("Hello")) { System.out.println("条件满足。") ; } } } |
Exception in thread "main" java.lang.NullPointerException at StringDemo.main(StringDemo.java:4) |
而如果说现在将代码反过来操作:
public class StringDemo { public static void main(String args[]) { String str = null ; // 假设是输入的 if ("Hello".equals(str)) { System.out.println("条件满足。") ; } }} |
因为字符串常量就是一个匿名对象,匿名对象永远不可能为null,这样的比较才更加的合理。
String类的两种实例化方式的区别
在String类进行设计的时候采用了一种称为共享设计模式的概念
如果用户采用了直接赋值的方式,会将字符串的内容放入到池之中,以供其他继续使用直接赋值方式的String对象使用,如果新声明的字符串内容不再池之中,则会开辟一个新的,继续放到池,以供下次使用。
public static void main(String args[]) {
String str1 = new String("Hello") ;
String str2 = "Hello" ; // 入池
String str3 = "Hello" ; // 使用池对象
System.out.println(str1 == str2) ; // false
System.out.println(str1 == str3) ; // false
System.out.println(str2 == str3) ; // true
}
面试题:请解释String类的两种对象实例化方式的区别?
· 直接赋值:只开辟一块堆内存空间,字符串的内容可以自动入池,以供下次使用;
· 构造方法:开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,使用intern()手工入池。
在日后的所有开发之中,String对象的实例化永远都采用直接赋值的方式完成。
字符串的内容一旦声明则不可改变
String str = "Hello " ;
str += "World " ;
str= str + "!!!" ;
System.out.println(str) ;
输出:
Hello World !!!
字符串内容的更改,实际上改变的是字符串对象的引用过程,并且会伴随有大量的垃圾出现
3.2、String类的常用方法(重点,背)
String类除了之前所介绍的两个方法之外,还存在着大量的其他操作,考虑到String类在实际的工作之中使用非常的广泛,那么就建议大家都背下来,以下所讲解的每一个方法:记住方法的名称、返回值类型、参数的类型及个数、方法的作用。
3.2.1 、字符串与字符
在很多的语言之中,都强调,字符串由字符数组所组成,那么这一概念在Java的String类之中也有体现。
No. |
方法名称 |
类型 |
描述 |
1 |
public String(char[] value) |
构造 |
将全部的字符数组内容变为字符串 |
2 |
public String(char[] value, int offset, int count) |
构造 |
将部分字符数组变为字符串,offset表示开始点,count表示要操作的长度 |
3 |
public char charAt(int index) |
普通 |
取得指定索引位置上的字符 |
4 |
public char[] toCharArray() |
普通 |
将字符串转换为字符数组 |
范例:验证charAt()方法,这个方法是一个标志性方法
public class StringDemo { public static void main(String args[]) { String str = "helloworld" ; char c = str.charAt(7) ; System.out.println(c) ; } } |
范例:字符串和字符数组转换,完成一个小写字符串变为大写字符串的操作,小写字母和大写字母差了32
public class StringDemo { public static void main(String args[]) { String str = "helloworld" ; char data [] = str.toCharArray() ; // 字符串变为字符数组 for (int x = 0 ; x < data.length ; x ++) { System.out.print(data[x] + "、") ; data [x] -= 32 ; // 变大写 } System.out.println() ; System.out.println("全部字符数组变为字符串:" + new String(data)) ; System.out.println("部分字符数组变为字符串:" + new String(data,0,5)) ; } } |
char data [] = {76 , 79 , 86 , 69 , 'A'} ;
System.out.println(new String(data)); //输出 : LOVEA
2 、字符串与字节
String str = "abc" ;
byte data [] = str.getBytes() ; // 字符串变为字节数组
System.out.println(Arrays.toString(data));
// 输出 [97, 98, 99]
人造字符串:
byte data [] = {76 , 79 , 86 , 69} ;
System.out.println(new String(data)); // 自己编程的,LOVE
字符串除了与字符可以互相转换之外,还可以和字节互相转换,操作方法:
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 |
普通 |
字符串转码操作 |
一般情况下,在程序之中如果要想操作字节数组只有两种情况:
· 情况一:需要进行编码的转换时;
情况二:数据要进行传输的时候。
3 、字符串比较
范例:equals()方法
public class StringDemo { public static void main(String args[]) { String str1 = "helloworld" ; String str2 = "HELLOWORLD" ; System.out.println(str1.equals(str2)) ; System.out.println(str1.equalsIgnoreCase(str2)) ; } } |
如果现在要想比较两个字符串的大小关系,那么就必须使用compareTo()方法完成,而这个方法返回int型数据,而这个int型数据有三种结果:大于(返回结果大于0)、小于(返回结果小于0)、等于(返回结果为0)。
范例:比较大小compareTo()方法,C语言方法同
System.out.println("a".compareTo("b")); // 输出-1
public class StringDemo { public static void main(String args[]) { String str1 = "Helloworld" ; String str2 = "HELLOWORLD" ; System.out.println(str1.compareTo(str2)) ; System.out.println("Hello".compareTo("Hello")) ; } } |
对于compareTo()方法一定要记住其返回的类型,以后还会有其他的深入讲解。
4 、字符串查找
No. |
方法名称 |
类型 |
描述 |
1 |
public boolean contains(String s) |
普通 |
查找指定的子字符串是否存在,JDK 1.5之后有 |
2 |
public int indexOf(String str) |
普通 |
从头查找指定字符串的位置,找不到返回-1 |
3 |
public int indexOf(String str, int fromIndex) |
普通 |
由指定位置向后查找字符串的位置,找不到返回-1 |
4 |
public int lastIndexOf(String str) |
普通 |
由后向前查找字符串的位置,找不到返回-1 |
5 |
public int lastIndexOf(String str, int fromIndex) |
普通 |
从指定位置由后向前查找 |
6 |
public boolean startsWith(String prefix) |
普通 |
判断是否以指定的字符串开头 |
7 |
public boolean startsWith(String prefix, int toffset) |
普通 |
从指定位置判断是否以指定字符串开头,JDK 1.7 |
8 |
public boolean endsWith(String suffix) |
普通 |
判断是否以指定的字符串结尾 |
范例:判断开头和结尾操作
public class StringDemo { public static void main(String args[]) { String str = "**@@hello##" ; System.out.println(str.startsWith("**")) ; System.out.println(str.startsWith("@@",2)) ; System.out.println(str.endsWith("##")) ; } } |
范例:使用contains()方法查找字符串是否存在,直接返回boolean,用于各种的执行判断
public class StringDemo { public static void main(String args[]) { String str = "helloworld" ; System.out.println(str.contains("hello")) ; System.out.println(str.contains("xx")) ; } } |
3.2.5 、字符串替换操作
Oracle中的替换函数是replace(),那么String类之中的替换操作有如下几个方法:
No. |
方法名称 |
类型 |
描述 |
1 |
public String replaceAll(String regex, String replacement) |
普通 |
全部替换 |
2 |
public String replaceFirst(String regex, String replacement) |
普通 |
替换首个 |
范例:验证两个替换操作
public class StringDemo { public static void main(String args[]) { String str = "Hello World ." ; System.out.println(str.replaceAll("l","_")) ; // He__o Wor_d . System.out.println(str.replaceFirst("l","_")) ; // He_lo World . } } |
6 、字符串截取
Oracle的截取是substr()函数,这个函数在使用的时候下标从0或1开始都是可以的,不过程序之中只能从0开始,而且不能设置为负数。
No. |
方法名称 |
类型 |
描述 |
1 |
public String substring(int beginIndex) |
普通 |
从指定位置截取到结尾 |
2 |
public String substring(int beginIndex, int endIndex) |
普通 |
截取指定范围的内容 |
范例:字符串截取
public class StringDemo { public static void main(String args[]) { String str = "Hello World ." ; System.out.println(str.substring(6)) ; System.out.println(str.substring(0,5)) ; } } |
7 、字符串拆分
所谓的拆分操作指的就是按照一个指定的字符串标记,对一个完整的字符串进行分割。如果要完成拆分操作,可以使用的方法如下:
No. |
方法名称 |
类型 |
描述 |
1 |
public String[] split(String regex) |
普通 |
按照指定的字符串全拆分 |
2 |
public String[] split(String regex, int limit) |
普通 |
拆分为指定的长度 |
范例:完成全拆分
public class StringDemo { public static void main(String args[]) { String str = "Hello World !!!" ; String result [] = str.split(" ") ; for (int x = 0 ; x < result.length ; x ++) { System.out.println(result[x]) ; } } } |
范例:现在要求拆分IP地址
public class StringDemo { public static void main(String args[]) { String str = "192.168.1.1" ; String result []= str.split("\.") ; for (int x = 0 ; x < result.length ; x ++) { System.out.println(result[x]) ; } } } |
提示:以后在进行字符串拆分的时候,如果遇见拆不开的问题,就使用“\”
8 、其他方法
以上是一些可以分类的功能性的方法,但是在String类中还有一些无法分类的方法,下面统一列出。
No. |
方法名称 |
类型 |
描述 |
1 |
public boolean isEmpty() |
普通 |
判断是否为空字符串("") |
2 |
public int length() |
普通 |
取得字符串长度 |
3 |
public String trim() |
普通 |
去掉左右空格 |
4 |
public String toLowerCase() |
普通 |
将全部字符串转小写 |
5 |
public String toUpperCase() |
普通 |
将全部字符串转大写 |
6 |
public String intern() |
普通 |
入池 |
7 |
public String concat(String str) |
普通 |
字符串连接 |
范例:取得字符串长度和是否为空
public class StringDemo { public static void main(String args[]) { String str = "hello" ; System.out.println(str.isEmpty()) ; // false System.out.println("".isEmpty()) ; // true System.out.println(str.length()) ; System.out.println(" Hello ".length()) ; // 空格也计算 } } |
范例:使用trim()去掉空格
public class StringDemo { public static void main(String args[]) { String str = " hello " ; System.out.println("字符串内容:〖" + str + "〗") ; System.out.println("字符串内容:〖" + str.trim() + "〗") ; // 对象.方法().方法().方法()...代码链,看每个方法的返回值 System.out.println("字符串长度:" + str.trim().length()) ; } } |
String s = str.trim () ; int len = s.length() ; System.out.println("字符串长度:" + len) ; |