String就是C#、C++、java等编程语言中的字符串,所谓字符串,就是一连串的字符;用双引号引起来的几个字符,如"Abc",“星期”。
特别注意:
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象。这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
String str1 = “abc”;
String str2 = new String(“abc”);
两者的区别:s1在内存中有一个对象。s2在内存中有两个对象。
常量池:JVM 中一块独立的区域存放字符串常量和基本类型常量(public static final)。
String 使用 private final char value[]来实现字符串的存储,也就是说 String 对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说 String 类型是不可变的。
String 对象比较:
单独使用"“引号创建的字符串都是常量,编译期就已经确定存储到常量池中;
使用 new String(”")创建的对象会存储到堆内存中,是运行期新创建的;
使用只包含常量的字符串连接符如"aa" + “bb"创建的也是常量。编译期就能确定,已经确定存储到常量池中;
使用包含变量的字符串连接符如"aa” + s1 创建的对象是运行期才创建的,存储在堆中;
String类适用于描述字符串事物。提供了多个方法对字符串进行操作。
1:常用的获取方法。
2:常用的判断方法。
3:常用的转换方法。
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4、其他的常用方法:
练习1:判断字符串是否由1到9的数字组成。示例代码如下:
public class StringDemo {
public static void main(String[] args) {
String s1 = "123456789";
String s2 = "12345 6789";
System.out.println(isnum(s1));
System.out.println(isnum(s2));
}
public static boolean isnum(String s) {
char[] ch = s.toCharArray();
for (char c : ch) {
if (!(c > '0' && c <= '9')) {
return false;
}
}
return true;
}
}
结果截图:
StringBuffer 字符串缓冲区。是一个容器。
特点:1:长度是可变化的。2:可以字节操作多个数据类型。3:最终会通过toString方法变成字符串。
练习2:举例说明这两个类的运行效率。(不用每次新建对象,效率高!)示例代码如下:
public class StringDemo {
public static void main(String[] args) {
String s = "";
long begintime = System.currentTimeMillis();
for (int i = 1; i <= 100000; i++) {
s += i;
}
long endtime = System.currentTimeMillis();
long time = endtime - begintime;
System.out.println("运行时间为:" + time);
StringBuffer s1 = new StringBuffer();
s = "";
begintime = System.currentTimeMillis();
for (int i = 1; i <= 100000; i++) {
s = "" + i;
s1 = new StringBuffer(s);
}
endtime = System.currentTimeMillis();
time = endtime - begintime;
System.out.println("运行时间为:" + time);
}
}
结果截图如下:
总结:String、StringBuffer和StringBuilder(JDK1.5 版本之后出现了):
String 类对象不可变,一旦修改 String的值就是隐形的重建了一个新的对象,释放了原 String对象。
StringBuffer和StringBuilder类是可以通过append()、insert()、reverse()…等方法来修改值。创建的对象是可变。
StringBuffer:线程安全的; StringBuilder:线程非安全的。
字符串连接 String 的 + 比 StringBuffer(StringBuilder) 的 Append() 性能差了很多。
三者在执行速度方面的比较:StringBuilder > StringBuffer > String。