流
File
Java.io.File代表了计算机中的文件夹和文件。
| createNewFile |
| delete |
| exists |
| getName |
| getParent |
| getParentFile |
String | getPath |
| isDirectory |
| isFile |
| isHidden |
| lastModified |
| length |
String | list |
| listFiles |
| mkdir |
| mkdirs |
| renameTo |
输入流和输出流
Input/Output(输入和输出)
Java中对于操控输入和输出的工具类统称为IO流系统
放在java.io包下
Java中的输入和输出是相对于当前运行的程序。
Io流分为:输入流和输出流
输入流的作用:将外部的数据读到程序中。
输出流的作用:将程序中的数据写到外部。
System.in是一个输入流,标准输入流,代表了控制台的输入。
System.out是一个输出流,标准输出流,代表向控制台的输出。
字节流和字符流
IO可以分为字节流和字符流。
字节流读和写的是字节,字符流读和写的是字符。
字节输入流、字节输出流、字符输入流、字符输出流
PrintWriter是字符输出流
FileInputStream是字节输入流
FileOutputStream是字节输出流
FileReader是字符输入流
FileWriter是字符输出流
过滤流和节点流
直接与节点相关联的流叫做节点流 节点指的就是要读的源数据或者写入的目标数据
不与节点相关联而是与其他流相关联的流叫过滤流
过滤流是用来包装节点流的
BufferedInputStream 字节输入过滤流。
BufferedOutputStream 字节输出过滤流。
BufferedReader 字符输入过滤流。
BufferedWriter 字符输出过滤流。
流的继承结构
Io流系统有四个顶层的超类,都是抽象类。
InputStream 是所有字节输入流的超类。
OutputSteam 是所有字节输出流的超类。
Reader 是所有字符输入流的超类。
Writer 是所有字符输出流的超类。
ByteArrayInputStream 字节数组输入流。
ByteArrayOutputStream 字节数组输出流。
InputStreamReader 是字节流通向字符流的桥梁。
OutputStreamWriter 是字符流通向字节流的桥梁。
什么时候用字节流:
什么时候用字符流:
如果需要在程序中看文件的内容,就用字符流。
如果只拷贝、上传、下载,不牵扯文件内容的就用字节流。
集合
ArrayList 集合的一种,表现为一个列表。长度可变的,添加元素和删除元素,集合会自动的伸缩,它始终维持一个列表。
| add |
| add |
| clear |
| contains |
| get |
| indexOf |
| isEmpty |
| lastIndexOf |
| remove |
| set |
| size |
ArrayList和LinkedList的区别
ArrayList 是List接口的一种实现,它是使用数组来实现的。
LinkedList 是List接口的一种实现,它是使用链表来实现的。
ArrayList 遍历和查找元素比较快。LinkedList遍历和查找元素比较慢。
ArrayList 添加、删除元素比较慢。LinkedList添加、删除元素比较快。
List的排序
List是有序列表
使用Collections类的sort方法可以对List进行排序,前提是:List中的元素必须实现Comparable接口。
使用Arrays类的sort方法可以对数组进行排序,前提是数组中的元素必须实现Comparable接口。
Set
一个不能包含重复元素的集合。重复的元素是:set 不包含满足 e1.equals(e2)
的元素对 e1
和 e2
,并且最多包含一个 null 元素。
Set接口不允许重复。
HashSet是无序的,迭代时,元素的顺序和加入的顺序无关。
TreeSet是有序的,它在加入元素的时候就会按照元素的自然顺序排序,或者根据比较器的结果进行排序。
如果构造TreeSet时没有传入比较器,那么它加入的元素必须要实现Comparable接口。
如果构造TreeSet时传入了比较器,那么它加入的元素就不必实现Comparable接口。
队列
队列是一种先进先出的数据结构。
单端队列:Queue接口。在尾部插入,在头部删除。
双端队列:Deque接口。可以在两端插入和删除。
优先级队列:PriorityQueue类。每次调用remove总是移出最小的元素。
LinkedList实现了Deque接口。Deque继承于Queue。
PriorityQueue实现了Queue。
栈
栈是一种先进后出的数据结构。
Stack类是栈的一种实现。
Deque接口及其实现提供了关于栈更完整的操作,应该优先使用这个接口。
Deque<Integer> stack = new ArrayDeque<Integer>();
映射表
映射表是存放键值对,可以通过键来快速的查找对应的值。
Map接口有两个实现类:
HashMap 无序
TreeMap 有序,迭代的顺序按照comparable或者comparator的比较结果来排。
多线程
进程和线程
单用户单任务:在某一时间段,只能有一个用户执行一个任务。
多用户多任务:在某一时间段,多个用户可以共享计算机,每个用户可以执行多个任务。用户感觉不到其他用户存在,就好像他自己在独享计算机。
进程:一个正在执行的程序。
线程:一个进程可以同时运行多个线程,每个线程完成一项任务。
时间片:cup把时间分为一个个时间片,同一时间只有一个线程在占用cpu。由于时间片很短,就会感觉到多个线程在同时运行。
进程和线程的区别:
进程大线程小。进程创建和执行开销比较大。线程的创建和执行开销比较小。
进程和进程之间没有关系。同一进程的线程他们共享同样的内存空间和资源。
线程的创建
当执行main方法时,java虚拟机会创建一个线程名字为“main”。这个线程会执行main方法的代码。这个线程叫做主线程。当main方法的代码全部执行完毕,或者main方法抛出了一个异常,主线程就会终止。
// 创建一个线程对象
Thread t1 = new MyThread();
// 启动线程
t1.start();
//新的线程执行其run方法,主线程继续往下执行
线程一旦启动,就会执行其run方法,当run方法执行完毕,或者抛出了一个异常,线程就终止
创建线程的两种方式
一种继承Thread类,并实现run方法。
另外一种是实现Runnable接口。
实现接口比较好,因为java只能单继承,如果继承了Thread类,就不能继承其他的类。
线程的状态
线程并发问题
多个线程同时对同一数据进行存取,就会导致数据丢失。
线程同步
使用线程同步,使得多个线程不能同时对同一数据进行存取。
方式一:
//同步代码块
//只有获得了d对象的锁,才能进入同步代码块
synchronized (d) {
//在同步代码块没有执行完毕之前
//线程一直持有这个锁
d.setI(d.getI() - 1);
//当同步代码块执行完毕
//线程释放这个锁
}
// 同步方法,锁的是当前对象 就是this
public synchronized void transfor(int form, int to, double amount) {
//同步方法,将整个方法体的代码都同步了
}
相当于
// 同步方法,锁的是当前对象 就是this
public void transfor(int form, int to, double amount) {
Synchronized(this){
}
}
run方法不能声明异常,只能捕获异常,如果run方法内部出现了没有处理的异常,run方法就会停止,线程就会终止。
网络编程
URL
统一资源定位符,它描述的是互联网上资源的位置,以及浏览器应该如何处理这个资源。
一个url包含两方面的内容:协议和资源名称。
http://www.baidu.com http是协议 www.baidu.com是资源名称
协议有很多种:
http:超文本传输协议,描述网页在互联网上应该如何传输。
ftp:文件传输协议
https:安全的超文本传输协议。
TCP协议是传输层的协议,它是面向连接的,可靠的,基于字节流的。
UDP协议是传输层的协议,它是无连接的,不可靠的,基于数据包的。
TCP传输速度慢,开销大,UDP传输速度快,开销小。