一.Java内存分析:
堆中:
- 存放new对象和数组
- 可以被所有的线程共享,不会存放在别的对象的引用
栈中:
- 存放的基本变量类型,会包含这个基本类型的具体数值
- 引用对象的变量(会存放这个引用在堆中里面的具体地址)
方法区:
- 可以被所有的线程共享
- 包含所有的class和static变量
二.面向对象
-
概念
- 面向对象的本质就是以类的形式组织代码,以对象的形式封装数据
- 三大特征:继承,封装,多态
-
对象的初始化和创建
- 在使用new关键词的时候,会分配内存的空间大小之外,还会分配把创建好的对象默认初始化以及调用类的构造器,所有说一旦定义了有参构造器,无参构造器必须要显示定义出来
-
封装
- 因为程序的要求是:高内聚,低耦合,
- 所谓的高内聚就是类的数据细节自己完成,不允许其他人来完成
- 低耦合就是尽量少量的方法暴露给外部使用,所有说禁止访问一个对象中的数据,而是通过接口的方式来访问
-
继承
- 在java中默认都是单继承,都或者直接或者间接的继承了Object类,私有的类不允许被继承
-
多态
- 多态存在的条件:
- 有继承的关系
- 子类重写了父类的方式
- 多态是方法的多态,属性没有多态
- 父类引用指向子类的对象
- 对象能够执行方法,主要看左边的类型,如果子类重写父类的方法,调用的时候,调的时候就是子类重写的方法,这就是动态加载机制
- 多态存在的条件:
-
InstanceOf
- 在java中,instanceof运算符是用来运行时指出对象是否是特点的类的一个实例,这个方法会返回一个boolean值,所有说我们可以通过判断返回值来判断这个对象是否是特定类或者它的子类
-
static关键字,代码块
- static关键字:
- 和类一起加载,可以通过(类.静态方法)来访问
- 代码块:
- 执行的顺序:
- 静态代码块>构造方法>匿名代码块
- 静态代码块只会执行一次,即使有多个同一个类的实例,也只会运行一次
- 执行的顺序:
- static关键字:
-
接口interface
- interface是定义接口关键字,接口都需要有实现类
- 接口中所有的方式都是抽象的,接口只能是方法的声明,不做方法的实现
- 接口可以实现多继承
-
方法的重写和重载
- 方法的重写
- 需要有继承关系,子类重写父类的方法,与属性无关
- 方法名相同,参数列表相同,方法体不同
- 修饰的范围可以扩大,但是不能缩小
- public>protected>default>private
- 可以抛出异常范围缩小但是不能放大
- 重写的原因:父类的功能,子类可能不需要或者不满足
- 方法的重载
- 重载就是在同一个类中,有相同的函数名,不同的函数参数
- 方法名相同,参数不同,或者参数类型不同,或者参数的顺序不一致
- 方法的返回类型可以相同也可以不同
- 如果是返回的类型不同是不足以构成方法的重载
- 方法的重写
-
异常的处理
- 异常有两大类
- Exception
- Error
- 若多个catch捕获到异常,异常的等级由小到大,FInally一定会被执行的
- 自定义的异常类:要继承Exception,Throw new MyException()抛出自定义的
- 异常有两大类
二.集合
- 集合是对象的容器
- 集合中不能直接存储基本的数据类型,也不能存储java对象
- 集合中存储的都是java对象的内容地址(或者说集合中存储的是引用)
- 集合类都是在java.util.*包下
- 数组可以存储基本类型和引用类型,集合只能存储引用类型
Collection体系
-
List:存储的元素是有序的
-
ArrayList,linkedList,Vector都是继承与List接口
-
ArrayList:底层采用的是数组这种数据类型的,数组适合于查询,不适合用于增删元素,使用ArrayList的查询效率比较高,增删效率比较低
-
LinkedList:底层采用的是双向链表的这种数据结构存储元素,因为链表没有顺序,使用查询的时候只能从头往后的查询,使用查询的效率比较低,但是增删的效率比较高
-
Vector:底层是ArrayList一样,都是基于数组,但是Vector的在多线程下是安全的,加了锁,正是因为加了锁,导致性能下降,所有一般很少使用
-
-
Set:的特点是存储的元素是无序的,不可重复的,
- HashSet,SortedSet,TreeSet继承与Set
- HashSet:
- 底层是一个哈希表,也叫做散列表,HashSet底层实际上一个HashMap
- SortedSet:
- 存储的元素是无序的,但是存进的元素可以按照元素的大小进行排序
- TreeSet:底层是一个二叉树
- HashSet,SortedSet,TreeSet继承与Set
-
Map: 以键值对的形式存储的,key不可以重复
- HashMap,HashTable,SortedMap,TreeMap都是继承与Map接口
- HahsMap的key是不允许重复的,key其实就是一个HashSet,底层采用的是哈希表的数据结构
- HashTable:
- 是线程安全的,效率低,比较安全
- Properties继承与HashTable
Collection常用的方法
boolean add(object o):向集合中添加元素
int size()获取集合中的元素
void clear()清空集合
boolean remove(object o)删除指定的元素o
boolean contains(object o)判断是否包含元素o
boolean isEmpty()判断集合是否为空
Object[ ] toArray()集合转数组
iterator迭代器的使用
- 从集合对象中获取迭代器Iterator
- Iterator iterator = c.iteraror()
IO流:
- 文件:
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- 转换流:
- InputSreamReader
- OutputStreamWriter
- 缓冲流:
- BufferedReader
- BufferedWriter
- BufferedInputStream
- BufferedOutputStream
- 对象流
- ObjectInputStream
- ObjectOutputStream
- HashMap,HashTable,SortedMap,TreeMap都是继承与Map接口
多线程
- 概念:
- 进程:是一次的执行程序的最小单位,是系统为其分配的单位
- 线程:一个进程包含若干个线程,一个线程中最少有一个进程,线程是CPU调度和执行的最小单位
- 创建线程的三种方式:
- 自定义线程类继承与Thread类,重写run方法,创建线程对象,调用start()方式启动线程
- 自定义实现Runnable接口,重写run()
- 自定义实现Callable接口,重写call(),需要抛出异常
- 静态代理:
- 真实角色和代理角色都实现同一个接口
- 代理对象需要代理真实对象
- 优点:代理对象可以做对真实对象做不了的事情,而真实对象只关注与做自己的事情
- 线程休眠:
- sleep会导致线程休眠,但是会在休眠的时候添加一个锁,sleep不会释放锁
- 线程礼让:
- 让当前正在执行的线程暂停,但不会阻塞,让线程由运行状态转为就绪状态,让CPU重新调度,但是礼让不一定会成功
- 线程的同步机制:
- 多个线程操作同一个资源,线程的同步形成的条件:
- 队列+锁
- 锁机制synchronized
- Synchronized默认是锁是this,
- 同步锁 synchronized(obj){}
- 死锁:
- 产生的条件:
- 互斥条件:一个资源只允许一个进程来使用
- 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已获得的资源,在未使用前,不能强行剥夺
- 循环等待条件:若干进程之间形成的一种想接的循环等待资源关系
- 产生的条件:
- synchronized与Lock的对比
- Lock是显示锁(需要手动的开启和手动的结束),synchronized是隐式锁,会自动的释放
- Lock只有代码块锁,synchronized有代码块锁和方法锁
- 使用Lock锁,JVM将花费较少的时间来调度线程,性更好,并且具有更好的扩展性(提供了等多的子类)
- 优先的顺序:
- Lock>同步代码块(已经进入了方法体,分配相应的资源)>同步的方法(在方法体之外)
- wait和notify
- tt.wait():让正在tt对象上的活动进程进入等待转态
- wait():无期限的等待,直到被唤醒
- tt.notify():唤醒正在tt对象上的等待的线程
- tt.notifyAll():唤醒tt对象上处于等的有的线程