自学Java(JDK8)第五天--String类、Scanner 类
# 自学Java-0基础到框架(JDK8)-day05## 常用类
### String类
#### 创建字符串方法:
```java
String str = "Hello";
String str2 = new String("Hello2");
```
> 1. 对于str,编译器会使用该值创建一个String对象
>
> 2. 如果使用new创建的字符串对象在堆上,如果String创建的字符串则存储在公共池中
> 3. String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了,原因在于实例中的 String类的变量只是一个 String对象的引用,并不是对象本身,当执行str = "Hello World";时,创建了一个新的对象 "Hello World",而原来的 "Hello" 还存在于内存中。
---
#### 长度 length() 方法:
```java
String str = "Hello World";
System.out.println(str.length());
//输出 11
```
---
#### 字符串链接concat()方法:
```java
String str1 = "Hello";
String str2 = "World";
String str = str1.concat(str2);
System.out.println(str);
//输出 HelloWorld
```
---
#### 创建格式化字符串
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出
```java
String str = String.format("字符串变量%s %s" +
"浮点型变量的值为 %f" +
"整型变量的值为 %d", "Hello", "World",123.456,123);
System.out.println(str);
//输出 字符串变量Hello World浮点型变量的值为 123.456000整型变量的值为 123
```
---
这里贴出菜鸟教程中写出的String类方法
![方法](https://s1.ax1x.com/2022/04/04/qHq7a4.png)
---
### StringBuffer 和 StringBuilder 类
对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类,这两个类的对象能够被多次的修改,并且不产生新的未使用对象
这里贴出菜鸟教程的解释
> 在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
>
> StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
>
> 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
---
#### StringBuilder
```java
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);
```
输出:
```java
Hello123
HelloWorld123
Hello123
321olleH
Hello123
HelloWorld123
HelloWorld123true
```
---
####StringBuffer
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
> 因为目前还没了解到线程相关的知识,这里不进行线程方面的演示
#### StringBuffer 方法
!(https://s1.ax1x.com/2022/04/04/qHXK8s.png)
!(https://s1.ax1x.com/2022/04/04/qHXrqK.png)
>**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 类来获取用户的输入
```java
Scanner s = new Scanner(System.in)
```
可以使用next() 与 nextLine() 方法获取输入的字符串
next:
```java
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:
```java
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、可以获得空白。 我的学习计划是一周完成Java最为基础的东西,然后开始学习面向对象基础(3~5天左右),然后更高级操作用法的就无法确定大概的时间了,学无止境 怎么自学啊?哪个网站?哪本书?加油啊 junminlu 发表于 2022-4-4 22:45
怎么自学啊?哪个网站?哪本书?加油啊
看的菜鸟教程和一些视频教程 JAVA好难的啊 绝了 真学的很认真
页:
[1]