首页 > 代码库 > 编程专题
编程专题
编程专题
1 I/O编程
1.1 java.io
一个方向一个维度
两种对称
输入和输出的对称性
InputStream --- OutputStream
Reader --- Writer
字节和字符的对称性
InputStream --- Reader
OutputStream --- Writer
两种设计模式
适配器模式(转换流)和装换模式(处理流)
只要输入流一定有read方法读取数据
只要输出流一定有write方法写数据
转换流 InputStreamReader (把字节流转换成字符流)
处理流 DataInputStream、BufferedReader -> readLine
文件操作
二进制文件 --- FileInputStream/FileOutputStream
字符文件 --- FileReader/FileWriter
对象的序列化(串行化、腌咸菜)和反序列化
序列化 --- ObjectOutputStream -> writeObject
反序列化 --- ObjectInputStream -> readObject
类必须要实现Serializable(标识接口)
1.2 java.nio
Buffer
Channel
Charset
Selector
1.3 nio.2
Java 7升级的IO
2 容器和泛型
2.1 集合框架
2.1.1 Collection
List
可以用索引来操作元素
ArrayList读取效率高
LinkedList增删元素效率高
ArrayList
LinkedList
Set
不允许有重复元素
TreeSet会对元素进行排序
需要元素是可比较对象(实现Comparable接口)
HashSet会通过元素的哈希码来决定如何存取元素
需要重写hashCode和equals方法
TreeSet
HashSet
Queue
2.1.2 Map
键值对形式的容器,键是唯一的
TreeMap
HashMap
2.1.3 遗留容器
Properties
通常用它来操作键值对形式的配置文件
Properties对象的load方法可以从指定的输入流中加载配置文件中的键值对映射
配置文件db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo
uid=root
pwd=123456
2.2 泛型
2.2.1 泛型方法
例如:
public static <T> T foo(T x, T y) { }
2.2.2 泛型类
例如:
class MyStack<T> {
private List<T> content = new ArrayList<T>();
public void push(T t){ }
public T pop() { return null; }
}
2.2.3 泛型接口
例如:
public interface BaseDao<E, K> {
public boolean save(E entity);
public boolean deleteByPK(K pk);
public boolean update(E entity);
public List<E> findAll();
public E findByPK(K pk);
}
3 异常机制
一种在不打乱原有业务»˜的前提下,把程序在Ð行时可能出现的不正常状态处理掉的方式。异常机制是一种低耦合的处理Ð行时状况的手段
异常相关的关键字
throw (Throwable的子类型都可以被抛出)
throws (为方法声明异常)
try (将可能出现异常的代码保护起来)
catch (捕获异常)
finally (总是执行代码,用于释放外部资源)
自定义异常
继承Exception或者它的子类型
受检异常和运行时异常(非受检异常)
RuntimeException和它的子类型都是非受检异常
常见的运行时异常
NullPointerException
ArrayIndexOutOfBoundsException
NumberFormatException
ClassCastException
ArithmeticException
NegativeArraySizeException
IllegalArgumentException
4 网络编程
4.1 基于TCP
4.1.1 服务器
创建服务器
1. 创建服务器套接字ServerSocket并绑定端口(端口是用来区分不同的服务的逻辑地址)
2. 监听客户端的连接,调用ServerSocket对象的accept方法,该方法是阻塞方法,如果没有客户端连接到服务器则保持阻塞;如果监听到客户端连接,则返回Socket对象
3.进行I/O操作。通过Socket对象的getInputStream方法可以得到输入流,调用read方法读取客户端的数据;通过getOutputStream方法可以得到输出流,调用write方法可向客户端发送数据
4. 通信结束后调用Socket对象的close方法关闭客户端套接字
通常我们需要创建多线程的服务器,即在监听到客户端连接后通过启动线程的方式来处理客户端的请求并对客户端的请求作出响应,主线程继续监听其他客户端的连接
4.1.2 客户端
创建客户端
1. 创建Socket对象,指定服务器的IP地址和端口号
2. 连接成功后,通过Socket对象的getInputStream和getOutputStream方法得到输入输出流,剩下的事情就是I/O操作
3. 通过Socket对象的close方法关闭套接字
I/O操作时可以使用处理流来简化I/O操作
PrintStream
---> new PrintStream(client.getOutputStream());
DataInputStream
---> new DataInputStream(client.getInputStream());
4.2 基于UDP
不区分服务器和客户端,通信双方都是创建DatagramSocket和DatagramPacket
DatagramPacket代表要收发的数据包,发送方的DatagramPacket对象中需要填写收信人的IP地址、端口号和信息的内容,接收方的DatagramPacket对象是一个空包,里面只需要有足够的缓冲区来接受发送方发送的数据
DatagramSocket提供了send方法用于发送数据包,还提供了receive方法用于接收数据包
4.3 java.net
InetAddress --- IP地址(寻址)
URL --- 统一资源定位符(资源的位置信息)
URLConnection --- (对网络资源的连接)
5 多线程
5.1 创建线程
通过创建Thread类的对象并调用其start方法可以启动线程
5.1.1 继承Thread类
5.1.2 实现Runnable接口
5.1.3 实现Callable接口
Java 5+
5.2 线程同步
synchronized关键字
用synchronized关键字修饰的方法只有一个线程能够进入
synchronized放在对象上构造同步代码块(对象只有一个线程能够访问)
Java 5+
Lock ---> ReentrantLock (重入锁)
lock方法 --- 加锁
unlock方法 --- 解锁(建议放在finally代码块中)
Semaphore(信号量)
不恰当的同步可能导致死锁(deadlock)
5.3 线程调度
线程的生命周期
Java 1.4-
sleep
yield
join
wait
notify
notifyAll
Java 5+
Condition
5.4 线程池
Java 5
ExecutorService接口 -->
execute(Runnable)
Executors工具类 -->
newFixedThreadPool(int)
newCachedThreadPool()
池化技术(包括线程池、数据库连接池)是典型的用空间换时间的策略,因为对于计算机来说时间和空间是不可调和的矛盾,二者可以相互交换
6 GUI编程
6.1 AWT
6.2 Swing
6.2.1 常用的控件
JLabel
JButton / JRadioButton / JCheckBox
JTextField / JTextArea / JPasswordField
JComboBox
JList / JTable / JTree
JMenu / JMenuItem / JRadioButtonMenuitem / JCheckBoxMenuItem / JMenuBar / JPopupMenu / JSeparator
JPanel / JScrollPane / JTabbedPane / JSplitPane
JProgressBar / JEditorPane / JSlider
6.2.2 布局管理器
FlowLayout
BorderLayout
GridLayout
CardLayout
SpringLayout
GroupLayout
6.2.3 MVC架构模式
MVC模式
M --- Model模型 --- 数据
V --- View视图 --- 呈现给用户的界面
C --- Controller控制器 --- 连接模型和视图的桥梁
MVC模式实现了视图和数据的分离
6.3 事件处理机制
6.3.1 ActionListener
6.3.2 MouseListener / MouseMotionListener / MouseWheelListener
MouseAdapter
6.3.3 KeyListener
KeyAdapter
6.3.4 WindowListener
WindowAdapter
7 反射
通过对象还原类的信息,获得类的元数据
8 JDBC
8.1 核心API
8.1.1 Driver
8.1.2 DriverManager
工具类
通过getConnection(url, uid, pwd) 方法 ---> Connection
url --- jdbc:mysql://IP地址:端口号/数据库的名字
uid --- 数据库的用户名
pwd --- 用户名对应的口令
8.1.3 Connection
开启事务环境的方法:
setAutoCommit(false) --- 开启事务
commit() --- 提交事务
rollback() --- 回滚事务
setTransactionIsolation(常量) --- 设置事务隔离级别
8.1.4 Statement
PreparedStatement
预编译语句:
1. 性能好
2. 使用更方便
3. 防范SQL注射攻击
CallableStatement
调用存储过程的SQL语句对象
8.1.5 ResultSet
游标(结果集)
next --- 取下一条记录
8.2 性能优化
8.2.1 抓取策略
ResultSet对象的setFetchSize方法可以指定每次抓取多少条记录
8.2.2 批处理
PreparedStatement对象的方法
addBatch --- 将语句添加到批处理
executeBatch --- 执行批处理
8.2.3 连接池
创建连接和释放连接都需要经过TCP协议的三次握手,开销很大,为此可以事先创建好若干连接放入连接池中,需要连接的时候从连接池获取,用完以后归还给连接池,不创建也不释放连接以节省开销。这又是典型的用空间换时间的策略
8.3 事务
事务 ACID 特性
原子性 ---
一致性 --- 事务完成后数据状态要一致
隔离性 --- 不同的事务不能看到对方的中间状态
持久性 --- 事务完成后改动会被持久化
事务隔离级别
脏读 --- 读到没有提交的事务的数据
不可重复读 --- 再次读取无法读到被其他事务修改的数据
幻读 --- 再次读取读到了其他事务提交的数据
8.4 DAO模式
DAO --- Data Access Object 数据访问对象
以对象为单位进行增删改查的操作
DAO的实现类封装了SQL语句和JDBC代码
9 XML
XML - eXtensible Markup Language 可扩展标记语言
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<name>Java编程思想</name>
<author gender="男">Bruce Eckel</author>
<price>128.0</price>
</book>
<book>
<name>Java面向对象程序设计</name>
<author gender="女">孙卫琴</author>
<price>38.0</price>
</book>
</books>
1. 异构系统之间的数据交换 (被JSON取代)
2. 作为配置文件(常用)
Java操作XML推荐使用dom4j