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(...) ;
从源通道中读取指定位置的指定个数的字节,写入的目标通道。
许多操作系统直接从文件系统缓存完成字节的传输。可能更加高效。

posted on 2018-04-19 20:42  飞机耳朵  阅读(137)  评论(0编辑  收藏  举报

导航