Golang/HelloWorld

就是简单的输出一些字符串,用以学习Go的package和实际的path的关系

package main

import (
	"fmt"
	"HelloWorld/heelo"
)

func main() {
	p()
}
func p() {
	fmt.Println("Hello", "HelloTat")
	heelo.Hehe()
}
package heelo

import "fmt"

func Hehe() {
	fmt.Println("this is Hello2")
}

 

有效交流

  • 讲真。。不想招人就不要浪费彼此时间吧;
  • 请不要做出做不到的承诺;
  • 面试官面试的内容总得像看过我的博客和github吧;
  • HR打电话前能不能提前发个邮件;
  • 面试的内容内否不包括Spring等ChangeLog;
  • 程序员的能力在于抽象问题并提供一个可能的解决方案,而不是工具或者代码的手抄员;

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

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