String类的基本特点
一、String类简介
String类,顾名思义,它是一个类,是一个引用数据类型(见下图)。既然是类,就有自己的方法(普通方法和构造方法)。
二、String类的两种实例化方式
- 直接赋值实例化对象(一般用该方法)
String str="Hello";
- 通过String类的构造方法实例化
String str=new String("Hello");
- 两种实例化的区别 (见下图直观解释)
-
直接赋值实例化:String str=“Hello”;
String类的设计使用了一个共享设计模式。
在JVM底层实际上会自动维护一个对象池,使用直接赋值的方法进行对象实例化时,该实例化对象会自动保存在这个对象池中,若下次直接使用了直接赋值的方法进行了对象实例化,如果此时对象池中有指定的内容,那么将直接进行引用,若没有,则开辟新的字符串对象放在对象池中,供下次使用(所谓对象池就是一个对象数组)。 -
通过String类的构造方法进行实例化String str=new String(“Hello”);
虽然这种做法属于标准做法,但是它有不足之处。
使用构造方法进行实例化,会开辟两块堆内存,并且其中一块会成为垃圾;如果想让该方法实现第一种直接赋值实例化方法的优点,就要进行人工入池:
String str=new String("Hello").intern();//手动入池方法intern()
面试题:解释String类对象的两种实例化方式的区别
- 直接赋值:只会开辟一块堆内存,并且该字符串对象可以保存在对象池中供下次使用,一般采用该方法;
- 构造方法实例化:会开辟两块堆内存,其中一块成为垃圾,不会自动入池,要人工入池。
三、String类的字符串比较
比如两个int型变量,判断相等,用“==”完成,但是如果用其判断字符串相等,则是判断的字符串地址的数值是否相等。若比较字符串是否相等要用String类提供的equals()方法:public boolean equals(String str);
String str1="hello";
String str2=new String("hello");
System.out.println("hello".equals(str2));
面试题:解释String类中“==”和equals()方法的区别
- “==”: 是数值比较,比较的是两个字符串地址的数值;
- equals():字符串内容的比较。
四、字符串常量不可变更
先来看一个栗子:
String str="Hello";
str+="world";
str+="!!!";
System.out.println(str);//此时str=Hello world !!!
以上字符串的变更是字符串对象的变更,而不是字符串内容的变更。(见下图解释)
字符串没有发生改变,而是字符串引用一直在发生改变,并且会产生大量的垃圾,所以在开发过程中,避免此类代码出现,即字符串不适合频繁修改。
总结:
- 字符串的创建就采用直接赋值的方法完成;
- 字符串的比较就使用equals()方法完成;
- 字符串不要改变太频繁。
String类的常用方法
五、String类的常用方法 (在文档中都可以查到)
- 字符串与字符数组
字符串就是一个字符数组,String类中有相应的方法支持两者的相互转换。
方法名称 | 描述 |
---|---|
public String (char[] value) | 将字符数组中的所有内容变为字符串 |
public String (char[] value, int offset, int count) | 将部分字符数组中的内容变为字符串 |
public char charAt(int index) | 取得指定索引位置的字符,索引从0开始 |
public char[] toCharArray() | 将字符串变为字符数组返回 |
- 字节与字符串
字节更多用于数据传输及编码转换处理中,String类中有相应的方法支持两者的相互转换。
方法名称 | 描述 |
---|---|
public String (byte[] bytes) | 将字节数组变为字符串 |
public String (byte[] bytes,int offset, int length) | 将部分字节数组变为字符串 |
public byte[] getBytes() | 将字符串以字节数组的形式返回 |
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException | 编码转换处理 |
- 字符串比较
之前的equals()方法是区分大小写的判断,除此之外,还有以下几种:
方法名称 | 描述 |
---|---|
public boolean equals(string anObject) | 区分大小写比较 |
public boolean equalsIgnoreCase(String anotherString) | 不区分大小写比较 |
public int compareTo(String anotherString) | 比较两个字符串大小关系 |
- 字符串查找
方法名称 | 描述 |
---|---|
public boolean contains(String s) | 判断一个字符串是否存在 |
public int indexOf(String str) | 从头开始查找指定字符串的位置,查到后返回位置开始索引,没查到返回-1 |
public int indexOf(String str,int fromIndex) | 从指定位置开始查找字符串的位置 |
public int lastIndexOf(String str) | 从后向前开始查找字符串的位置 |
public int lastIndexOf(String str,int fromIndex) | 从指定位置从后向前查找 |
public boolean startsWith(String prefix) | 从头判断是否以指定字符串开头 |
public boolean startsWith(String prefix,int offset) | 从指定位置开始判断是否以指定字符串开头 |
public boolean endsWith(String suffix) | 判断是否以指定的字符串结尾 |
- 字符串替换
使用新的字符串替换已有的字符串数据。
方法名称 | 描述 |
---|---|
public String replaceAll(String regex,String reolacement) | 替换所有内容 |
public String replaceFirst(String regex, String replacement) | 替换首个内容 |
- 字符串拆分
将一个完整的字符串按指定的分隔符划分为若干个字符串。
方法名称 | 描述 |
---|---|
public String[] split(String regex) | 将字符串全部拆分 |
public String[] split(String regex,int limit) | 将字符串部分拆分,该数组长度就是limit极限(数组最大长度) |
- 字符串截取
从一个完整的字符串中截取部分内容。
方法名称 | 描述 |
---|---|
public String substring(int beginIndex) | 从指定索引截取到结尾 |
public String substring(int beginIndex,int endIndex) | 截取部分内容 |
- 字符串其他操作方法
方法名称 | 描述 |
---|---|
public String trim() | 去掉字符串中的左右空格 |
public String toUpperCase() | 字符串转大写 |
public String toLowerCase() | 字符串转小写 |
public String intern() | 字符串入对象池 |
public String concat(String str) | 字符串连接,等同于“+”号 |
public int length() | 取得字符串长度 |
public bollean isEmpty() | 判断是否为空字符串 |
<具体方法内容查文档里都有。>
- 字符串首字母大写
注:在String类中唯一的遗憾就是没有提供首字母大写的操作,需要自己实现。
public class Demo{
public static void main(String[] args) {
String name ="tom";
System.out.println(initcap(name));
}
public static String initcap(String str) {
if (str==null || " ".equals(str)) {
return str;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1);
}
return str.toUpperCase();
}
}
(OMG终于写完了!欢迎批评指正!orz)