lambda表达式
lambda表达式出现最显著的优点就是它简化(注意不是取代)了匿名内部类。底层lambda表达式和匿名内部类并不相同,但是这里并不打算深入,而是打算简简单单只是从吃糖者的角度来看。
基础用法就是如果一个接口里面只有一个abstract函数,就可以开心使用lambda了。官方一点的说法是函数接口可以使用lambda表达式。函数接口,是指内部只有一个抽象方法的接口。
JDK8内置了一些核心的函数式接口。
1 | package java.util.function; |
lambda表达式出现最显著的优点就是它简化(注意不是取代)了匿名内部类。底层lambda表达式和匿名内部类并不相同,但是这里并不打算深入,而是打算简简单单只是从吃糖者的角度来看。
基础用法就是如果一个接口里面只有一个abstract函数,就可以开心使用lambda了。官方一点的说法是函数接口可以使用lambda表达式。函数接口,是指内部只有一个抽象方法的接口。
JDK8内置了一些核心的函数式接口。
1 | package java.util.function; |
本篇博客主要是根据《Spring揭秘》所做的读书笔记。这一部分主要是讲述IoC和AOP的部分。
介绍了spring框架的历史和包含的东西,自己看即可。
简单介绍了一下,什么是IoC,以及几种注入的方法。
IoC的功能,简单来讲就是我原先想要做一道番茄炒蛋,那么我必须去菜市场自己买来番茄和鸡蛋,然后炒着吃。但是这里就有一个问题,我必须依赖于番茄和鸡蛋,没有它们我做不了菜。而IoC的职能就是,在我开始做菜之前,它会帮我送来番茄和鸡蛋,这样我就能安心炒菜了。之后如果我要炒其他菜,我只需要通知IoC,让它为我准备好材料,而不需要自己亲自准备材料了。也就是原先我自己掌握原材料,现在是IoC来帮我管理,这里就发生了控制反转。这里的原材料,对应的就是一个个Java对象。
之前我们用spring,都是在beans.xml下配置好各种bean,然后在主程序里就可以使用了。
但是其实可以完全不使用配置文件,而仅仅使用配置类,直接用@Configuration注解,这样配置文件就和配置类给一一对应起来了。
beans.xml下面有各种各样的bean,对应了类中的各种各样的方法,方法需要加上@Bean标签。类型为方法返回值的类型,id默认即为方法名。
之前学习的是,你还需要到主配置文件里开启注解扫描,其实你也可以直接用AnnotationConfigApplicationContext这个类。这个类的构造函数就可以扔进去一个配置类,就相当于进行了包扫描。
一般我们在beans.xml下写的是<context:component-scan base-package="com.example"/>,当然这个也有对应的注解——@ComponentScan。
被问烂的问题之一,只需要解释下每次握手,双方都获得了哪些信息即可解答。
所以,两次是不可以的,如果两次只有客户端知道自己和服务器的的发送、接收能力没有问题,但是服务器并不知道自己的发送能力和客户端的接收能力。四次从理论上来说完全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这一关键字来作为支持,既然能够作为关键字而不是单独的一个工具类,那就很有必要好好剖析一下它。
首先需要明确,必须是在多线程环境下,多个线程同时需要修改相同的内容才会发生并发问题,如果大家都是读取数据那是不会有问题的,但是一旦有人写数据就会出现问题了,主要是这三种: