【读过的书,留下的迹】Java核心技术卷I

前言

  最近发现有时候看完一本书,时间久了容易忘记,看书不总结思考效果大打折扣,故打算写这一系列文章,一是为了整理书中的要点,帮助自己消化理解;二是勉励自己多看书思考。文章中不会把书中内容讲解的非常详细,只是总结概括,适合已经阅读过该书的读者。

第3章:Java的基本程序设计结构

(1)8种基本类型

TablesAre
int4字节
short2字节
long8字节
byte1字节
float4字节
double8字节
char不一定,至少2字节
boolean

  • ps:Java中上述类型占空间的大小与机器无关。对于c++,int在16位机器占2字节,32位上占4字节;long在32位上占4字节,在64位处理器上占8字节
  • 二进制:前置0b;八进制:前置0;十六进制:前置0x

(2)字符串

  • 一定不能用==判断两个字符串是否相等,要用 a.equals(b)

(3)大数值

  • BigInteger和BigDecimal可以处理任意长度和精度的数字数值

第4章:对象与类

  • 两个public class不能定义在同一个文件中

  • final修饰符大都应用于基本类型域,或不可变类域(无任何方法可以修改类,如String)。若用于可变的类,仅仅指被final修饰的对象引用不能改变,但是对象引用引用的对象是能被改变的

  • 不要编写返回引用可变对象的访问器方法,应返回其克隆

(1)方法参数

  • Java中只有按值调用,没有按引用调用(c++分按值和按引用),Java的做法是把参数的对象引用拷贝一份传入
    • 一个方法不能修改一个基本数据类型的参数
    • 一个方法可以改变一个对象参数的状态
    • 一个方法不能让对象参数引用一个新的对象

(2)对象构造

  • 数据域初始化
    • 在构造器中设置值
    • 在声明中赋值
    • 初始化块:在类的申明中,包含多个代码块,只要构造类的对象,这些块就会被执行
  • 对于静态域初始化,可提供初始化值,或静态初始化块

第5章:继承

  • 子类的方法不能直接访问超类的私有域,需借用super.私有域

  • 多态

    • 一个对象变量可以指示多种实际类型的现象
  • 动态绑定

    • 运行时能够自动地选择调用哪个方法
  • final

    • 修饰类,阻止继承
    • 修饰方法,阻止重写

(1)访问修饰符

  • private:仅对本类可见
  • public:对所有类可见
  • protected:对本包和所有子类可见
  • 默认:对本包可见

(2)Object类

  • 常用方法:equals、toString、hashCode、

(3)反射Class

  • Object.getClass 获得 java.lang.Class
  • Class.forName(“java.util.Date”)

第6章:接口与内部类

(1)接口

  • 接口中的所有方法自动属于public
  • 接口可以定义常量,接口中的域自动设为public static final
  • 接口绝不能含有实例域,也不能在接口中实现方法

常用接口:Cloneable、Comparable

(2)克隆

  • 默认拷贝是浅拷贝
  • 用户需要自己实现深拷贝

(3)内部类

  • 好处

    • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
    • 内部类可以对同一个包中的其他类隐藏起来
    • 匿名内部类很便捷
  • 局部内部类

    • 不能用public或private访问说明符声明
    • 对外部世界可以完全隐藏
    • 可以访问外部类,和被声明为final的局部变量
  • 匿名内部类
    • 只使用一次
  • 静态内部类
    • 有时候内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类,使用static声明,形成内部公有类
    • 只有内部类可以声明static

第11章:异常、断言、日志和调试



第13章:集合

(1)集合框架



(2)具体集合



第14章:多线程

(1)线程同步(常用)

  • 锁对象
public ReentrantLock myLock;
myLock.lock();
tyr {
     critical section //临界区
}
finally {
     myLock.unlock();
}
  • 这一结构确保任何时刻只有一个线程进入临界区,一旦一个线程封锁了锁对象,其他任何线程都无法通过lock语句。
  • 锁是可重入的,即同一线程可以重复地获得已经持有的锁。锁保持了一个持有计数

  • 条件对象

    • 一个锁对象可以有一个或多个相关的条件对象,如果线程获取锁后发现相关条件不满足,可以调用条件对象的await(),则当前线程被阻塞,并放弃了锁,其他线程可获得该锁。
public ReentrantLock myLock;
public Condition oneCondition = myLock.newCondition();
myLock.lock();
tyr {
    while(....)
    oneCondition.await();

    critical section //临界区
    oneCondition.signalAll(); //若有阻塞线程,通知解除
}
finally {
    myLock.unlock();
}
  • synchronized关键字
public synchronized void method() {

}

等价于

public void method() {
    this.intrinsticLock.lock();
    try {
        method body
    }
    finally {
        this.intrinsicLock.unlock();
    }
}
  • 从Java1.0版本开始,Java中的每个对象都有一个内部锁,用synchronized关键字声明方法,那对象的锁将保护整个方法
  • 内部对象锁只有一个相关条件,调用wait或notifyAll等价于intrinsicCondition.await()、intrinsicCondition.notifyAll()
  • 建议最好不使用lock和synchronized关键字,多使用java.util.concurrent包中的一种机制,如果要用,尽量使用synchronized

synchronized还有另外一种机制

synchronized(obj) {
        临界区
    }
  • Volatile域
    • Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.
private boolean done;
public synchronized boolean isDone() { return done; }
public synchronized void setDone() { done = true; }

可替换为

private volatile boolean done;
public boolean isDone() { return done; }
public void setDone() { done = true; }
  • 线程局部变量
    • ThreadLocal,每个线程独享

(2)线程安全集合

  • 阻塞队列

    • 对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化
      BlockingQueued
  • 线程安全集合

    • concurrentHashMap, concurrentSkipListMap, ConcurrentSkipListSet, ConcurrentLinkedQueue
  • 集合size方法不必再常量时间内操作,通常采用遍历的方法

  • 集合返回弱一致性的迭代器,意味着迭代器不一定反映出它们被构造之后的所有修改

任何集合类通过使用同步包装器变成线程安全的

List<E> synchArrayList = Collections.synchronizedList(new ArrayList<E>());
Map<K, V> synchHashMap = Collections.synchronizedMap(new HashMap<K, V>());
  • ArrayList

    • CopyOnWriteArrayList(适合读多写少)
    • Collections.synchronizedList(包装)
  • LinkedList

    • ConcurrentLinkedQueue
  • HashMap

    • ConcurrentHashMap(锁分离)
    • Collections.SynchronizedMap(包装,synchronized 锁住整个Map)
    • HashTable(synchronized 锁住整个HashTable)
  • TreeMap

    • ConcurrentSkipListMap(跳表)
  • TreeSet

    • ConcurrentSkipListSet(跳表)

(3)Callable和Future

  • Runable封装一个异步运行任务,没有参数和没有返回值,方法名为run
  • Callable与Runable类似,但有返回值,方法名为call
  • Future用于保存异步计算结果,具备get、cancel、isCancelled、isDone等方法
  • ps:FutureTask可以将Callable转换成Future和Runnable

(3)执行器

  • 执行者工厂方法
    • newCachedThreadPool,Excutors.newCachedThreadPool()
    • newFixedThreadPool
    • newSingleThreadExecutor

(4)其他线程同步方法

  • CyclicBarrier
  • CountDownLatch
  • Exchanger
  • Semaphore
  • SynchronousQueue

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

linxdcn

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值