🦛 创建新线程
type
status
date
slug
summary
tags
category
icon
password
Property
 
Java语言内置了多线程支持。当Java程序启动的时候,实际上是启动了一个JVM进程,然后,JVM启动主线程来执行main()方法,在main()方法中又可以启动其他线程。
要创建一个新线程非常容易,需要实例化一个Thread实例,然后调用它的start()方法:
这个线程启动后实际上什么也不做就立刻结束了。
 
我们希望新线程能执行指定的代码,有以下几种方法:
方法一:从Thread派生一个自定义类,然后覆写run()方法
 
方法二:创建Thread实例时,传入一个Runnable实例
🦥 读取classpath资源
type
status
date
slug
summary
tags
category
icon
password
Property
 
很多Java程序启动的时候,都需要读取配置文件,例如从一个.properties文件中读取配置:
这段代码要正常执行,必须在C盘创建conf目录,然后在目录里创建default.properties文件。但是,在Linux系统上,路径和Windows的又不一样。因此,从磁盘的固定目录读取配置文件,不是一个好的办法。
 
有没有路径无关的读取文件的方式呢?
Java存放.class的目录或jar包也可以包含任意其他类型的文件,例如:
  • 配置文件,例如.properties
  • 图片文件,例如.jpg
  • 文本文件,例如.txt.csv
  • ……
从classpath读取文件就可以避免不同环境下文件路径不一致的问题:如果把default.properties文件放到classpath中,就不用关心它的实际存放路径。
数据类型
type
status
date
slug
summary
tags
category
icon
password
Property
 
notion image

JS包括哪些数据类型?

JS中数据类型有:原始类型、引用类型
原始类型:Undefined、Number、String、Boolean、Null
引用类型:Object以及Object的子类
 
ES规范(ECMAScript规范),在ES6之后,又基于以上的6种类型之外添加了一种新的类型:Symbol
 

typeof

typeof运算符可以在程序的运行阶段动态的获取变量的数据类型
🦛 Condition
type
status
date
slug
summary
tags
category
icon
password
Property
 
使用ReentrantLock比直接使用synchronized更安全,可以替代synchronized进行线程同步。
但是,synchronized可以配合waitnotify实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock我们怎么编写waitnotify的功能呢?
答案是使用Condition对象来实现waitnotify的功能。
我们仍然以TaskQueue为例,把前面用synchronized实现的功能通过ReentrantLockCondition来实现:
可见,使用Condition时,引用的Condition对象必须从Lock实例的newCondition()返回,这样才能获得一个绑定了Lock实例的Condition实例。
Condition提供的await()signal()signalAll()原理和synchronized锁对象的wait()notify()notifyAll()是一致的,并且其行为也是一样的:
  • await()会释放当前锁,进入等待状态;
  • signal()会唤醒某个等待线程;
  • signalAll()会唤醒所有等待线程;
  • 唤醒线程从await()返回后需要重新获得锁。
iterable
type
status
date
slug
summary
tags
category
icon
password
Property
 
遍历Array可以采用下标循环,遍历MapSet就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,ArrayMapSet都属于iterable类型。
具有iterable类型的集合可以通过新的for ... of循环来遍历。
 
for ... of循环遍历集合,用法如下:
 
for ... of循环和for ... in循环有何区别?
for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
for ... in循环将把name包括在内,但Arraylength属性却不包括在内。
🦥 操作Zip
type
status
date
slug
summary
tags
category
icon
password
Property
 
ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容:
notion image
另一个JarInputStream是从ZipInputStream派生,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是zip包,只是额外附加了一些固定的描述文件。
 

读取zip包

要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后循环调用getNextEntry(),直到返回null,表示zip流结束。
一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,就用read()方法不断读取,直到返回-1
 

写入zip包

ZipOutputStream是一种FilterOutputStream,它可以直接写入内容到zip包。我们要先创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包。
🍂 Swing
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
实际使用 Java 开发图形界面程序时 ,很少使用 AWT 组件,绝大部分时候都是用 Swing 组件开发的 。 Swing是由100%纯 Java实现的,不再依赖于本地平台的 GUI, 因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的 AWT 组件被称为重量级组件。 由于 Swing 的所有组件完全采用 Java 实现,不再调用本地平台的 GUI,所以导致 Swing 图形界面的显示速度要比 AWT 图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。
 
使用Swing的优势:
  • Swing 组件不再依赖于本地平台的 GUI,无须采用各种平台的 GUI 交集 ,因此 Swing 提供了大量图形界面组件 , 远远超出了 AWT 所提供的图形界面组件集。
  • Swing 组件不再依赖于本地平台 GUI ,因此不会产生与平台 相关的 bug 。
  • Swing 组件在各种平台上运行时可以保证具有相同的图形界面外观。
Swing 提供的这些优势,让 Java 图形界面程序真正实现了 " Write Once, Run Anywhere" 的 目标。
 
Swing的特征:
  • Swing 组件采用 MVC(Model-View-Controller, 即模型一视图一控制器)设计模式:
    JSON
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     

    什么是JSON,有什么用?

    JavaScript Object Notation(JavaScript对象标记),简称JSON(数据交换格式) JSON主要的作用是:一种标准的数据交换格式(目前非常流行,90%以上的系统,系统A与系统B交换数据的话,都是采用JSON)
     

    JSON是一种标准的轻量级的数据交换格式。特点是:

    体积小,易解析。

    在实际的开发中有两种数据交换格式,使用最多,其一是JSON,另一个是XML

    XML体积较大,解析麻烦,但是有其优点是:语法严谨。(通常银行相关的系统之间进行数据交换的话会使用XML)

    JSON的语法格式: