String和StringBuilder
String方法
public boolean equals(Object anObject) 比较字符串的内容,严格区分大小写
public boolean equalsIgnoreCase(String anotherString) 比较字符串的内容,忽略大小写
public int length() 返回此字符串的长度
public char charAt(int index) 返回指定索引处的 char 值
public char[] toCharArray() 将字符串拆分为字符数组后返回
public String substring(int beginIndex, int endIndex) 根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)
public String substring(int beginIndex) 从传入的索引处截取,截取到末尾,得到新的字符串
public String replace(CharSequence target, CharSequence replacement) 使用新值,将字符串中的旧值替换,得到新的字符串
public String[] split(String regex) 根据传入的规则切割字符串,得到字符串数组
字符串常量池和堆内存
- String s = “1”+ “1”创建了几个字符串对象?
1 就是string
- String s = new String(“1”)+ new String(“1”)创建了几个字符串对象?
5个new String(“1”)两个
Stringbuder1个
Tostring一个
11一个
StringBuilder
默认长度16
扩容方法是两倍加2
1. 构造方法:
- `StringBuilder()`: 创建一个空的 `StringBuilder` 实例。
- `StringBuilder(String str)`: 创建一个 `StringBuilder` 实例,并将其初始化为指定的字符串内容。2. 追加内容:
- `append(String str)`: 在 `StringBuilder` 的末尾追加指定的字符串。
- `append(char c)`: 追加单个字符。
- `append(int num)` 或其他基本类型:将各种基本类型数据转换为字符串后追加。
- `append(Object obj)`: 调用对象的 `toString()` 方法,然后追加结果。
3. 插入内容:
- `insert(int offset, String str)`: 在指定位置插入字符串。
- `insert(int offset, char c)` 或其他类型:在指定位置插入字符或其它类型的数据。
4. 替换内容*:
- `replace(int start, int end, String str)`: 替换指定范围内的字符序列。
5. 删除内容:
- `delete(int start, int end)`: 删除指定范围内的字符序列。
6. 反转字符串:
- `everse(): 反转 `StringBuilder` 中的字符序列。
7. 获取字符串:
- `toString()`: 返回由 `StringBuilder` 包含的字符序列组成的字符串。
8. 查找和索引:
- `indexOf(String str)`: 返回指定字符串第一次出现的索引,未找到返回-1。
- `lastIndexOf(String str)`: 返回指定字符串最后一次出现的索引。
9. 设置字符:
- `setCharAt(int index, char ch)`: 将指定位置的字符设置为给定的字符。
10. 增加容量:
- `ensureCapacity(int minimumCapacity)`: 确保 `StringBuilder` 至少具有指定的容量。
11. 截取字符串:
- `substring(int start)` 或 `substring(int start, int end)`:返回从指定位置开始到结尾或指定范围的子字符串。
StringBuilder类和String类的区别
-
String类:内容是不可变的
-
StringBuilder类:内容是可变的
-
创建字符串对象的区别对比
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
String和StringBuilder和StringBuffer
`String`、`StringBuilder`、和 `StringBuffer` 都是Java中用于处理字符串的类,但它们在特性和适用场景上有所不同:
String
String
对象一旦被创建,其内容就不能被改变。这意味着每次对字符串的操作,如拼接、截取等,都会生成一个新的String
对象,而原始对象保持不变。这种设计确保了多个线程同时访问同一个String
对象时,不会看到对象状态的改变,从而避免了线程间的同步问题。
-特点:字符串常量,不可变。每次对字符串的操作(如拼接、替换)都会生成一个新的字符串对象。
使用场景:
- 当字符串不经常改变时,如声明常量、少量的字符串操作或比较。
- 作为方法的参数传递,因为不可变特性保证了线程安全。
- 用于字符串池(String Pool),利用字符串共享节省内存。
StringBuilder
多线程不安全
特点:可变字符串,非线程安全。相较于 `StringBuffer`,在单线程环境下性能更优,因为它不需要进行同步操作。
使用场景:
- 在单线程环境中,特别是在需要频繁进行字符串修改(如拼接、插入、删除)的场合。
- 构建SQL语句、HTML页面生成等动态字符串处理任务。
- 性能敏感且无并发需求的字符串操作。
StringBuffer
使用synchronized同步互斥锁来保证线程是安全的。
特点:可变字符串,线程安全。由于同步机制,所以在多线程环境下能够安全地进行字符串操作。
使用场景:
- 在多线程环境下,当多个线程可能同时访问并修改同一个字符串时。
- 如在服务器端处理并发请求时构建响应字符串。
- XML、JSON等数据解析和构建,尤其是当这些操作在多线程环境中进行时。
总结
选择使用哪种类取决于具体的需求:
- 如果是基本的字符串操作且不涉及多线程,首选 `String`(如果字符串不变)或 `StringBuilder`(如果需要修改)。
- 如果在多线程环境中操作字符串,应该使用 `StringBuffer` 以确保线程安全。
- 对于性能有较高要求且确保在单线程环境下的场景,`StringBuilder` 是最佳选择,因为它避免了不必要的同步开销。
自动拆箱和自动装箱
-
自动装箱
把基本数据类型转换为对应的包装类类型
-
自动拆箱
把包装类类型转换为对应的基本数据类型
Integer i = 100; // 自动装箱
i += 200; // i = i + 200; i + 200 自动拆箱;i = i + 200; 是自动装箱
时间类
LocalDateTime创建方法
方法名 | 说明 |
---|---|
public static LocalDateTime now() | 获取当前系统时间 |
public static LocalDateTime of (年, 月 , 日, 时, 分, 秒) | 使用指定年月日和时分秒初始化一个LocalDateTime对象 |
LocalDateTime获取方法
方法名 | 说明 |
---|---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1-12) |
public int getDayOfMonth() | 获取月份中的第几天(1-31) |
public int getDayOfYear() | 获取一年中的第几天(1-366) |
public DayOfWeek getDayOfWeek() | 获取星期 |
public int getMinute() | 获取分钟 |
public int getHour() | 获取小时 |
LocalDateTime转换方法
方法名 | 说明 |
---|---|
public LocalDate toLocalDate () | 转换成为一个LocalDate对象 |
public LocalTime toLocalTime () | 转换成为一个LocalTime对象 |
LocalDateTime格式化和解析
方法名 | 说明 |
---|---|
public String format (指定格式) | 把一个LocalDateTime格式化成为一个字符串 |
public LocalDateTime parse (准备解析的字符串, 解析格式) | 把一个日期字符串解析成为一个LocalDateTime对象 |
public static DateTimeFormatter ofPattern(String pattern) | 使用指定的日期模板获取一个日期格式化器DateTimeFormatter对象 |
LocalDateTime增加或者减少时间的方法
方法名 | 说明 |
---|---|
public LocalDateTime plusYears (long years) | 添加或者减去年 |
public LocalDateTime plusMonths(long months) | 添加或者减去月 |
public LocalDateTime plusDays(long days) | 添加或者减去日 |
public LocalDateTime plusHours(long hours) | 添加或者减去时 |
public LocalDateTime plusMinutes(long minutes) | 添加或者减去分 |
public LocalDateTime plusSeconds(long seconds) | 添加或者减去秒 |
public LocalDateTime plusWeeks(long weeks) | 添加或者减去周 |
LocalDateTime减少或者增加时间的方法
方法名 | 说明 |
---|---|
public LocalDateTime minusYears (long years) | 减去或者添加年 |
public LocalDateTime minusMonths(long months) | 减去或者添加月 |
public LocalDateTime minusDays(long days) | 减去或者添加日 |
public LocalDateTime minusHours(long hours) | 减去或者添加时 |
public LocalDateTime minusMinutes(long minutes) | 减去或者添加分 |
public LocalDateTime minusSeconds(long seconds) | 减去或者添加秒 |
public LocalDateTime minusWeeks(long weeks) | 减去或者添加周 |
LocalDateTime修改方法
方法名 | 说明 |
---|---|
public LocalDateTime withYear(int year) | 直接修改年 |
public LocalDateTime withMonth(int month) | 直接修改月 |
public LocalDateTime withDayOfMonth(int dayofmonth) | 直接修改日期(一个月中的第几天) |
public LocalDateTime withDayOfYear(int dayOfYear) | 直接修改日期(一年中的第几天) |
public LocalDateTime withHour(int hour) | 直接修改小时 |
public LocalDateTime withMinute(int minute) | 直接修改分钟 |
public LocalDateTime withSecond(int second) | 直接修改秒 |
Period
方法名 | 说明 |
---|---|
public static Period between(开始时间,结束时间) | 计算两个“时间"的间隔 |
public int getYears() | 获得这段时间的年数 |
public int getMonths() | 获得此期间的总月数 |
public int getDays() | 获得此期间的天数 |
public long toTotalMonths() | 获取此期间的总月数 |
Duration
方法名 | 说明 |
---|---|
public static Durationbetween(开始时间,结束时间) | 计算两个“时间"的间隔 |
public long toSeconds() | 获得此时间间隔的秒 |
public int toMillis() | 获得此时间间隔的毫秒 |
public int toNanos() | 获得此时间间隔的纳秒 |
异常
编译时异常和运行时异常的区别
-
编译时异常
-
都是Exception类及其子类
-
必须显示处理,否则程序就会发生错误,无法通过编译
-
-
运行时异常
-
都是RuntimeException类及其子类
-
无需显示处理,也可以和编译时异常一样处理
-
throws方式处理异常
public void 方法() throws 异常类名 {
}
-
这个throws格式是跟在方法的括号后面的
-
编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
-
运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理
throw抛出异常
-
格式
throw new 异常();
-
注意
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了
-
throws和throw的区别
throws throw 用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名 表示声明异常,调用该方法有可能会出现这样的异常 表示手动抛出异常对象,由方法体内的语句处理
try-catch方式处理异常
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}finally{
必会执行的代码
}
-
如果 try 中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch里面的代码
-
如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了 当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码
-
如果出现的问题没有被捕获,那么程序如何运行?
那么try...catch就相当于没有写.那么也就是自己没有处理. 默认交给虚拟机处理.
-
同时有可能出现多个异常怎么处理?
出现多个异常,那么就写多个catch就可以了. 注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面
finally代码必被执行,如果try有retuen函数,会保存返回值,在执行finally函数最后在返回。如果是基本数据类型就是retuen的值,如果是引用数据类型就会发生改变(虽然引用不变,但是地址里的值发生了改变,所以retuen改变)
Throwable成员方法
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
public class ExceptionDemo02 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
// e.printStackTrace();
//public String getMessage():返回此 throwable 的详细消息字符串
// System.out.println(e.getMessage());
//Index 3 out of bounds for length 3
//public String toString():返回此可抛出的简短描述
// System.out.println(e.toString());
//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//public void printStackTrace():把异常的错误信息输出在控制台
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// at com.wedu_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
// at com.wedu_02.ExceptionDemo02.main(ExceptionDemo02.java:11)
}
}
}