HashMap得一点总结

HashMapp为什么在Hash的时候减1

在Java的Hashmap中有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
if ((e = first.next) != null) {
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
do {
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
return null;
}

上面有一行是 first = tab[(n - 1) & hash]) != null

HashMap为什么在传入另一个Map时加一

阅读更多

netty的一些概念

这里面的部分概念参考了《Apress JavaI.O . NIO and NIO2》

Buffer

NIO的一些操作基础就是Buffer

Channels

它的具体作用是帮助 DMA 快速的从硬盘上获取和写入数据

阅读更多

angular中使用Service

今天使用 Angular 的时候,看到书中封装了自己得一个 LoggerService ,然后自己也想尝试下,顺便也写下这个记录。

新建一个Service得ts文件

在 app 目录下建立一个 ts 文件,如下:

1
2
3
4
5
6
7
8
9
10
11
export class LoggerService{
info(msg : any) {
console.log(msg);
}
warn(msg: any){
console.warn(msg);
}
error(msg: any){
console.error(msg);
}
}

这个类就是封装了一层日志打印得函数,当然在这里也可以封装一些其他得函数。

阅读更多

在Angular中使用Bootstrap

在去年的时候短暂的接触了大概一个星期的 Angular 之后就再也没碰过了,今天突然想重新捡起 Angular 的相关知识,并且想将 Angular 结合 Bootstrap 一起使用。所以正好记录下一起结合使用的步骤。

初始化一个 Angular 的项目。初始化之后打开命令行,输入:

1
2
npm install jquery --save-dev
npm install bootstrap --save-dev

输入以上两条命令之后,在 package.json 中可以看到已经多出了 jquery 和 bootstrap 这两个库了。如下:

当初始化完成之后会在 node_modules 中出现 bootstrap 和 jquery 这两个文件夹。

阅读更多

Error是真的不可以被捕获的吗?

在刚接触Java的时候经常听到的一句话便是在 Java 中,Exception 是可以捕获的,Error 是不可以捕获的。但是在随着学习的深入,会发现有些观点需要重新认识下了。
Throwable 这个类是自 JDK1.0 开始就存在于 Java 的语言之中。

Throwable

首先引用一段 Oracle 官方文档上对 Throwable 的介绍Java8 Thrwoable的介绍

The Throwable class is the superclass of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement. Similarly, only this class or one of its subclasses can be the argument type in a catch clause. For the purposes of compile-time checking of exceptions, Throwable and any subclass of Throwable that is not also a subclass of either RuntimeException or Error are regarded as checked exceptions.
Instances of two subclasses, Error and Exception, are conventionally used to indicate that exceptional situations have occurred. Typically, these instances are freshly created in the context of the exceptional situation so as to include relevant information (such as stack trace data).
太长,省略大部分了……

简单翻译下就是,Throwable 是 Error 和 Exception 的父类,并且只能是 Error 和 Exception 的实例才可以通过 throw 语句或者 Java虚拟机 抛出异常。Exception 或者 Error 是在出错的情况下新创建的,从而将出错的信息和数据包含进去。
另外在这个文档中还提到了一点就是当低层方法向高层方法抛出异常的时候,如果抛出的异常是受检查的异常,则

阅读更多

TreeSet和TreeMap的一点总结

首先简单介绍下TreeSet和TreeMap的两种排序:

  • 自然排序
  • 通过comparator排序
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private static void compareWithCpmparator(){
    TreeSet<String> treeSet =new TreeSet<>();
    List<String> list =new ArrayList<>();
    list.add("a");
    list.add("d");
    list.add("b");
    treeSet.addAll(list);
    Iterator<String> iterator =treeSet.iterator();
    while (iterator.hasNext()){
    System.out.println(iterator.next());
    }
    Comparator<String> comparator1 = (Comparator<String>) treeSet.comparator();
    if (comparator1 == null){
    System.out.println("comparator1是空");
    }else {
    System.out.println("comparator1不是空");
    }
    }

    public static void main(String[] args) {
    compareWithCpmparator();
    }
    运行之后的结果如下:
    1
    2
    3
    4
    a
    b
    d
    comparator1是空
    这段代码里面获取的comparator是空的,Debug一遍,发现这个方法其实调用的是NavigableMap里面的comparator
    1
    2
    3
    public Comparator<? super E> comparator() {
    return m.comparator();
    }
    查看官网上对其的介绍:
    1
    2
    3
    4
    Comparator<? super K> comparator()
    Returns the comparator used to order the keys in this map, or null if this map uses the natural ordering of its keys.
    Returns:
    the comparator used to order the keys in this map, or null if this map uses the natural ordering of its keys
    在调用这个方法的时候若是自然排序,那么会返回一个null。若是通过comparator进行排序的话当前集合采用的comparator
    查看官网对reeSet的无参构造器的解释:

    /**

    • Constructs a new, empty tree set, sorted according to the
    • natural ordering of its elements. All elements inserted into
    • the set must implement the {@link Comparable} interface.
    • Furthermore, all such elements must be mutually
    • comparable: {@code e1.compareTo(e2)} must not throw a
    • {@code ClassCastException} for any elements {@code e1} and
    • {@code e2} in the set. If the user attempts to add an element
    • to the set that violates this constraint (for example, the user
    • attempts to add a string element to a set whose elements are
    • integers), the {@code add} call will throw a
    • {@code ClassCastException}.

在使用TreeSet的时候,插入的元素需要实现Comparable这个接口,而刚刚的元素是String,查看String的代码发现:

1
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

确实实现了,再测试一个没有实现的元素:

阅读更多

Spring Cloud的Zuul相关总结

Zuul是SpringCloud生态体系中的网关一环,首先简单配置如下:
开启注册中心并且配置yml文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: somersames-erueka

server:
port: 8081

eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8081/eureka/

开启用户的微服务:

1
2
3
4
5
6
7
8
9
spring:
application:
name: somersames-user
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka

编写一个测试的Controller:

阅读更多

线程的interrupt和stop区别,以及线程的中断机制

interrupt

在Java里面线程的中断是一个协作式的,也就是说线程会在自己合适的时候自己中断自己,一般来讲线程如果需要中断的话有如下两种方法:

  • 捕获InterruptException
  • 通过Thread的interrupted()或者isInterrupted()方法,但是需要注意的是interrupted会清除这个线程的状态

当一个线程调用另一个线程的interrupt的时候,另一个线程并不会马上结束,而是会设置一个中断的状态,如果一个线程处于阻塞的状态,那么此时该线程会马上抛出一个InterruptException,由上层的代码进行处理。
若线程没有处于阻塞的话,此时线程还是会执行的。但是线程需要自己在合适的地方通过上述的两个方法来判断自己是否应该中断。如果自己

stop

阅读更多

在nginx中编写rewrite

在使用Nginx做一个反向代理的时候难免会碰到一些特殊的URL,例如获取图片的URL是http://dsda/XXX.jpg,后来由于需要加一个时间戳来获取另外一张图片的话,此时的URL就为http://dsda/XXX.jpg?time=YYYY
当遇到这个情况的时候是有两种选择的,分别如下:

配置location

也就是在nginx中的server里面再加入一个匹配 ,但是这样加入的话若以后不再更改还好,一旦需求再次变更,就会导致配置许多的location。所以这种做法的话如果只是一些固定的URL还是可行的,但是若匹配一些动态的URL则不推荐。
官网的说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name example.org www.example.org;
root /data/www;

location / {
index index.html index.php;
}

location ~* \.(gif|jpg|png)$ {
expires 30d;
}
}

配置rewrite规则

阅读更多

nginx出现403的总结

今天在使用nginx的时候访问首页总是提示403forbidden,经过各种查询之后,总结为如下几种原因:

  1. 访问的资源权限不足,最好将nginx访问的资源权限修改为755或者777
  2. SeLinux的设置为true,需要将其修改为false

如果出现首页的访问资源不是指定的目录的话,可以在/etc/nginx/nginx.conf中添加一条语句root XXX,XXX代表的是资源目录。
其他的暂时没发现什么问题