同步与异步

什么是同步:
当调用某个方法时,想要后续方法继续执行则需要等待当前调用方法返回结果后才能继续往后执行。
什么是异步:
调用某个方法后无需等待其返回结果,可以继续运行后续方法。
java语言在同步机制中使用了synchronized关键字,它是以很大的系统开销为代价实现同步的。有时可能造成死锁,故应尽量减少无谓的同步控制。

java实现同步的方式(保证线程安全的方式)
java通过synchronized关键字或Lock类实现同步
synchronized与lock的区别
synchronized:
java关键字,在jvm层,由jdk实现;其修饰的代码在执行异常时,jdk会自动释放线程占有的锁,不需要程序员控制去释放锁。
Look:
是java的一个interface接口;当Lock发生异常时,需要手动调用unLock()去释放锁,否则很可能造成死锁现象。因此Lock一般在finally中释放锁。

(此处留疑:浅析Lock与Synchronized的源码及其实现)

多态

什么是多态
多态是同一个行为具有多个不同表现形式或形态的能力。是同一个接口使用不同实例而执行不同操作。
多态实现的原理
子类通过继承父类,并Override(重写)父类方法。在对象创建时调用父类型引用指向子类型对象(Parent p = new Child();)即实现了多态
故多态存在的三个必要条件是:继承,重写,父类引用指向子类对象。
使用多态的优势

  • 消除了类之间的耦合关系
  • 具有可替换性,可扩充性
  • 具有接口性,灵活性,简化性
    (?为什么具有这些性质)
    因为通过创建父类引用即可调用不同子类的同一方法,实现不同的功能,降低了类之间的耦合度,降低了代码的冗余度,提高了代码的灵活性,可以随时添加修改新的实现结果。由此总结出以上几点多态的优势。
    而且java框架本身就是一个多态形式,通过调用Object引用即可调用多种子类下的父类方法。例如:Hashcode,equals等方法。

接口与抽象类

什么是接口
interface
实现抽象方法和抽象类的一个集合,用以实现java中的多继承
接口的特点

  1. 使用interface来定义(public interface 接口名)
  2. 成员变量默认public static final修饰
  3. 成员方法默认public abstract修饰
  4. 没有构造方法(接口不能创建对象,而构造方法用以创建对象)
  5. 实现接口的类中必须实现接口中所有的方法
  6. 一个类可以实现多个接口,多个类可以实现同一接口
  7. 与继承相类似,接口与实现类之间存在多态性
    (以上特点的总结均总结于接
  8. List item

口的创建特性[1,2,3,4],以及工作层面[5,6,7])
什么是抽象类
abstract
将多个类中相同的熟悉提取出来,定义为抽象类,提高代码的重用性
抽象类的特点

  1. 抽象类可以存在非抽象犯法,也可以存在抽象方法
  2. 抽象类不能创建对象(如果抽象类可以构造函数那么使用抽象类将毫无意义)
  3. 抽象类存在构造函数,用以提供给子类创建对象时初始化父类属性
    接口与抽象类的关系
    接口是特殊的抽象类
    接口与抽象类的异同
    抽象类只能被继承,故不可继承多个抽象类,其设计理念的含义为"is a"即什么是什么;
    接口可以被多个类实现,实现java中的多继承,起不同类之间的连接协议的作用,其设计含义为“like a”即什么像什么。
    当abstract类与interface联合使用时一般以抽象类为主体,接口为补充使用。

clone()方法的使用

String对象创建解析

String对象的常量对象,存在于堆上,当创建新的String引用指向对象时,jvm会首先从堆上查找是否存在该对象,如果存在则使新引用指向该对象如果不存在则创建新的String对象.

String s1 = "a"; //创建了一个对象
String s2 = "a"; //a已经存在故没有创建对象
String s3 = new String(“2“);//new String创建的对象’‘2’‘,以及常量对象’‘2’‘
String s4 = "b";
String s4 = s4 + "c"; //"b"不存在1个对象,“c”不存在1个对象,“bc”不存在一个对象 一共创建了三个对象
String s5 = "d"+"e"+"f";//表示一个对象,等同于String s5 = "def";

Collection&Map

Collection
Collection为集合的顶层接口,无法被实例化
常用子接口有:
1.List
实现类:ArrayList,Verctor,LinkedList
2.Set
实现类:HashSet,TreeSet
功能:
1.添加

  • boolean add(Object obj)
  • boolean addAll(Collection c)
  • 添加功能永远返回true
    2.删除
  • void clear()
  • boolean remove(Object obj)
  • boolean removeAll(Collection c)
  • 删除功能只有在删除成功后返回true
    3.判断
  • boolean contain(Object obj)
  • boolean containsAll(Collection c)
  • boolean isEmpty()
    4.获取
  • Iterator iterator()
  • Object next()
  • boolean hasNext()

5.长度
——int size()
数组和字符串中使用length()方法获取元素个数,集合使用size()方法获取。因为object包括集合,字符串,数组,所以不能直接使用length方法。
List集合
Collection集合的子类
特点:
1.有序(存储和取出的元素顺序一致),
2.可重复
List子类的特点:
1.ArrayList

  • 底层数据结构是数组,查询快,增加删除慢
  • 线程不安全,效率高
    2.Vector
  • 底层数据结构是数组,查询快,增加删除慢
  • 线程安全,效率高
    3.LinkedList
  • 底层数据结构是数组,查询快,增加删除慢
  • 线程不安全,效率高
    Set集合
    特点:
  1. 无序(存储和取出顺序不一致,有时可能会一致[偶然现象])
  2. 元素唯一
  3. 不能重复
    实现类
  4. HashSet
    1.底层实现为哈希表
    2.通过两个方法hashCode()和equals()保证数据唯一性
    3.子类LinkedHashSet底层实现为链表+哈希表,链表保证元素有序,哈希表保证元素唯一
  5. TreeSet
    1.底层实现为红黑二叉树
    2.排序方式:自然排序,比较排序
    3.通过比较返回值是否为0来保证元素唯一性

Collection的选用

  1. 元素唯一:Set
    是否排序
    a)排序:TreeSet
    b)不排:HashSet
  2. 元素不唯一:List
    是否线程a安全:
    a)安全:Vector
    b)不安全,查询多:ArrayList
    c)不安全,增删多:LinkedList

Map
map的特点:
双列,存储键与值
键唯一,值可以有多个
功能:
1.添加
V put(K key, V value)
2.删除
void clear()
V remove(Object key)
3.判断
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
4.获取
Set<Map.Entry<K,V>>entrySet();
V get(Object key)
Set keySet()
Collection values()
5.长度
int size()
HashTable
键的底层实现为哈希表
线程安全,效率较低
HashMap特点
键的底层实现为哈希表
线程不安全,效率较高
TreeMap特点
键的底层实现为红黑树,可保证键的排序和唯一性
排序分为自然排序和比较器排序
线程不安全,效率较高

Collections

是一个针对集合操作的工具类

其方法有:

  • void sort(List list)
  • binarySearch(List<?>list T key)
  • T max(Collection<?> c)
  • void reverse(List<?> list)
  • void shuffle(List<?> list)

字节流与字符流

什么是流
流是一个抽象概念,对输入输出的抽象,输入流可看作一个输入通道,输出流可看作一个输出通道
什么是字节流
以字节为单位的流称为字节流
InputStream是输入字节流的祖先
OutputStream是输出字节流的祖先

字节流输出
什么是字符流
以字符为单位的流称为字符流
Reader是读取字符流的祖先
Writer是输出字符流的祖先

StringBuffer&String&StringBuilder

String,StringBuffer,StringBuilder的操作最终底层都是对char数组的操作,其中StringBuffer和StringBuilder都继承自AbstractStringBuilder

  • String:char数组的final的,不可变,每次修改String时,实际上是new一个新的String对象返回,线程安全。由于空间开销大,故在频繁的增删改操作时不建议使用
  • StringBuffer:线程安全的(添加了synchronized修饰),多线程时建议使用,修改值时实际上是对底层的char数组进行修改,相比String开销更小
  • StringBulder:非线程安全,单线程时使用速度更快,修改值时实际上是对底层的char数组进行修改,相比String开销更小