Java零碎知识点


  1.使用Collections的Copy方法的时候,在定义目的List的时候,并不是只要容纳能力和源list的大小相等就可以,而是需要包含同样多的元素;
    2.创建对象的方式:class的newInstance方法、Constructor的newinstance、new、clone、反序列化;
    3.Rest API 
        Rest是面向资源的,这个概念非常重要,而资源是通过URL进行暴露的。对资源的操作与它无关,暴露资源时,强调不在URL中出现动词;而是使用HTTP的方法;
        REST很好的利用了HTTP本身就有的一些特征,比如HTTP动词、状态码、报头等;
        Rest系统特征:
            1.服务器和客户端需要被隔离对待
            2.来自客户的请求必须包含所需的所有信息,服务器不会存储
            3.服务器必须让客户端知道请求是否可以缓存
            4.允许服务器和客户之间的中间层可以代替服务器对请求进行回应
            5.客户端和服务器之间的通信方法必须是统一的
            6.服务端可以提供一些代码或者脚本在客户的运行环境中执行(不是必须满足)
    4.Restful风格:基于Rest构建的API就是Restful风格 比如mvc
    5.InputStream的mark和reset方法
        mark:标记当前位置以便reset能重新读取相同的字节;如果reset之前读取的字节数多于remark传入的参数,则标记失效
    6.环形链表:循环链表(单双链表都有可能),最后一个节点不指向Null,而是指向头结点;
        --判断链表中是否有环:设置两个指针 从0索引开始向后 指针1每次走2步,指针2每次走1步,如果链表有环,终将相遇;
        --
    7.Guava工程包含了若干被谷歌的Java项目广泛依赖的核心库;
        --Strings用的多的就是判空:Strings.isNullOrEmpty(input)
        --获取两个字符串相同的前后缀:
            Strings.commonPrefix(a,b);
            Strings.commonSuffix(c,d)
        --在前后自动补全字符串:
            Strings.padEnd("123", minLength, '0');
            Strings.padStart("1", 2, '0');
        --Splitter拆分字符串:
            Splitter.onPattern("正则").trimResults().omitEmptyStrings().split(字符串);
            二次拆分:Splitter.onPattern("[,;]{1,}").withKeyValueSeparator('=').split(toSplitString);
        --Joiner合并字符串
            Joiner.on(" ").join(new String[]{"hello","world"});
            二次合并:Joiner.on(",").withKeyValueSeparator("=").join(map);
        --CaseFormat进行大小写转换
        --Objects比较两个对象是否相等,实现toString方法: 个人感觉java的Objects更好一些 有deepEquals,toString也更为简单
        --Preconditions中的方法对检验各种参数非常有用
        --Optional对象来避免null,以后可以使用一下
        --Throwables 在抛异常的时候可以做一些特殊处理,可以获取根异常,可以获得异常列表,可以获得堆栈字符串;
        --不可变集合:ImmutableSet   Multiset可重复和计数的Set
        --双向BiMap:提供双向映射,反向映射是map.inverse().get();
        --Multimaps:一键多值的Map,可以对一个键put多个值,remove的时候需要指定键值对,get的返回值是一个Collection集合
        --HashBasedTable:可以构建出一个表格形式的数据
        --Iterators可以简化迭代操作,将条件移出循环方法体,
        
        还有其他非常多的使用,会继续学习
    8.flume:分布式,可靠和高可用的海量日志采集聚合和传输系统.可以在日志中定制各类数据的发送方,用于收集数据;同时可以通过配置进行简单
        处理,并写到各种数据接受方(文本,HDFS,HBase);
        --事件(Event)贯穿始终;携带日志数据和头信息;
        --概念:
            Client:产生数据,运行在一个独立的线程
            Event:一个数据元,消息头和消息数据组成;(日志对象,或者是avro对象:Avro(读音类似于[ævrə])是Hadoop的一个子项目)
            Flow:Event从目标点到大目的点的迁移的抽象
            Agent:一个独立的Flume进程,包含组件Source、Channel、Sink;
            Source:数据收集的组件
            Channel:中专Event的临时存储,保存Event。
            Sink:从Channel中读取并移除Event,将Event传递到下一个Agent或者存储;
    9.JVM参数:
        Trace跟踪参数:
            -verbose:gc:输出虚拟机中GC的详细情况
            -XX:+printGC:打印GC的简要信息
            -XX:+PrintGCDetails:打印GC详细信息
            -XX:+PrintGCTimeStamps:打印GC发生的时间戳
            -Xloggc:log/gc.log:指定GC的日志位置
            -XX:+TraceClassLoading:监控类的加载
        堆的分配参数:
            -Xmx20m -Xms5m:指定最大堆和最小堆
            -Xmn:设置新生代的大小
            -XX:NewRatio:新生代和老年代的比值
            -XX:SurvivorRatio:幸存代和新生代的比值
            -XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆到文件
            -XX:+HeapDumpPath 导出OOM的路径
            -XX:OnOutOfMemoryError:OOM时,执行一个脚本
        堆参数分配总结:
            根据实际事情调整新生代和幸存代的大小
            官方推荐新生代占堆的3/8
            幸存代占新生代的1/10
            在OOM时,记得Dump出堆,确保可以排查现场问题
        永久代:
            -XX:PermSize 初始空间
            -XX:MaxPermSize 最大空间
        栈的分配参数:
            -Xss128K   函数调用深度
    10.linux命令:https://blog.csdn.net/m0_38120325/article/details/85236590
    11.Sping的AOP:
        如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP;如果目标对象没有实现了接口,则采用 CGLIB 库,Spring 会自动在 JDK 动态代理和 CGLIB 动态代理之间转换。
    12.lamda:为解决匿名内部类繁杂的操作而出现的,语法有三种形式:
        (参数)->单行语句;
        (参数)->{多行语句}
        (参数)->表达式
    13.可重复键的Map-IdentityHashMap:是一致性Hash表,使用引用相等,而不是equals方法来比较两个对象的相等性.使用System.identityHashCode来确定对象的哈希值,该方法返回对象的地址;
    14.System里的方法和之外的方法的区别
        比如说数组copy或者是hashcode
    15.全角空格使用unicode编码进行替换("/u3000"),或者直接打空格替换 使用String的Trim方法是trim不掉的

你可能感兴趣的:(使用技术,个人)