0%

lambda表达式

lambda表达式出现最显著的优点就是它简化(注意不是取代)了匿名内部类。底层lambda表达式和匿名内部类并不相同,但是这里并不打算深入,而是打算简简单单只是从吃糖者的角度来看。

基础用法就是如果一个接口里面只有一个abstract函数,就可以开心使用lambda了。官方一点的说法是函数接口可以使用lambda表达式。函数接口,是指内部只有一个抽象方法的接口。

JDK8内置了一些核心的函数式接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package java.util.function;
// 下面的接口都属于这个包

@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}

@FunctionalInterface
public interface Supplier<T> {
T get();
}

@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
阅读全文 »

本篇博客主要是根据《Spring揭秘》所做的读书笔记。这一部分主要是讲述IoC和AOP的部分。

第一章

介绍了spring框架的历史和包含的东西,自己看即可。

第二章

简单介绍了一下,什么是IoC,以及几种注入的方法。

什么是IoC

IoC的功能,简单来讲就是我原先想要做一道番茄炒蛋,那么我必须去菜市场自己买来番茄和鸡蛋,然后炒着吃。但是这里就有一个问题,我必须依赖于番茄和鸡蛋,没有它们我做不了菜。而IoC的职能就是,在我开始做菜之前,它会帮我送来番茄和鸡蛋,这样我就能安心炒菜了。之后如果我要炒其他菜,我只需要通知IoC,让它为我准备好材料,而不需要自己亲自准备材料了。也就是原先我自己掌握原材料,现在是IoC来帮我管理,这里就发生了控制反转。这里的原材料,对应的就是一个个Java对象。

阅读全文 »

spring回顾

之前我们用spring,都是在beans.xml下配置好各种bean,然后在主程序里就可以使用了。

但是其实可以完全不使用配置文件,而仅仅使用配置类,直接用@Configuration注解,这样配置文件就和配置类给一一对应起来了。

beans.xml下面有各种各样的bean,对应了类中的各种各样的方法,方法需要加上@Bean标签。类型为方法返回值的类型,id默认即为方法名。

之前学习的是,你还需要到主配置文件里开启注解扫描,其实你也可以直接用AnnotationConfigApplicationContext这个类。这个类的构造函数就可以扔进去一个配置类,就相当于进行了包扫描。

一般我们在beans.xml下写的是<context:component-scan base-package="com.example"/>,当然这个也有对应的注解——@ComponentScan

阅读全文 »

前言

学完Spring和SpringMVC,直接就开始学这个框架,不多BB。

传统的SSM框架的劣势是什么?其实也不是很劣势啦,只是配置有那么一内内繁琐(其实我个人觉得真的只是一点点繁琐而已),而springboot则是大大简化了这些繁琐。

阅读全文 »

为什么握手需要三次呢?两次可不可以?四次可不可以?

被问烂的问题之一,只需要解释下每次握手,双方都获得了哪些信息即可解答。

  1. 客户端发出SYN包,服务器收到了这个SYN包。此时客户端什么都不知道,而服务器由于收到了这个包,服务器可以知道,客户端的发送能力没有问题,且服务器自己的接收能力没问题。
  2. 服务器发送ACK+SYN包给客户端,客户端收到了。那么客户端此时就知道了自己发送能力(第一个包已经被服务器收到了)和接收能力没问题,与此同时服务器的发送能力和接收能力也没问题;到这一步客户端对于自己的能力和服务器的能力都有了了解了,但是,服务器此时还不能确认。
  3. 所以客户端会发送ACK的包给服务器,服务器收到之后,就可以知道自己的发送能力和接收能力没有问题,同时客户端的发送和接收能力也有没有问题。

所以,两次是不可以的,如果两次只有客户端知道自己和服务器的的发送、接收能力没有问题,但是服务器并不知道自己的发送能力和客户端的接收能力。四次从理论上来说完全OK,但是我明明三次能解决,为什么需要四次呢?

阅读全文 »

概述

HashMap位于java.util包,完整的定义:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable ,可以看到实现了Map接口,并且继承自AbstractMap。但是你会发现AbstractMap这个类,也是实现了Map接口的,为什么呢?别怀疑,这就是一个错误。

它不是线程安全的,它的key和value都可以是null,键只能有一个null,此外它不保证顺序。

在JDK1.8之前是数组+链表的形式,1.8之后如果链表长度大于8且当前数组大于64,那么链表就会变成红黑树。注意两个条件要同时满足,因为当数组小的时候,没必要使用红黑树。

阅读全文 »

前言

作为并发编程不可或缺的一部分,线程的安全一直绕不开的一道坎,而Java语言则是使用了synchronized这一关键字来作为支持,既然能够作为关键字而不是单独的一个工具类,那就很有必要好好剖析一下它。

并发问题

首先需要明确,必须是在多线程环境下,多个线程同时需要修改相同的内容才会发生并发问题,如果大家都是读取数据那是不会有问题的,但是一旦有人写数据就会出现问题了,主要是这三种:

  • 可见性:线程A修改的数据,线程B无法马上获取到。
  • 原子性:最经典的i++问题,因为自增操作对应的指令其实是4个(其实4个也不对,最后应该落实到CPU上才对),所以不是原子操作。
  • 有序性:编译器会优化你的代码,导致实际的代码并不如你编写时的顺序(但是保证在单线程下无误)。
阅读全文 »