String(字符串)
1.String类的构造方法
- 不采用new的方式,而是像基本类型那样直接赋值
String str = "我是帅哥!!!";
- 采用无参构造器
String str = new String();
- 采用有参数的构造器
//String类型的参数
String str = new String(String original);
//byte[]数组类型的参数,每一个byte数代表一个字符
String str1 = new String(byte[] bytes);
//byte[]类型和charset类型的参数,charset是设置字符编码集,如utf-8
String str2 = new String(byte[] bytes, Charset charset);
//Stringbuffer参数
String str3 = new String(StringBuffer buffer);
//StringBuilder参数
String str4 = new String(StringBuilder builder);
//其余创建方式很难见到,有兴趣可以及翻看JavaAPI
2.String类在内存中的创建过程
我们以直接赋值创建String和new String();创建String两种方式来分别讲解。
- 首先是直接赋值创建String类
String str = "我很帅";
- 然后是利用构造器来创建String类
String str = new String("我真的很帅");
3.String类的特性
在String类的成员变量中有个属性是private final char value[];
正是因为final和private修饰,所以字符串有两个不可变特性,其不可变表现在字符串对象一旦被创建,字符串长度不可变,字符串内容不可变。
4.String类的常用方法
- equals()
重写自Object类的方法,用于比较两个字符串值是否相同。 - hoshCode()
重写自Object类的方法,将当前字符串的每一个char元素拆开乘以31并求和。 - compareTo(String str)
实现自Compereble接口的方法,按照Unicode编码的索引顺序进行比较 - toString()
重写自Object类的方法,输出字符串值。 - charAt(int index)
返回给定index位置对应的字符 - codePointAt(int index)
返回给定index位置的code码 - length()
返回字符串长度,其实是底层char[]的长度(注意区别数组中的length、String的length()方法和集合的size()方法) - concat(String str)
将给定的字符串拼接到当前字符串当中,与“+”类似。
concat()和+的比较:
- 从拼接效率上来说,concat方法要比+效率高(如果频繁拼接字符串还是使用StringBuilder、StringBuffer更好)
- 从功能上来讲,concat只能拼接字符串,而+可以拼接各种数据类型更加比较灵活
- contains(CharSequence s)
判断给定的s是否存在字符串中 - startsWith(String prefix) / endsWith(String suffix)
判断此字符串是否以××××开头 / 结尾 - getBytes()
返回该字符串对应的byte[] - toCharArray()
返回该字符串对应的char[] - indextOf(int ch) / indexOf(int ch , int fromIndex) / indextOf(String str) / indexOf(String str , int fromIndex)
indexOf的四种重载方法,作用是找寻给定字符第一次出现的位置,其中int ch参数对应的是字符的编码值,int fromIndex参数代表从什么位置开始找,没有返回-1 - lastIndexOf(int ch) / lastIndexOf(int ch ,fromindex) / lastIndexOf(String str) / lastIndexOf(String str , int fromIndex)
lastIndexOf的四种重载方法,作用是找寻给定字符最后一次出现的位置,其中int ch参数对应的是字符的编码值,int fromIndex参数代表从什么位置开始找,没有返回-1 - isEmpty()
判断当前字符串是否为空字符串。
isEmpty()与null的区别
- isEmpty()返回true的时候证明这个字符串内容为"",也就是俗称空串,意思是这个字符串对象产生了,只不过是空值而已;
- null代表这个String根本没有被创建出来。
- replace(char oldChar, char newChar)
将给定字符串替换成另外的字符串 - replaceAll(String regex, String replacement)
将给定字符串替换成另外的字符串,可以写正则表达式 - replaceFirst(String regex, String replacement)
只将第一次出现的那个指定字符串给替换掉,可以写正则表达式 - split(String regex)/split(String regex,int limit)
按照指定规则拆分,limit代表拆成多少份 - substring(int beginIndex) / substring(int beginIndex , int endIndex)
将字符串截取,从beginIndex开始到endIndex结束,如果不使用endIndex参数则默认截取到末尾。 - toUpperCase() / toLowerCase()
将字符串全部大写 / 小写 - trim()
去掉前后空格 - matches(String regex)
判断此字符串是否满足自己定义的规则
5.String类在面试中经常遇到的问题
- 在创建String中,new一个新的字符串会产生多少空间?
具体请参看上面第二部分创建String内存详情图 - “==”与equals()的区别
详情请参看“==”和equals的用法及区别 - 能够解释下面的内存原理
String str1 = "我很帅";
String str2 = str1;
String str3 = new String("我很帅");
String str4 = new String("我真的很帅");