HashCode典型实现
1.给出自定义java类ComboKey的hashcode方法实现,使得在hashMap中存储时尽可能均匀分散。
class ComboKey{
//身高
private int height ;
//体重
private int weight ;
//年龄
private int age ;
//血型
private int blood;
...
public int hashCode(){
return height << 24
| weight << 16
| age << 8
| blood << 0 ;
}
//判断hash是否相同
public boolean equals(Object o){
return this.hashCode() == o.hashCode() ;
}
}
2.实现上题的equals方法的比对。
直接比较hash值即可。
3.编写严格单例懒汉式单例模式。
4.编写函数,将byte转换成0~255之间值。
设计模式
1.单例
2.原型
3.池化
连接池 , 线程池 , 对象池。
使用有限的对象,服务于大量的客户端。
DriverManager.getConnection();
10ms
0.1ms
[DataSource]
c3p0 , dbcp , proxool
/* 自定义连接池, */
Class.forname()
conn = DriverManager.getConnect(); //
conn.setAutoCommit(); //
conn.preparedStatement() //
conn.commit() //
conn.rollback() //
conn.close(); //回收连接到池中
高低原则
高内聚 :事物内部联系越紧密越好。
低耦合 :事物之间联系越松散越好。
自定义数据源
1.自定义连接装饰类型和连接适配器.
//连接适配器(适配器模式)
public class ConnectionAdaptor implements Connection {
public Statement createStatement() throws SQLException {
return null;
}
..
}
/**
* 连接包装类,装饰模式
*/
public class WrappedConnection extends ConnectionAdaptor {
//原生连接
private Connection rawConnn ;
public WrappedConnection(Connection rawConnn) {
this.rawConnn = rawConnn;
}
public void setAutoCommit(boolean autoCommit) throws SQLException {
rawConnn.setAutoCommit(autoCommit);
}
public PreparedStatement prepareStatement(String sql) throws SQLException {
return rawConnn.prepareStatement(sql) ;
}
public void commit() throws SQLException {
rawConnn.commit();
}
public void rollback() throws SQLException {
rawConnn.rollback();
}
/**
* 释放资源,回收连接到连接池
*/
public void close() throws SQLException {
}
}
2.设计连接池
3.
4.
并发
CPU同一时刻只能处理一条指令,cpu轮询方式执行。
因此微观上cpu是串行,宏观上并行。
进程
1.简介
runtime,执行的应用程序。
进程间不能共享内存。
socket
线程
1.简介
Thread,同一进程内并发执行的代码块。
线程间可以共享内存。
创建灵活相应的桌面程序。
2.方法
run() //
start() //启动线程
yield() //放弃
join() //进入当前线程
sleep() //休眠,不失去锁定全。
3.状态
NEW
Runable
Blocked
Waiting
Timed_Waiting
Terminated
4.创建线程方式
4.1)直接创建线程
Thread t = new Thread();
4.2)通过Runnable创建
Runnable r = new Runnable(){
public void run(){
...
}
};
new Thread(r).start();
多个线程共享通知执行过程,耦合度低。
5.线程安全
上锁控制。
synchronize
静态同步方法使用类描述符做为锁,非静态方法使用当前对象做锁。
同步代码块使用特定对象作为锁。
//同步方法粒度粗,性能差。
6.和尚吃馒头问题
100馒头,30和尚,每个和尚最多吃4个馒头,最少吃一个馒头,满足以上前提条件下,尽快把馒头吃了!
6.1)分析
和尚是线程。馒头作成对象池进行派发,并作为控制的中心。
协议
protocal,
TCP //transfer control protocal
IP //internet protocal
OSI
Open system interconnect,开发系统互联。
七层协议
1.物理层
RJ45 //
802.3 //wifi
2.链路层
3.网络层
ip //internet protocal
4.传输层
tcp //transfer control protocal,传输控制协议
//有连接,流方式,
//三次握手时两次身份识别的过程。
udp //user diagram protocl,用户数据报协议
//无连接,无固定路由,不安全,无回执,有限制(64K)
5.会话层
SQL //会话开启关闭
RPC //
6.表示层
数据展示进行控制,是否加密,是否以ascii方式。
7.应用层
http //hyper text tranfer protocal
ftp //file transfer protocal
smtp //simple mail transfer protocal
https //
8.端口和ip
8.1)ip
网络地址。
8.2)端口
-32768 ~ 32767
0 ~ 65535 short
0 ~ 1023 熟知端口(well known)
3306
80
22
Socket
套接字编程。
InetAddress
地址,没有端口
InetSocketAddress
地址 + 端口
NIO
1.简介
New IO.
Socket,阻塞,
2.服务器端
监听程序,监听特定的端口。
3.客户端
连接到指定主机的指定端口.
ByteBuffer
1.介绍
字节缓冲区,内部封装的是数组。
[属性]
a)capacity
容量,缓冲区的总大小。
b)position
位置,当前指针的位置。数组的下标值。
c)limit
限制,对缓冲区使用的限制,前n个可以使用的元素个数,
也可以理解为第一个不能使用的元素下标值,默认是容量。
d)mark
对当前的指针位置进行标记,方便后来进行reset重置指针。
e)remain
剩余的空间,limit - position.
f)原则
0 <= mark <= position <= limit <= capacity
2.方法
buf.limit() //get
buf.limit(int n) //set
buf.position() //get
buf.position(int n) //set
buf.mark() //当前位置,
buf.remaining() //limit - position
buf.hasRemaining() //判断是否还有可用空间
buf.clear() //清空,pos = 0 , limit = capacity , mark = -1 ,
//缓冲区归位。
buf.flip() //拍板,limit = position , position = 0 ; mark = -1
//
Channel
1.介绍
通道表示到达实体的打开的连接,这些实体可以是socket,file,硬件或其他组件,
可以执行不同的IO操作,比如读和写。
通道可以打开也可以关闭,通道一经创建就打开了,一旦close就变为关闭状态。
通道关闭后,执行操作会报异常。
使用可以使用isOpen()来判断是否开启。
通道更具备安全性。
2.零拷贝
FileChannel.transferTo(...) ;
从源通道中读取指定位置的指定个数的字节,写入的目标通道。
许多操作系统直接从文件系统缓存完成字节的传输。可能更加高效。
作业
1.自定义数据源
2.和尚吃馒头
Tables |
Are |
Cool |
col 3 is |
right-aligned |
$1600 |
col 2 is |
centered |
$12 |
zebra stripes |
are neat |
$1 |
graph TD
A[Start] --> B[Your Operation]
B --> C{Yes or No?}
C --> |yes| D[end]
C --> |no| B