StringBuilder有两个常用方法。
字符串相加推荐使用StringBuilder
因为String类型声明为final,不可更改的常量。所以计算机在处理String相加时,需要创建多个String去完成相加功能。而StringBuilder与String的区别就在于,是一个可变的byte[]数组,只需要分配一个内存地址即可。初始长度为16,如超出则会自动进行扩容。
估:声明可变字符串时,最好使用StringBuilder。
- append()
举例:
StringBuilder a = new StringBuilder();
StringBuilder b = a.append("hahah");
if(a == b){
}
此处:相当于将给a追加后,将a的地址赋值给b,所以a和b是相等的。
所以再使用append方法时,无需接收返回值。
- toString()
将StringBuilder转为String类型
数组使用
- ArrayList 底层数据结构为数组结构, 查询快,增删慢
- LinkedList 底层数据结构为链表结构,查询慢,增删快
估:频繁使用查询的则使用ArrayList,
频繁使用增删的则使用LinkedList
List、Map、Set对象
在jdk9新特性中,增加了一个静态of()方法,可以给集合一次性添加多个元素
注意:1.of()方法,只适用于List、Map、Se接口,不适用于接口实现类
2.of()方法,返回的为一个不能改变的集合。
jdk8我们之前添加
List array = new List();
array.add("a");
array.add("b");
array.add("b");
jdk9:
List array = new List();
array.of("a","b","c");
java异常
通过判断想要告诉方法的调用者,存在问题的时候,我们就可以抛出异常
举例:
如查找文件路径 “c:/a.txt”
getFileName(name){
if(!name.equlas("c:/a.txt")){
throw new FileNotFoundException("文件找不到.");
}
}
- throws 声明异常
1.调用的方法中存在异常抛出,则需要声明异常,可自己处理,也可以交予JVM处理
JVW处理,则是调用的父方法一直抛出异常。 - try…catch 处理异常
- throwable
异常处理类,定义了三个异常处理方法
1.getMessage()。 返回简短异常信息
2.toString(). 返回详细消息字符串
3.printStackTrace(). JVM打印异常对象,默认使用此方法,打印信息最全面
try{
可能产生异常的代码
}catch(定义一个异常变量,用于接收try中抛出的异常对象){
异常的处理逻辑,产生异常对象后,如何处理异常。
一般在工作中,我们会把异常信息记录到日志中,方便我们后续查看。
}
....
catch(){
catch可存在多个
}
注意:1.try中可能会抛出多个异常对象,那么我们可以使用多个catch来接收处理异常
2.如果try中产生异常,那么就会执行catch中的异常处理逻辑,执行完毕后,会继续执行try..catch后的代码
估:上面两种在选择时,
1.throws抛出异常后,交给JVM处理,完后不会执行后续代码
2.try’…catch抛出异常,处理异常完成后,会继续执行后续代码
多线程
- 并发 指两个或多个事件在同一时间段内发生。(交替执行) 速度慢
举例:一个人吃两个馒头。 一个cup执行 - 并行 指两个或多个事件在同一时刻发生。(同时执行) 速度高
举例:两个人一人一个馒头。 两个cup执行
进程:指一个应用中运行的应用程序。打开一个应用程序,都会跑到内存中去执行。关闭程序,则会再次从内存中去除。所有内存越大,程序运行速度越快。
线程:线程是进程中的一个执行单元。负责当前进程中执行的程序。一个进程可存在多个线程,则被称为多线程程序。简而言之:一个程序运行后至少后一个进程,一个进程可以包含多个线程。
程序中:多线程
Thread
1.定义一个多线程类集成Thread类
2.重写Thread类中的run()方法。
3.创建自定义线程类对象,调用start方法。创建线程。
Main()方法为主线程
新创建的线程,从thread-0,thread-1,thread-2
内存处理时,main创建一个栈内存,thread-0创建一个栈内存。
(创建的对象存储在堆内存中)
解决线程安全问题
线程同步技术解决线程安全问题
- 同步代码块
synchronized(同步锁){
可能会出现线程安全的代码(访问共享数据的代码)
}
注意:1.通过代码块中的锁对象,可以是任意对象
2.但必须保证多个线程使用的锁对象是同一个对象。
3.锁对象作用:
将同步代码块锁住,只让一个线程在同步代码块中执行
缺点:程序频繁的判断锁,获取锁,释放锁,降低了程序效率。 - 同步方法
public synchronized void method(){
可能会出现线程安全的代码(访问共享数据的代码)
} - 锁机制
1.创建锁 Lock l = new ReentrantLock();
2.获取锁 调用线程安全代码块前使用lock()方法,l.lock();
3.释放锁 调用线程安全代码块后使用unlock()方法,l.unlock();
unlock一般写在finally代码块内