java SE

注释

1)@author 作者
2)@version 版本号
3)@see 包
4)@since jdk版本

String

1)String 字面量
1.1)jvm在堆中开辟了一段空间来缓存所有使用字面量创建的字符串对象,只要发现使用已经创建过得字符串,字面量创建出新的字符串时,jvm直接使用缓存的对象,而不是创建新对象,这样做可以避免内存中堆积大量的字符串对象,降低内存的开销。
1.2)一旦修改内容就会创建新对象
1.3)使用new创建一个字符串,就一定会创建新对象。
1.4)编译器特点,编译器在编译源代码时,若发现一个计算表达式,参与的值都是字面量时,那么计算表达式的值是确定的,此时编译器就会计算表达式的结果,并将结果替换这个表达式,这样一来jvm每次执行字节码文件时就不用计算了。String str=“sd”+“sd”; 等于 String str=“sdsd” 他们地址相等 如果其中含有变量地址则不会相等。 String str=s+“sd”;
1.5)任何类型和字符串拼接都会成为字符串
1.6)频繁修改字符串会产生大量的垃圾,内存开销大,运行效率差(结论、;String不适合频繁修改)。
2)StringBuilder
2.1)由于String不适合频繁修改,为了解决这个问题,java提供了一个专门修改字符串的类:java。lang。StringBuilder,其提供了一组修改字符串的操作,使用方便,并且性能好,内部维护一个可变的字符数组,修改操作资源开销小。
StringBuffered
线程安全
正则表达式
描述一个字符串格式

包装类

Integer
包装类一共有八个基本类型,包装类是为了解决基本类型不能直接参与面向对象开发的问题,使的基本类型可以以对象的形式存在,所有的包装类都是保存在java。lang包中,因此无需导包。
java推荐我们使用valueof方法创建包装类实例。
Integer的valueof会重用一字节只能整数对象。
数字类型包装有两个常量,MAX_VALUE MIN_VALUE分别记录基本类型的取值范围
Double不会重用任何对象。
包装类提供了一个静态方法:parseXXX可以将字符串解析为对应的基本类型。
该字符串必须正确描述基本类可以保存的值,否则解析是会出现异常。
jdk1.5之后推出了一个特性:自动拆装箱,该特性是编译器认可的,当编译器编译源码时发现有基本类型和引用类型相互赋值操作时,会自动补全代码将两者进行对应的转换工作,从而使我们在源代码使用时包装类与基本类型可以进行直接相互赋值。

IO

FIle
file,该类的每一个实例表示系统上的一个文件目录,我们使用它可以访问文件目录的属性信息(文件名,时间等)创建或删除文件目录,访问一个文件目录的所有子项,但是不能访问一个文件的数据。
在创建file时指定路径通常使用使用相对路径,这样做的好处是跨品台无需修改,“./”表示当前目录,而当前目录具体是哪里,要看当前java程序的运行环境而定,对于eclipse下执行时,当前目录指的就是当前程序所在的项目录,比如js_se
File[] listFiles(FileFileter filter)将当前File表示目录中符合给定过滤器要求的所有子项返回,获取的过程中,目录下所有子项都会经过一次,过滤器accept方法,但是仅该方法返回值为true的子项被保存并进行返回
RabdomAccessFile
基于指针对文件数据进行随机读写。
创建RAF时有两张常见的创建模式:1只读模式“r”,仅读取文件数据,不可做些操作
2:读写模式“rw”,对文件数据进行读写操作
常见的构造方法:RandomAccessFile(String path,String mode) RandomAccessFile(File file,String mode) 第一个参数为要操作的文件,第二个参数为模式,支持的字符串常用的为: r只读 rw:读写
1)一个流只能操作一个文件
Authors
John
Luke

异常try{} catch(){}

常见的异常
nullpointerException 空指针异常
class castException 对象类型不匹配异常
ArraysIndexofException 数组越界异常
Number FormatException 数字格式化异常

Exception

1)当jvm执行代码时遇到了某个异常时,会实例化对应的异常实例并将其抛出。
2) 在try{}语句块中出错代码以下的内容都不会被执行。
3)catch是可以定义多个,针对不同的异常进行处理。
4)我们可以在最后一个catch出捕获Exception 以避免因为一个未捕获的异常导致程序中断
5)jdk7 后推出了一个特性,定义的流可以直接写在try(这里),他会自动关闭,前提是它必须实现Autocloseable这个接口,这里只是编译器认可,会自动修改为finall里面去关闭流。

通常使用throw主动对外抛出异常会在以下情况发生
1:程序确实出现了异常,但是该异常不应当在当前代码片段被解决是可以对外抛出给调用者解决
2:程序遇到一个满足语法要求但是不满足业务逻辑要求的情况时,可以对外抛出异常
3)如果定义异常,在方法的最后面写throws加异常名,当调用一个含有throws声明异常抛出的方法时,编译器会检查是否处理该异常,如果没有则编译不通过。处理异常的方式有两种:1 使用try–catch处理该异常,2,在当前方法上继续使用throws声明该异常的抛出,具体用哪种取决于处理异常的责任问题。
4)当一个方法使用throw抛出一个异常时,只有RuntimeException及其子类型异常被抛出时,可以不写throws,剩下的必须写,否则编译不通过。

5)运行时异常,要在运行时才能发现,所以不会throws

  • 如果一个方法有Throws抛出异常,那么谁去调用它 必须要解决它的异常
  • 子类重写父类方法时,该方法若抛出多个异常,子类重写方法不能高于父类重写方法的异常,可以抛出一些异常,和子异常,不能抛出无关异常,可以不抛异常
  • 把你认为要出异常的代码放在try中 catch{}中捕获异常 并打印异常
  • finally{}块,程序执行一定会执行的代码块
  • 自定义异常
  • 必须要继承父类异常(或者间接继承均可),Exception ,快捷生成构造方法
自定义异常好处
  • 可以使代码抛出异常更加精确
  • 在这里插入图片描述
    throws 抛出的必须要解决,否则编译异常

多线程

什么时候使用线程

1)一个程序中要完成多个任务的情况,我们可以将每个任务定义为一个线程,使得他们得以同时工作。
2)也可以用于单一线程中可以完成,但是多条线程可以更快的情况,比如下文件。
3)多线程主要解决问题时改变代码的执行方式,将原有的代码一句一句先后运行的。

  • 创建方式
    1. 继承Thread类 (不推荐),因为java只能单继承.启动线程方式,创建对象后,直接调用start()方法
    2. 实现Runnable 接口(推荐使用) 启动方式有所不同,因为它是接口,他没有启动方法,所以当你创建一个线程对象了,你还要创建一个Thread()对象,传入进去,在调用它的start()方法.
    3. 使用Runnable的好处,降低了耦合度,不会吧线程执行的代码写死,可以把线程看做一个容器,你要执行什么功能就实现接口传入进去,而继承了后会把这个线程直接决定他要执行什么,写死了耦合度太高,不可行
    4. java中所有的代码都是靠线程运行的,main方法也不例外,只不过main方法不是由我们创建的。
    5. 线程生命周期 新生------start()----就绪-----阻塞?-----终止
    6. 当运行多个线程时,是不能确定谁先运行的,因为每次的时间片,都不一定会分配给谁
    7. join()-----谁调用这个方法,谁就加入运行,而在哪个线程里面调用的,他就停止
    8. yield()--------谁调用谁就让出本次运行的时间片
    9. Thread,currentThread() 获得当前线程
    10. 多个线程之间运行不会相互干扰

    并发

synchronized

当一个方法使用关键字synz修饰后,这个方法称为同步方法,同步方法要求多个线程不能同时进入到方法的内部运行,必须“排队”进行(同步运行).
当多个线程访问同一个资源的时候,容易发生异常 , 一个值被多个线程修改
如何解决?--------synchronized(–应用类型----class.类) 关键字注意事项这里的锁,锁的是对象,必须要保证,锁住的那个对象,每一个线程进来看到的都是同一个对象,不然没有任何作用.
两种使用方式 加在方法修饰符 ,自己定义一个块,但必须要在方法里面,为什么?,不然怎么去使用到它.方法上的默认锁是this,静态方法上加上synz 锁的是class对象,只有一份,一定会有同步效果
同步的代码块:,尽量缩小到它们使用的同一个资源,避免过多时间的等待,而浪费资源.如果写上如果过写上this,要看那个方法被谁调用,那个对象就是谁.
上面的方法只能解决每次只能有一个线程进去,但不能保证每次进去的是谁,所以这里需要了解两个方法.

互斥锁

当使用synchronized锁定多个代码片段,并且指定的同步监视器对象, 是同一个时,这些代码片段就是互斥的,多个线程不能同时执行这些代码片段.

Luke

  1. wait() 使当前线程陷入阻塞,并把锁释放, 调用必须是那把锁
  2. notify() 唤醒在这把锁上正在阻塞的(wait)的线程,如果有多个线程,那么它会随机唤醒一个.,它不会让出时间片
  3. 精典案例,生产者,消费者
  4. 互斥
  5. 当一个类里,有两个synchronize修饰的方法,并且锁的对象是同一个,多个线程去调用那两个方法使,那么当它在执行一个方法时,另一个只能等待
  6. 守护线程
  7. 守护线程是有普通线程转换 Stedeamon(true), 守护普通线程,当进程结束时会杀掉所有守护线程,一个进程中没有任何普通线程,这个进程就会结束,gc就是典型的守护线程的用法。
  8. 静态方法的同步监视器是当前类的类对象,每个类在jvm内部都有,且只有一个类对象(class 类的实例),
  9. 静态方法指定的对象就是它,可以通过类名.class来调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值