java笔记


基本数据类型:
boolean char byte short int long float double

构造器 : 能 重载,不能重写

重载:发生在编译器,同一个类中。方法名相同,参数不同。
重写:发生在运行期,子类 extends 父类方法
1,返回值类型,方法名,参数列表相同,抛出异常等于小于父类,访问修饰符大于等于父类
2,如果父类,用 private final static 修饰后的方法不能被 重写,
3,构造方法无法被重写

封装继承多态:
1,私有化属性,提供公有的访问修改方法。
2,继承,通过继承可以方法的复用以前代码。
3,一个引用变量执行那个类对象,在程序执行期间才能决定。(例:父类引用调用子类对象方法。可以用父类应用调用不同子类实现的相同方法)

String ,StringBuffer StringBuilder
1,String 字符串是用 final 修饰的 char 字符数组 private final byte[] value 所以不可变
2,StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder,接口类中 使用字符数组保存字符串 char[]value 没用 final 修饰
3,StringBuffer 中方法加了,同步锁,所以线程安全, StringBuilder 没加

同步锁:

接口和抽象类的区别:
抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

成员变量和局部变量:
成员变量属于类对象, 局部变量在方法体中,
变量在内存中的存储方式:成员变量属于实例,存储在堆内存中。局部变量为基本数据类型存储在 栈内存中。如果是引用数据类型,存放的是堆内存中的地址,或常量池。
成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
成员变量会默认附初始值,局部变量不会。

静态方法和实例方法的区别:
静态方法使用类名调用,实例方法只能用 对象.方法名 方式调用。
静态方法中,只能访问静态成员。

== 与 equals(重要):
==是判断内存地址是否相等,基本数据类型判断的是值是否相同, 引用数据类型判断的是内存地址是否相等。
equals是判断值是否相等。


hashCode 与 equals (重要)
hashCode 是获取哈希码,也称散列码,是个int 整数,这个哈希码的作用是:确定该对象在哈希表中的索引位置
hashCode 在 Object.java 中, 所以每个对象都有一个哈希码



重要:
线程运行状态:
1,初始化: 线程处于 jvm 虚拟机进程中。
2,可运行状态: .start() 方法后,等待cpu 调度。
4,运行状态: 线程运行
3,阻塞状态: sleep 休眠,用于线程暂停,(不放弃对象锁标记)结束后进入可运行状态
4,等待状态: wait 等待,用于线程交互,(放弃对象锁标记)需要调用 notifall() 使线程进入锁池状态
5,锁池状态: 线程中对象都有,互斥锁标记,防止对资源造成不一致的情况。线程拿到对象锁标记后,进入到可运行状态
6,结束:

sleep 和 wait 区别: wait 会释放锁, sleep 一直持有锁。 wait 通常被用于线程间交互, sleep 通常被用于暂停执行。

多线程同步:
synchronized 串行,只要拿到锁标记线程才可以执行,有数据共享冲突用 syn
syn 使用三种方式:实例方法,静态方法,代码块


单例模式:双重校验锁实现对象单例(线程安全)

声明静态变量: private volatile static Singleton uniqueInstance;
类对象加锁: 写一个静态方法,返回类型为当前类,里面用 synchronized 类对象加锁
public static Singleton getUniqueInstance() {
synchronized (Singleton.class) {

什么是上下文切换?
当前线程任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,下次再切换回这个任务时,可以再加载这个任务的状态。
任务从保存到再加载的过程就是一次上下文切换。

并发编程的三个重要特性?
原子,(一个操作和对个操作为一个整体,要么成功,要么失败)转账操作,加上原子性解决转账问题。和 int a = 1; 原子性, a ++ 操作不是原子性。
可见, 一个线程修改,另一个线程立即就能读到
有序性,指令重排不会影响单线程的执行结果,但是会影响多线程并发执行的结果正确性。(由于在线程1中语句1、语句2是没有依赖性的,所以可能会出现指令重排。)


说说 synchronized 关键字和 volatile 关键字的区别
volatile关键字只能用于变量而 synchronized关键字可以修饰方法以及代码块
volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。
volatile 关键字的主要作用就是保证变量的可见性然后还有一个作用是防止指令重排序。(声明变量,执行顺序问题。)

posted @ 2020-06-10 18:37  微辰  阅读(94)  评论(0编辑  收藏  举报