# 1 API文档注释
* 有三种注释
1. `单行注释 //`
2. `多行注释 /* */`
3. `文档注释 /** */`
* 文档注释一般建议写在类, 属性和方法上。jdk提供了javadoc.exe工具
对程序的所有类及属性和方法生成一个说明文档 :API文档
* API : Application Program Interface 应用程序接口
API文档中可以告诉使用者,都有哪些类, 类有哪些属性,类有哪些方法
方法叫什么名,需要传递几个参数,都是什么类型的,需要返回什么类型的数据以及方法的作用
* jdk API [官方API文档 (Java SE 22 & JDK 22) (oracle.com)](https://docs.oracle.com/en/java/javase/22/docs/api/)
# 2 字符串
* 我们常用的字符串有两种
1. String 不可变字符串
String字符串一旦创建,其内容和长度就不能再被改变
如果通过一些String的方法得到了一个不同内容的字符串,那一定是产生了新的字符串对象
"abc".toUpperCase()
2. StringBuilder 可变字符串
StringBuilder字符串对象创建后, 其内容和长度都可以改变。
从一个内容到另一个内容,在内存中依然只有这一个StringBuilder字符串对象
要求:循环99次, 每次都为字符串增加一个字母9
String s = "" ;
for(int i=0;i<99;i++){
s += "9" ;
}
## 2.1 String字符串
### 创建方式
1. 使用构造器创建 (好多构造器)
String s = new String(); //创建了一个String对象,但不包含任何内容
String s = new String("BUKA") ;
String s = new String(new char[]{'b','u','k','a'}) ;
String s = new String(new byte[]{98,121,105,97});
2. 直接双引号创建
String s = "" ;
String s = "buka" ;
> 注意
* 使用双引号包含一组字符,会在jvm内存中产生一个字符串对象
* 同时这个字符串对象会被存储在JVM内存中的一个特殊位置,称为:常量区
* 常量区中存储的字符串不能重复,也就是同一个内容的字符串只会有一份
* 使用双引号包含的字符串,会优先在常量区中找,存在就返回找到的字符串对象,不存在会创建新对象
String s1 = "buka" ;
String s2 = "buka" ;
//在内存当中产生了1个字符串对象
s1 == s2 ---> true
* 当使用构造器常见字符串对象时,一定会产生新的字符串对象
```java
String s1 = new String("buka");
String s2 = new String("buka") ;
s1 == s2 ---> false
```
* 思考:下面代码在内存中产生了多少个字符串对象?
```java
String s = new String("buka") ;
String s = new String(new char[]{'b','u','k','a'}) ;
```
### String不可变特性
* 基于String源码去了解
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
* String底层使用一个char[]存储字符串内容
* 同时这个字符数组是用final修饰的,final修饰的变量不能被改变(常量)
* value这个变量中存储的是什么? 是字符数组对象的地址
* 因为final修饰,所以这个地址不能变,数组一旦创建长度不能变,所以String长度不能变。
* 理论上数组的长度不可变,但数组的内容是可以改变的。
* 为什么String是内容不可变的字符串呢?
* 因为String没有对外提供可以改变数组内容的方法
* 所以我们在外部使用String时,无法改变内部字符数组的内容 (封装)
### String常用方法
public static void main(String[] args) {
String s = "buka is good !!!" ;
System.out.println(s.length()); //获得字符串中字符的长度
System.out.println(s.charAt(5));//获得指定索引位置的字符 i
System.out.println(s.startsWith("buka")); //判断字符串是否以指定的内容开头
System.out.println(s.endsWith("!!!")); //判断字符串是否以指定的内容结尾
System.out.println(s.equals("BUKA is good !!!")); //比较两个字符串内容是否相等
System.out.println(s.equalsIgnoreCase("BUKA IS GOOD !!!"));//忽略大小写比较
System.out.println(s.indexOf("Is")); //获得指定内容在字符串中第一次出现的位置,以首字母位置为准。不存在返回-1
System.out.println(s.indexOf("o",10)); //从定的位置向后找第一次出现内容的位置,这个位置是整个字符串中的位置
System.out.println(s.lastIndexOf("o")); //从后面向前找到第一次出现指定内容的位置,这个位置是整个字符串的位置
System.out.println(s.trim()); //去掉前后空格
System.out.println(s.replace("buka","BUKA")); //用一个新内容,替换字符串中所有的指定的老内容
System.out.println(s.toLowerCase()); //将字符串中所有的字母变小写
System.out.println(s.toUpperCase());//将字符串中所有的字母变大写
System.out.println(s.contains("is")); //判断字符串中是否包含指定的子内容
System.out.println(s.concat("abc"));//连接一个新字符串,类似于+的作用,但内部机制不同
System.out.println(s.substring(5)); //从指定位置截取后面的所有内容
System.out.println(s.substring(5,7));//截取指定范围内的内容 左闭右开 [5,7)
System.out.println(Arrays.toString(s.split(" "))); //按照指定的符号对字符串内容进行拆分,返回字符串数组
}