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

  • 相关阅读:
    idea 快捷键 记录
    Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms") 使用@ConfigurationProperties读取yml配置
    SpringData Jdbc
    设备树中指定的中断触发方式与request_irq中指定的触发方式不一致时,内核会使用哪种中断触发方式呢?
    设备树中的interrupts属性解析
    编译grub时报告"grub_script.yy.c:19:22: error: statement with no effect [-Werror=unused-value]"怎么处理?
    uefi是如何启动linux内核的?
    markdown中如何设置字体为红色?
    linux下如何查看磁盘分区所使用的文件系统格式?
    bootargs中的rootwait 与rootdelay有什么区别?
  • 原文地址:https://www.cnblogs.com/zyde/p/8886164.html
Copyright © 2020-2023  润新知