Java 核心技术(卷一)笔记

2018-08-03  本文已影响0人  qingshangwushi

1.Java是一种强类型语言

  • 在JAVA中,所有的数据类型所占的字节数量与平台无关。
  • Java没有任何无符号(unsigned)形式的int、long、short或byte类型。

2.基本类型(8种)

3.变量

4.对象与类

类设计技巧

5.继承

6.接口、lambda表达式于内部类

7. 异常、断言和日志

异常处理的任务就是将控制权从错误产生的地方转移给能够处理这些情况的错误处理器。

  • 异常分类

    image

    所有的异常都是由Throwable继承而来。但在下一层分解为两个分支:Error 和 Ecxeption。

    • Error 类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。
    • Exception层次结构,在设计Java程序时需要关注
      • RuntimeException:由程序错误导致的异常。
      • 其他异常:程序本身没有问题,但由于像I/O错误这类问题导致的异常。
  • 声明受查异常:

    在下面四中情况下应该抛出异常

    • 调用一个抛出受检查异常的方法,例如,FileInputStream构造器。

    • 程序运行过程中发现错误,并且利用throw语句抛出一个受检查异常。

    • 程序出现错误,例如a[-1]=0会抛出一个ArrayIndexOutOfBoundsException这样的非受查异常。

    • Java虚拟机和运行时库出现内部错误。

      出现前两种之一,就必须告诉调用这个方法的程序员有可能抛出异常。

      声明方法可能抛出的异常:

      Class MyAnimation{
          ...
              public Image loadImage(String s) throws FileNotFoundException, EOFException{
              
          }
      }
      

      抛出异常:

      throw new EOFException();
      
  • 创建异常类

    //定义一个派生于Exception的类,或者派生于Exception子类的类
    
    //例如,定义一个派生于IOException的类
    Class FileFormatException extends IOException{
        public FileFormatException(){}
        public FileFormatException(String gripe){
            super(gripe);
        }
    }
    
    // 习惯上,定义的类应该包含两个构造器,一个是默认的构造器;
    // 另一个是带有详细信息描述的构造器。
    
    
  • 捕获异常

    try{
        ....
    }catch(Exception e){
        handler for this type
    }
    

    如果try语句块中的任何代码抛出一个在catch子句中说明的异常类:

    • 程序将跳过try语句块的其余代码
    • 程序将执行catch子句中的处理代码
  • finally子句:

    不管是否有异常被捕获,finally子句中的代码都被执行。

    • try语句可以只有finally语句,而没有catch子句。
  • 带资源的try语句(Java SE 7)

    try-with-resources

    try(Resource res = ...){
        work with res
    }
    

    try块退出时,会自动调用res.close()。

8. 泛型程序设计

9. 集合

EnumMap是一个键类型为枚举类型的映射。它可以直接且高效地用一个数值组实现。在使用时,需要在构造器中指定键类型:

    EnumMap<Weekday, Employee> personInCharge = new EnumMap<>(Weekday.class);
- 子范围

  ```java
  List group2 = staff.subList(10, 20);
  
  group2.clear();//staff reduction
  //现在,元素自动地从staff列表中清除了,并且group2为空。
  ```

  

- 同步视图

  如果由多个线程访问集合,就必须确保集不会被意外地破坏。

  类库的设计者使用视图机制来确保常规集合的线程安全,而不是实现线程安全的集合类。

  eg:  `Collections类的静态synchronizedMap`

  ```java
  Map<String, Employee> mapl = Collections.synchronizedMap(new HashMap<String, Employee>());
  ```

  <font color="red">通常,视图有一些局限性,即可能只可以读、无法改变大小、只支持删除而不支持插入,这些与映射的键视图情况相同。如果试图进行不恰当的操作,受限制的视图就会抛出一个UnsupportedOperationException。</font>

10. 部署Java 应用程序

  1. 创建jar文件

    jar cvf JARFILENAME file1 file2 ....

    image
  2. 清单文件

    除了类文件、图像和其他资源外,每个JAR文件还包含一个用于描述归档特征的清单文件(manifest)

    清单文件被命名为MANIFEST,位于JAR文件的一个特殊MATA-INF子目录中。

11.并发

> #### 锁和条件的关键:
>
> - 锁用来保护代码片段,任何时刻只能由一个县城执行该被保护的代码。
> - 锁可以管理试图进入被保护代码段的线程。
> - 锁可以拥有一个或多个相关的条件对象。
> - 每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。
##### 使用Lock和Condition对象还是同步方法?下面一些建议:

- 最好既不使用Lock/Condition也不使用synchronized关键字。

- 如果synchronized关键字适合你的程序,那么请尽量使用它,这样可以减少编写的代码数量,减少出错的几率。

- 如果特别需要Lock/Condition结构提供的独有特性时,才使用Lock/Condition。
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatitle修饰之后:

1. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2. 禁止进行指令重排序。

   

<font color="red">可见性只能保证每次读取的是最新的值,但是volatitle没办法保证对变量的操作的原子性。</font>
- `如果有大量线程要访问相同的原子值,性能会大幅下降,因为乐观锁更新需要太多次重试。`

  - java SE 8提供了`LongAdder`和`LongAccumulator`类来解决这个问题。
  - 如果认为有大量竞争,只需使用LongAdder而不是AtomicLong.
上一篇下一篇

猜你喜欢

热点阅读