String与可变字符串
String
Java中""引起来的,都是这个类的实例,称为字符串。
字符串定义后是一个常量,值不可更改。
像String str = "qwe"
,首先是在字符串常量池寻找是否存在qwe,如果不存在则创建一个qwe,然后将qwe地址值赋给str。
如果使用String类的对象,对其频繁更新时,就会不停地创建对象,不停引用给同一个变量。就会导致执行小路很低,这时就需要使用可变字符串对象。
可变字符串(StringBuilder类和StringBuffer类)
StringBuilder
用于表示可变字符串的一个类,是非线程安全的,建议在单线程环境下使用。
StringBuffer
用于表示可变字符串的一个类,是线程安全的,建议在多线程环境下使用。
StringBuilder和StringBuffer中的方法都是一致的,唯一不同的就是StringBuffer中的方法使用了synchoronized关键字修饰,表示一个同步方法,在多线程环境下不会出现问题。
可变字符串和String之间的转换
String转换为可变字符串
String str="hello";
//通过构造方法将String"包装"为可变字符串对象
StringBuilder sb = new StringBuilder(str);
可变字符串转换为String(任意类型对象转换为String)
方法一:String.valueOf(Object obj)方法
StringBuilder sb = new StringBuilder("你好");
//调用静态方法
String str = String.valueOf(sb);
方法二:对象.toString()方法
StringBuilder sb = new StringBuilder("你好");
//调用toString()
String str = sb.toString();
方法三:
StringBuilder sb = new StringBuilder("你好");
//拼接一个空字符串
String str = sb + "";
注意
StringBuffer和StringBuilder并没有重写equals方法,所以可变字符串的值是否相同时,调用的是 equals中原始的==判断。如果要判断两个可变字符串的值是否相同时,需要将其转换为String后调 用equals判断
System类和RunTime类
System类
RunTime类
这个类不是一个抽象类,但不能创建对象,因为他的构造方法是私有的。
public class Runtime {
//定义了私有的一个静态成员:当前类的对象
//由于静态成员只在类加载时执行一次,所以这里只会创建唯一一个当前类的对象
private static Runtime currentRuntime = new Runtime();
//定义了一个公共的静态方法,用于获取创建的唯一的当前类的对象
public static Runtime getRuntime() {
return currentRuntime;
}
//构造方法是私有的,不能在当前类之外创建对象
private Runtime() {}
}
Date类、SimpleDtaeFormat类、Calendar类
Date通常用于获取系统当前时间
Date date = new Date()
System.out.println(date)
//结果(系统时间)
//星期 月份 日期 时分秒 时区 年
Thu Nov 4 09:54:37 CST 2022
SimpleDateFormat是用于格式化日期时间
Date date = new Date();
//格式化日期模板
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
Calendar用于处理日期细节的类,通过静态方法Calendar.getInstance()获取该类的实例
Calendar cal = Calendar.getInstance();
异常
异常的产生
异常的分类
处理异常
方法一:try-catch-finally语句
try{
//可能出现异常的代码
}catch(异常类 异常对象){
//如果出现异常对象,且与catch小括号中的异常类型匹配,就会执行这里的代码
}catch(异常类 异常对象){
//如果出现异常对象,且与catch小括号中的异常类型匹配,就会执行这里的代码
}finally{
//无论程序是否会抛出异常,都要执行的代码
}
public class Test{
public void fun() throws InterruptException{//这时该方法就会有一个声明:该方法可能
会抛出异常
//这句话直接写完后,会报错,因为sleep()方法可能会抛出InterruptException异常,属于
编译时异常,必须要处理
Thread.sleep(500);
}
}
方法三:throw
public void fun2(){
for(int i=0;i<10;i++){
if(i==5){
//手动抛出异常
throw new NullPointerException();
}
}
}
自定义异常
- 如果继承的是RuntimeException,表示自定义的异常类属于运行时异常,该异常对象可以不用处 理
- 如果继承的是非RuntimeException,表示自定义的异常类属于编译时异常,该异常对象必须要处 理
集合
集合的特点
- 能保存一组数据,可以有序可以无序
- 集合的容量可变
- 集合中可以保存不同类型的数据
- 可以获取集合中保存的元素实际数量
集合框架
![](https://img-blog.csdnimg.cn/7ef1213d602b4f838c62b22bf93c4d9a.png)
Collection接口
![](https://img-blog.csdnimg.cn/a660c8e2b6ef425ab76912063ddac452.png)
List接口(有序可重复)
![](https://img-blog.csdnimg.cn/0322ab4ee98343a0a599504ed4e4911b.png)
ArrayList实现类
- 采用数组实现的集合
- 可以通过索引访问元素,可以改变集合大小。如果要在其中插入或删除元素时,会影响后续元素
- 该集合中保存的都是引用类型,即便保存了整数123,也保存的是Integer类型的123,而不int类型的123
- 该集合查询效率高,中途增加和删除元素效率低
LinkedList实现类
- 集合中保存的每个元素也称为节点,除首尾节点外,其余节点都保存了自己的信息外,还保存了其 前一个和后一个节点的地址
- 如果在双向链表的数据结构中插入和删除操作节点时,不会影响其他节点的位置。如添加时新节点 时,只需要重写定义新节点的前后节点位置即可
- 如果要查询某个节点时,需要从头结点或尾结点开始一步步得到目标节点的位置
- 双向链表在中间插入和删除的效率高,随机读取的效率低
ArrayList和LinkedList的区别
- 这两个类都是List接口的实现类,保存的元素有序可重复,允许保存null
- ArrayList采用数组实现,随机读取效率高,插入删除效率低,适合用于查询
- LinkedList采用双向链表实现,插入删除时不影响其他元素,效率高,随机读取效率低,适合用于
- 频繁更新集合
总结
Java高级这一阶段对于我来说是枯燥的,这一阶段的内容多,知识点复杂,想要掌握这一阶段的知识,还是多练,多写,多问,多看吧,核心还是多写。