代码重构

 

如下几个原则是必要的,也是今后落实代码时候要注意的:

  1. 数据类本身应该对自身的数据完整负责,加解密负责;
  2. 处理逻辑的对象尽量不要包含数据;
  3. 非数据验证的工具类抽取出来存放在单独的Utils类;
  4. 数据类的验证工具如果发现有复用,就要考虑对象是否有继承关系或者是共用一个接口,抽象出接口;
  5. 逻辑复杂的方法一定要降低复杂度,代码控制到20行以内一般就能够轻易地找出bug;
  6. 如果发现一个对象,经常是几部分数据互斥出现使用的,要考虑拆分成多个对象。

网络层级划分

OSI七层就不说了,在transportion描述的太详细了,其实可以归结为五层。

即是:

应用层(Application):Http,P2P这种,基本考虑的是字符串,内容。

运输层(Transportation):传输层用于确定应用层的消息用什么方式传输(可靠地传输或者是不可靠的传输,是否要流量限制等等)

网络层(Network):负责选择路径的层面(两个节点间会有大于等于一个的路由)

链路层(Data Link):协商每两个具体节点间的通信细节(直觉上认为是两个直达节点,没有第三个路由器之间的节点)

List的可协变性疑问(二)

昨天心有不甘,觉得Java的开发人员不可能出现这种错误的,所以又继续的看资料。

其实容器是分为元类型和和泛型(可能我扯中文太蛋疼了)。。实际意思就是对于编译器来说List<Object>和List不是一个事情,但是最终编译器会替我们将List<Type>的类型擦除,最终JVM看到的其实还是List而不是List<Object>然后做强制转换的。我们反编译一下这个java文件的class看看就清晰了。

继续阅读“List的可协变性疑问(二)”

List的可协变性疑问

package com.company;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<A> a = Arrays.asList(new A(), new B(), new C());
        for (A aa : a) {
            System.out.println(aa instanceof C);
        }
    }

}

class A {
    public A() {
        System.out.println("new A");
    }

    @Override
    public String toString() {
        return "I'm A";
    }
}

class B extends A {
    public B() {
        System.out.println("new B");
    }

    @Override
    public String toString() {
        return "I'm B";
    }
}

class C extends B {
    public C() {
        System.out.println("new C");
    }

    @Override
    public String toString() {
        return "I'm C";
    }
}

在1.8以前的版本这个代码是无法运行的,原因是List<>具有不可协变性,可是在1.8这个版本之后,这是可以运行的。而且里面的内容也的确是实例化了子类。然后我就蒙逼了。说好的Collettion的不可协变性完蛋了。。。。

如何新建一个Spring MVC+DAO层的项目(一)

如何开始:

整个项目建立好了的结构在这里可以看到:

https://github.com/michaelssss/MealControlSystem

首先这是基于IDEA的一个示例(我表示Eclipse实在不讨喜,Eclispse自己也发现这个问题已经有新的产品了)。

我们选择通过IDEA的模板新建一个Maven工程

继续阅读“如何新建一个Spring MVC+DAO层的项目(一)”

高精度加法

两数相加,保证为正整数。一定会超过long long。所以有如下程序。。。同时这也是某次面试的错。。。

思路如下:

两个字符串去做反转,然后从0为开始相加,遇到满十做进位记号。

记得为了最后有可能的进位,要将数组多申请一个位置(这里是个坑)

最后再反转数组然后转换成字符串返回即可

public static String Bigcamladd(String a, String b) {
        char[] A = new StringBuffer(a).reverse().toString().toCharArray();
        char[] B = new StringBuffer(b).reverse().toString().toCharArray();
        boolean isOver10 = false;
        int resultLength = A.length > B.length ? A.length : B.length;
        int shortOne = A.length < B.length ? A.length : B.length;
        int[] result = new int[resultLength + 1];
        for (int i = 0; i <= resultLength - 1; ) {
            if (i < shortOne) {
                int tmp = A[i] + B[i] - 2 * '0';
                if (isOver10) tmp += 1;
                if (tmp >= 10) isOver10 = true;
                else isOver10 = false;
                result[i] = tmp % 10;
            } else {
                result[i] = A.length > B.length ? A[i] - '0' : B[i] - '0';
            }
            i++;
        }
        if (isOver10) result[resultLength] = 1;
        StringBuffer buffer = new StringBuffer();
        for (int i : result) {
            buffer.append(i);
        }
        return buffer.reverse().toString();

    }

不得不再感叹一次,Java的String类真特么的好用阿。。。。

打印出字母表的所有组合每个字母至多只出现一次

这个特别容易想,就是时间上很不能接受

我们知道对于26个字母的组合,那么每个字母要么选要么不选两种情况。

所以我们用一个int[26]的数组来代表一个组合。其中的值要么是0,要么是1.

那么就有2^26种组合,我们可以用十进制来计数,然后转换成二进制即,我们遍历2^26次,将所有的数转换成二进制并存储好就得到了字母表所有的组合,所以代码如下:

 

继续阅读“打印出字母表的所有组合每个字母至多只出现一次”

找素数

筛数法。。。不要问我证明了。。。我要好好想想

 

 public static int[] findPrimenumber(int N){
      int[] primeNums = new int[N+1];
       for(int i=0;i
	

实现Split功能

好吧。。我承认我当时准备不够充分。。所以咯。在这里记录下来吧。。。

首先我们看一下Java提供Split函数是怎么用的,

Here is the syntax of this method:

public String[] split(String regex, int limit)

or

public String[] split(String regex)

Parameters:

Here is the detail of parameters:

  • regex — the delimiting regular expression.

  • limit — the result threshold which means how many strings to be returned.

Return Value:

  • It returns the array of strings computed by splitting this string around matches of the given regular expression.

 如果说,regex只是单一的符号当然容易解决了,那么考虑一下,这个符号不是单一的呢,而是char[]呢。

我们从字符匹配中借鉴思想来完成。

我们有两个字符串。

用BF的方式匹配,如果完全匹配成功则清空StringBuffer并将其放进一个ArrayList里面,否则一直匹配。

代码如下

 

继续阅读“实现Split功能”