自学Java-0基础到框架(JDK8)-day05
常用类
String类
创建字符串方法:
String str = "Hello";
String str2 = new String("Hello2");
-
对于str,编译器会使用该值创建一个String对象
-
如果使用new创建的字符串对象在堆上,如果String创建的字符串则存储在公共池中
-
String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了,原因在于实例中的 String类的变量只是一个 String对象的引用,并不是对象本身,当执行str = "Hello World";时,创建了一个新的对象 "Hello World",而原来的 "Hello" 还存在于内存中。
长度 length() 方法:
String str = "Hello World";
System.out.println(str.length());
//输出 11
字符串链接concat()方法:
String str1 = "Hello";
String str2 = "World";
String str = str1.concat(str2);
System.out.println(str);
//输出 HelloWorld
创建格式化字符串
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出
String str = String.format("字符串变量%s %s" +
"浮点型变量的值为 %f" +
"整型变量的值为 %d", "Hello", "World",123.456,123);
System.out.println(str);
//输出 字符串变量Hello World浮点型变量的值为 123.456000整型变量的值为 123
这里贴出菜鸟教程中写出的String类方法
StringBuffer 和 StringBuilder 类
对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类,这两个类的对象能够被多次的修改,并且不产生新的未使用对象
这里贴出菜鸟教程的解释
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuilder
StringBuilder sb = new StringBuilder(15);
// 15 是初始容量
sb.append("Hello");
// 可以追加任意类型的数据
sb.append(123);
System.out.println(sb);
sb.insert(5, "World");
System.out.println(sb);
sb.delete(5, 10);
System.out.println(sb);
sb.reverse();
// 反转字符串
System.out.println(sb);
sb.reverse();
// 反转字符串
System.out.println(sb);
sb.insert(5, "World");
// 在第 5 个位置插入 World
System.out.println(sb);
sb.append(true);
// 可以超出容量,但是不会报错
System.out.println(sb);
输出:
Hello123
HelloWorld123
Hello123
321olleH
Hello123
HelloWorld123
HelloWorld123true
StringBuffer
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
因为目前还没了解到线程相关的知识,这里不进行线程方面的演示
StringBuffer 方法
String:字符串常量,字符串长度不可变。Java中String 是immutable(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。
StringBuilder:字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。
基本原则:
- 如果要操作少量的数据用 String ;
- 单线程操作大量数据用StringBuilder ;
- 多线程操作大量数据,用StringBuffer。
JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?
最简单的回答是,stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 stringbuiler,除非你真的遇到了一个需要线程安全的场景,如果遇到了,请务必在这里留言通知我。
然后,补充一点,关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有 99.99....99% 的情况下没有必要选择 stringbuffer,因为 stringbuffer 的线程安全,仅仅是保证 jvm 不抛出异
Scanner 类
通过 Scanner 类来获取用户的输入
Scanner s = new Scanner(System.in)
可以使用next() 与 nextLine() 方法获取输入的字符串
next:
Scanner s = new Scanner(System.in);
System.out.println("next方式接收:");
// 判断是否还有输入
if (s.hasNext()) {
String str = s.next();
System.out.println(str);
}
s.close();
//输入 abcde fgh
//输出 abcde
nextLine:
Scanner s1 = new Scanner(System.in);
System.out.println("nextLine方式接收:");
// 判断是否还有输入
if (s1.hasNextLine()) {
String str = s1.nextLine();
System.out.println(str);
}
s1.close();
//Input: abcd efgh
//Output: abcd efgh
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。