xiaotian1339 发表于 2022-4-4 22:32

自学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、可以获得空白。

xiaotian1339 发表于 2022-4-4 22:36

我的学习计划是一周完成Java最为基础的东西,然后开始学习面向对象基础(3~5天左右),然后更高级操作用法的就无法确定大概的时间了,学无止境

junminlu 发表于 2022-4-4 22:45

怎么自学啊?哪个网站?哪本书?加油啊

xiaotian1339 发表于 2022-4-4 22:54

junminlu 发表于 2022-4-4 22:45
怎么自学啊?哪个网站?哪本书?加油啊

看的菜鸟教程和一些视频教程

yimeixiaokeai 发表于 2022-4-5 01:19

JAVA好难的啊

巅峰 发表于 2022-4-5 11:50

绝了 真学的很认真
页: [1]
查看完整版本: 自学Java(JDK8)第五天--String类、Scanner 类