java易疏忽知识点
01
基本数据类型
------------
1.byte
bit
-128 ~ 127
1字节 = 8bit
-----------------
|1| | | | | | | |
-----------------
负数存储形式 :补码.
正数 : 自身
2^0
1 :0000 0001
2 :0000 0010
3 :0000 0011
-1 :0000 0001 -> 1111 1110 -> 1111 1111
-2 :0000 0001 -> 1111 1110 -> 1111 1110
-128:1000 0000
字符集:gbk gb2312 utf8 iso8859-1 ascii unicode big5
ascii :美国国家标准机构。对应的是108按键。
gb2312 :简体中文,一个中文2个byte,英文还是一个byte
utf-8 :国际化统一编码, 中文用3byte,英文还是byte
unicode :jvm使用的字符编码,每个字符占2byte,前面有个两个字节的头(-2,-1)
char c = 12 ;
c = 'a' ;
c = '\u'
0-F : 1111 FF
集合
------------------
数组 :检索快,定长。
引用。
List:
判断是否包含特定元素只判断equals方法,和对象地址以及hashcode没有关系。
1.1)ArrayList
数据量 操作 耗时
100,000 写 860ms
100,000 读 8,621ns
内部封装的是数组,有容量,capacity。
数组在内存中地址是连续的,下标是索引,检索时不需要逐个比对,
可以通过计算地址直接定位到指定元素。
1.2)LinkedList
数据量 操作 耗时
100,000 写 10ms
100,000 读 1ms
链表内部通过引用实现,内部类是Node{E e ; Node pre , Node next } ;
使用托盘引用的方式实现数据串联。优势是写操作快。查询较慢。
Map :
key-value,key具有唯一性。
1.1)hashMap
散列。
数组 + 链表内部实现。
//托盘节点。
Node implements Map.Entry<K,V> {
int hash ;
K k ;
V v ;
Node<K,V> next ;
}
map.put(...){
...
putVal(hash(key), key, value, false, true);
}
//计算新hash。
//新key采用高16和低16做异或运算。******************************hash内部算法
//采用移位运算的目的是为了让更多的特征之参与计算。
//异或计算的目的是为了让数据更加分散。
public int hash(key){
int h ;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//hashmap中判断key是否相同,(p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
//1.如果新hash不同,则key一定不同,如果key相同,还要看是否同一对象,如果是同一个key,key相同,否则再看equals()
if(newhash1 != newhash){
不同
}
else{
if(key1 == key2){
相同
}
else{
key1.equals(k2) ;
}
}
1.2)TreeMap
二叉树结构,使用对比.
Set :
不重复。
Hashset == HashMap.
hashset内部通过hashmap实现,value使用垃圾值填充。只用了key的部分。
TreeSet:内部使用的是TreeMap实现。
线程安全的集合
---------------
Vector 等价于list.
HashTable等价于hashMap
集合工具类
----------------
//线程安全化集合
map = Collections.synchronizeMap(m) ;
设计模式
----------------
针对特定场景,给出的专家级的解决方案。
1.singleton
单例
某个类有且只有一个实例.
构造私有
静态指向自身的引用
方法。
1.1)饿汉
public class Garbage {
private static Garbage instance = new Garbage() ;
private Garbage(){
}
public synchronized static Garbage getInstance(){
return instance ;
}
}
1.2)
package com.oldboy.java.gof;
/**
* 垃圾箱
*/
public class Garbage {
private static Garbage instance = null ;
private Garbage(){
}
/**
* 粒度 : 粗
* @return
*/
public static Garbage getInstance(){
if(instance != null){
return instance ;
}
synchronized (Garbage.class){
if(instance == null){
instance = new Garbage();
}
}
return instance ;
}
}
2.factory
工厂
2.1)非静态工厂
/**
* 非静态工厂模式
*/
public class TVFactory1 {
public TVSet productTVSet(){
TVSet tv1 = new TVSet();
tv1.setBrand("熊猫");
tv1.setSize(1000);
tv1.setResolver(2000);
return tv1 ;
}
}
2.2)静态工厂
/**
* 静态工厂模式
*/
public class TVFactory2 {
/**
*
*/
public static TVSet productTVSet(){
TVSet tv1 = new TVSet();
tv1.setBrand("熊猫");
tv1.setSize(1000);
tv1.setResolver(2000);
return tv1 ;
}
}
3.builder
构建器模式。
public static class TVSetBuilder{
TVSet t = new TVSet();
public TVSetBuilder setBrand(String brand){
t.setBrand(brand);
return this ;
}
public TVSetBuilder setSize(int size){
t.setSize(size);
return this ;
}
public TVSetBuilder setResovler(int resovler){
t.setResolver(resovler);
return this ;
}
public TVSet build(){
return t ;
}
4.decorator
装饰模式
锦上添花。
class A{
}
class WrappedA extends A{
private A a ;
public WrappedA(A a){
this.a = a ;
}
public void aa(){
..
a.aa();
...
return ;
}
}
5.pooling
池化模式
6.prototype
原型模式
7.适配器
预实现。
public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener
{
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
...
}
FileIO
-----------------
字节流
字符流
pojo
------------------
plain old java object,普通古老的java对象。
符合javabean的设计规范,空构造,私有属性,共有的getter/setter.
==和equals区别
------------------
1.==比较的是内存地址,即是否是同一对象。
2.equals方法
比较两个对象的内容是否相同,默认实现比较就是内存地址。该方法需要重写,按照自己的需求进行逻辑判断。
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(...) ;
从源通道中读取指定位置的指定个数的字节,写入的目标通道。
许多操作系统直接从文件系统缓存完成字节的传输。可能更加高效。