Sort

基本的冒泡(O(n^2)):

public static void bubbleSort(int[] arrays, int begin, int end)
    {
        assert arrays != null;
        for (int i = begin; i < end; i++)
        {
            for (int j = begin; j < end; j++)
            {
                if (arrays[i] > arrays[j])
                {
                    swap(arrays, i, j);
                }
            }
        }
    }

    private static void swap(int[] arrays, int a, int b)
    {
        int t = arrays[a];
        arrays[a] = arrays[b];
        arrays[b] = t;
    }

继续阅读“Sort”

Java NIO

什么是NIO

new IO 或者none block IO

什么是通道(Channel)

一个对可以实现IO操作的抽象,任何类实现了channel,则表明可以往通道存放一些byte,然后不需要再去操心如何去实现。

几种通道的介绍

  1. ByteChannel(声明了这个Channel可以处理的是byte)
  2. ReadableByteChannel(声明了这是个只读的Channel)
  3. WriteableByteChannel(名字如其意义)
  4. SeekableByteChannel
  5. etc

视图

事实上channel也不是直接操作byte[],而是操作其中的包装对象xxxBuffer。当然多数情况下我们连byteBuffer都懒得操纵,我们对ByteBuffer也做了装扮(decorate),使之变成了ByteBuffer的一个View,我们称xxxx是xxx的视图(view),实质上是表明,底层一样,但是对外的语义变换了。

视图带来了好处就是能够以我们熟悉的语义来操纵对象,而避免脑中还要顺便转换成相应的byte[]结构。

结论

NIO带来了新的对IO操作的抽象,但是也仅仅是模型变换,除此之外,更多的非模型上而是工程上实际问题带来了改进,比如非阻塞式的访问(其实Stream模型也可以做到非阻塞式访问,只不过要根据这个模型来重新实现),还有Network到Network的转发可以不经过用户态而直接在内核态的进行转发避免上下文切换带来的CPU和内存带宽的消耗,等其他可能我还没了解到的特性

Java中的锁

java.util.concurrent.locks.ReentrantLock

提供了比synchronized提供更灵活的锁,可以设置为公平锁,非公平锁,能够带超时时间获取公平锁等等。
synchronized

Java默认提供,由JVM提供。但是因为JVM的黑盒子特性,锁特性会在运行中发生变化。

具体可以翻阅一下这篇文章

synchronized、锁、多线程同步的原理是咋样的

两种锁的性能测试结果

Java的优雅退出

简单而言就是JVM提供了一个钩子,能在JVM接受到关闭的信号量时候start一个线程,然后做一些清理工作,避免产生脏数据

        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run()
            {
                scheduledExecutorService.shutdown();
            }
        });

 

字符串左移N位

第一种,简洁算法

根据矩阵运算中的\left(AB\right)^{\mathrm {T} }=B^{\mathrm {T} }A^{\mathrm {T} }可得

package com.liangyumingblog;

public class RollUpString
{
    private String string;

    public RollUpString(String s)
    {
        this.string = s;
    }

    public String rollup(int n)
    {
        StringBuilder s1 = new StringBuilder(string.substring(0, n));
        StringBuilder s2 = new StringBuilder(string.substring(n + 1));
        return s1.reverse().append(s2.reverse().toString()).reverse().toString();
    }
}

继续阅读“字符串左移N位”

Spring解析xml

ApplicationContext:

这是一个标准的Spring程序的入口,用来加载上下文其实现类是:AbstractApplicationContext:

这里实现了对Spring上下文的生命周期的管理

AbstractXmlApplicationContext

解析xml使之成为Spring的上下文

ClassPathXmlApplicationContext,FileSystemXmlApplicationContext

寻找到具体的xml所在的磁盘或者classpath所在的位置

几个基本单位

1 byte=8bit

1 int=4 byte

1 long =8 byte

1 short=2 byte

1 float=2 byte

1 double = 8 byte

= =其实我想吐槽的是。。我压根分不清他们翻译成中文之后的关系。。。神特么非要推广专有名词的中文化

分布式系统CAP原理

  • 一致性(Consistency):

    分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

  • 可用性(Availability)

    集群出现故障节点后,是否还能响应客户端的读写请求。(对数据更新具备高可用性)

  • 分区容忍性(Partition tolerance)

    实际中通信产生延时。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C点和A点之间做出选择。