SE复习
面向对象
- 封装
对属性私有化 用get set方法进行修改和获取
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
- 继承
1.使用extends关键字实现继承
2.继承父类的属性和方法
3.不能继承构造方法 - 多态
向上造型
1.用父类的声明指向之类的对象
2.子类的声明指向父类的对象 需要强转
重写
1.父子之间存在继承关系时产生方法的重写
2.方法名称要一致
3.参数要一致
4.返回值也要一致
重载
1.方法名称必须要相同
2.重载方法的参数组合必须不一样
3.方法名称要一致
4.方法重载与返回值无关 - 抽象
抽象类
1.含有 abstract 修饰符 class 即为抽象类
2.抽象方法不能用private、static、synchronized、native访问修饰符修饰
接口
1.特殊的抽象类
2.接口中的所有方法都必须是抽象的
3.接口中的方法定义默认为 public abstract 类型
4.接口中的成员变量(只能为常量)类型默认为 public static final,必须赋初值。
区别- 抽象类方法
JDK 1.8以前,抽象类的方法默认访问权限为protected(可以是public和protected)
JDK 1.8时,抽象类的方法默认访问权限变为default(可以是public和protected或者不写) - 接口方法
JDK 1.8以前,接口中的方法默认,也必须是public的(只能用public)
JDK 1.8时,接口中的方法默认public的,也可以是default的(可以是public和default)
JDK 1.9时,接口中的方法可以是private的(可以是public和default和private)。 - 抽象类的属性
四个都可以使用 - 接口的属性
接口属性默认(什么都不写的情况下)是public static final的,所以默认是public(只能用public)
- 抽象类方法
object 11种方法
- wait()*3
- notify()
- notifyall()
- hashcode()原方法输出 this
- equals()原方法 == 判断
- tostring()原方法输出 this
- clone()克隆 浅克隆 protected
浅克隆:是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深克隆:不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
pos:当前对象的地址;son:son属性所指向的地址;name:对象的name属性。
- getclass()获取类名 返回当前运行对象
- finalize()垃圾回收 protected
-
垃圾判定
1.引用计数法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
2.可达性分析算法
从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用树,树的节点视为可达对象,反之视为不可达。(1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
(2)方法区中的类静态属性引用的对象。
(3)方法区中的常量引用的对象。
(4)本地方法栈中JNI(Native方法)的引用对象。
-
- 垃圾回收算法
1.标记-清除算法
这样导致的结果会存在很多的内存碎片。
2.复制算法
这样虽然解决了内存内存碎片问题,但是如果对象很多,重新申请新的内存空间会很大
3.标记-整理算法
执行完标记清除全过程之后,再一次对内存进行整理,将所有存活对象统一向一端移动
4.分代收集算法
老年代 使用复制算法
新年代 使用标记
String
-
String StringBuild StringBuffer 区别
String含义为引用数据类型,是字符串常量.是不可变的对象适用与少量字符串操作 final修饰char数组
StringBuilder可变字符序列,适用单线程下在字符缓冲区下进行大量操作的情况
StringBuffer可变字符序列,适用多线程下在字符缓冲区进行大量操作的情况线程安全:StringBuffer线程安全.StringBuilder线程不安全
-
String StringBuild StringBuffer 速度
StringBuild>StringBuffer>String
集合
- Collections
此类不能实例化,就像一个工具类,服务于Java的Collection框架。他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作 - Collection
- List
- ArrayList 和LinkedList区别
ArrayList是数组大小确定 LinkedList是双端链表 节点
插入 删除 当头尾时 相差不大 当中间 时LinkedList优势大
查找 当头尾 查找时相差不大 当中间 查找时ArrayList优势较大
当10万以上的数据量时LinkedList才显示出优势 - Vector和ArrayList区别
Vector是线程安全的效率低
ArrayList是线程不安全的效率高
- ArrayList 和LinkedList区别
- Set
- hashset
底层是hashmap
需要重写hashcode方法和equals方法 - treeset
实现SortedSet接口
要求可比较实现Comparable或者Comparator接口
- hashset
- Queue
- List
- map
- HashMap
线表+链表 - TreeMap
红黑树 - Hashtable
使用synchronized来保证线程安全
不能有null值 - ConcurrentHashMap
段数组是final的,并且其成员变量实际上也是final的。这可以确保不会出现死锁,因为获得锁的顺序是固定的。
Segment数组结构(可重入锁ReentrantLock)和HashEntry数组结构组成
锁分段技术 - LinkedHashMap
不允许有null值
LinkedHashMap 是HashMap的一个子类
保存了记录的插入顺序先得到的记录肯定是先插入的,也可以在构造时用带参数,按照应用次数排序
LinkedHashMap的遍历速度只和实际数据有关
HashMap的遍历速度和他的容量有关
- HashMap
- 扩大集合
- HashMap默认初始化数组的大小为16,HashTable为11。前者扩容时乘2,使用位运算取得哈希,效率高于取模。而后者为乘2加1,都是素数和奇数,这样取模哈希结果更均匀。
- ArrayList初始大小为10,每次1.5倍进行扩容
- HashMap 初始化大小是 16 ,扩容因子默认0.75
- iterator
IO
字节流:InputStream(FileInputStream、ObjectInputStream、BufferedInputStream)
OutputStream
字符流:Reader/Writer
FileReader/BufferedReader
FileWriter/PrintWriter/BufferedWriter
1PrintWriter(filepath);// 默认字符集
2PrintWriter(filepath,"charset");// 指定字符集
3PrintWriter(file);// 默认字符集
4PrintWriter(file,"charset");// 指定字符集
5PrintWriter(OutputStream);// 可以指定文件追加
6PrintWriter(OutputStream, true);// 可以设置自动刷新缓冲区 println()换行输入只适用println
OutputStream os = new FileOutputStream(file,true);//是否追加
Writer w = new OutputStreamWrite(os,"gdk");//指定字符集
7PrintWriter pr= new PrintWriter(w,true);//自动刷新 println
8PrintWriter pr= new PrintWriter(w);//不会自动刷新 println
线程
- 线程创建
1.继承Thread
2.实现Runnable
public interface Runnable {
public abstract void run();
}
3.实现Callable
public interface Callable<V> {
V call() throws Exception;
}
4.线程池:4种
ExecutorService ex = Executors.newFixedThreadPool(3);//指定最大长度
ExecutorService ex = Executors.newCachedThreadPool(); // 按需求自动增长销毁
ExecutorService ex = Executors.newSingleThreadExecutor(); // 单个线程
ScheduledExecutorService ex = Executors.newScheduledThreadPool(3); // 一个定长线程池,支持定时及周期性任务执行
- 同步-锁的类型
- 可重入锁
如果锁具备可重入性 - 可中断锁
- 公平锁
- 读写锁
- 可重入锁
- 通信:wait notify notifyall
- 线程生命周期、状态