接口interface 成员变量 public static final 成员方法 public abstract 没有构造器
一个类先继承在实现
* Collection
* List(存取有序,有索引,可以重复)
* ArrayList
* 底层是数组实现的,线程不安全,查找和修改快,增和删比较慢
* LinkedList
* 底层是链表实现的,线程不安全,增和删比较快,查找和修改比较慢
* Vector
* 底层是数组实现的,线程安全的,无论增删改查都慢
* 如果查找和修改多,用ArrayList
* 如果增和删多,用LinkedList
* 如果都多,用ArrayList
* Set(存取无序,无索引,不可以重复)
* HashSet
* 底层是哈希算法实现
* LinkedHashSet
* 底层是链表实现,但是也是可以保证元素唯一,和HashSet原理一样
* TreeSet
* 底层是二叉树算法实现
* 一般在开发的时候不需要对存储的元素排序,所以在开发的时候大多用HashSet,HashSet的效率比较高
* TreeSet在面试的时候比较多,问你有几种排序方式,和几种排序方式的区别
* Map
* HashMap
* 底层是哈希算法,针对键
* LinkedHashMap
* 底层是链表,针对键
* TreeMap
* 底层是二叉树算法,针对键
* 开发中用HashMap比较多
try:用来检测异常的
catch:用来捕获异常的
finally:释放资源
Throwable的几个常见方法
* a:getMessage()
* 获取异常信息,返回字符串。
* b:toString()
* 获取异常类名和异常信息,返回字符串。
* c:printStackTrace()
* 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
:throws和throw的区别
* a:throws
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用逗号隔开
* 表示抛出异常,由该方法的调用者来处理
* b:throw
* 用在方法体内,跟的是异常对象名
* 只能抛出一个异常对象名
* 表示抛出异常,由方法体内的语句处理
后续程序需要继续运行就try
后续程序不需要继续运行就throws
Properties的load(new FileIputstream())和 store(new FileOutStream());第二参数是对列表参数的描述,可以给null
RandomAccessFile随机访问流,即能读又能写,还可在在指定位置写和读;
* LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
InputStreamReader 是字节流通向字符流的桥梁
用默认编码表(gbk)读写,出现乱码,gbk一个汉字占两个字节,而utf-8一个汉字占3个字节
打印流只操作数据目的
使用ReentrantLock类的newCondition()方法可以获取Condition对象
* 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法
* 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了
ThreadGroup 线程组;
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
第三种实现方式:
implements Callable<Integer>
Future<Integer> f1 = pool.submit(new MyRu());
工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。
工厂接口中有抽象父类,子类实现接口,创建父类引用,子类实例
GUI
事件: 用户的一个操作
* 事件源: 被操作的组件
* 监听器: 一个自定义类的对象, 实现了监听器接口, 包含事件处理方法,把监听器添加在事件源上,
当事件发生的时候虚拟机就会自动调用监听器中的事件处理方法
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
b1.addMouseListener(new MouseAdapter() {
/*@Override
public void mouseClicked(MouseEvent e) {
//单击
端口号范围从0-65535
udp
发送Send DatagramSocket DatagramPacket, 指定数据, 长度, 地址, 端口
接收Receive DatagramSocket, 指定端口号 DatagramPacket, 指定数组, 长度 DatagramSocket接收DatagramPacket
String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();
tgp
客户端
Socket ip和端口号, getinputstream
ServerSocket 端口号, accept得到socket然后相同
.getDeclaredField