ArrayList源码分析 ArrayList简介 我们知道,ArrayList是基于数组实现的List类,完全支持List接口的全部功能,底层实质上就是一个Object[]数组。从源码注释的第一行“Resizable-array implementation of the List interface”中,可以看出ArrayList是List接口的可变长数组实现,即这是一个动态数组,与普通的数组相比,它可以实现容量的动态增长。至于其他的特征,我们可以从类的定义中得到: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 这是ArrayList的类结构层次图: 由以上信息,我们可以知道: ArrayList:表明ArrayList支持泛型 exten 继续阅读 >>


贺含悦 18/06/29 18:06:53
Java泛型是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 即其本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。 泛型带来了哪些好处? 在没有泛型之前,当我们将一个对象放进集合中,集合会立刻忘记该对象的类型,它会把所有对象都当作Object类型来处理。所以从集合中取出对象的时候,我们通常需要进行强制类型转换,这种做法不仅造成代码的臃肿,而且容易引起异常。 在增加了泛型支持后: 集合可以记住元素的类型,并且在编译的时候检查元素类型,避免引起ClassCastException异常。将运行时的异常提前至了编译时。 所有的强制转换都是自动和隐式的,提高代码的重用率。 使代码更加简洁,程序更加健壮。 定义泛型 Java在接口、类或类的方法的声明中,声明一个泛型。多个参数时要用逗 继续阅读 >>


贺含悦 18/06/12 19:59:00
Lambda表达式是什么? Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”。 Lambda表达式是Java8的重要更新,它支持将代码块作为方法参数,允许使用更简洁的代码来创建只有一个抽象方法的接口,这种接口称为函数式接口。 一起来使用Lambda表达式吧 首先,我们先看一个关于匿名内部类的程序~ interface Command { void process(int[] target); } class ProcessArray { public void process(int[] target, Command cmd) { 继续阅读 >>


贺含悦 18/06/09 18:42:08
什么是内部类? 通俗的讲,就是把一个类放在另一个类的内部定义,这个定义在其他类内部的类就叫做内部类,这个包含内部类的类就叫做外部类。即内部类是依附于外部类而存在的。 使用内部类有什么好处呢? 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,所以就不允许同一个包中的其他类访问该类。 内部类成员可以直接访问外部类的私有数据,其实就是把内部类也当成一个外部类的成员,同一个类的成员之间自然可以互相访问。 使用匿名内部类创建那些仅需要一次使用的类会更方便,无需再去专门定义那些类。 内部类和外部类有什么区别? 内部类要定义在其他类里面。 内部类比外部类可以多使用三个修饰符:private、protected、static,外部类只能是public或默认包访问权限。 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。 非静态内部类不能拥有静态成员。 内部类主要分为哪几类? 非静态内部类(也有称作成员内部类) 静态内部 继续阅读 >>


贺含悦 18/06/07 18:26:18
MVC是什么? 在讲SpringMVC之前我们先来看一下什么是MVC模式~ MVC:MVC是一种设计模式 MVC的原理图: 分析: M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity) V-View 视图(做界面的展示:jsp,html……) C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面) Spring MVC是什么?   SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,SpringMVC就相当于是Struts2加上Spring的整合,但是这里有一个疑惑就是,SpringMVC和Spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是Spring的一个模块(类似AOP,IOC这样的 继续阅读 >>


贺含悦 18/05/07 22:08:20
在软件开发中,散布于应用中多处的功能被称为横切关注点。通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点与业务逻辑相分离正是面向切面编程所要解决的问题。 前面我们介绍了如何使用依赖注入管理和配置我们的应用对象。依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。 下面我们就来看Spring是如何实现切面的,先从AOP的基础知识开始~ 一、什么是面向切面编程? 在之前的Java开发中,如果要重用通用功能,最常见的面向对象技术是继承或委托。但是,如果整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系,而使用委托可能需要对委托对象进行复杂的调用。 现在,切面提供了取代继承和委托的另一种可选方案,而且在很多场景下更清晰简洁。在使用面向切面编程时,我们仍然在一个地方定义通用功能,但是可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类。 横切关注点可以被模块化为特殊的类,这些类被称为切面。 定义A 继续阅读 >>


贺含悦 18/05/07 22:08:04
我们通常讨论依赖注入的时候,讲的都是将一个Bean引入到另一个Bean的属性或构造器参数中,它通常指的是将一个对象与另一个对象进行关联。而装配Bean的另一个方面指的是将一个值注入到Bean的属性或构造器中,也就是字面量的注入。 比如,将专辑的名字装配到TaylorSwift Bean的构造器或title属性中: @Bean public CompactDisc taylorSwift() { return new TaylorSwift("titledemo","artistdemo"); } 这实现了我们为BlankDisc Bean设置title和artist的需求,但它在实现的时候是将值硬编码在配置类中的,同理XML也是。但有时候我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。 为了实现,Spring提供了两种在运行时求值的方式: 属性占位符 Spring表达式语言(spEL) 使用属性占位符注入外部的值 处理外部值的最简单方式就是声明属性源并通过 继续阅读 >>


贺含悦 18/05/07 22:07:50
在上一篇博客中我们看到了最为核心的Bean装配技术。但是,Bean装配所涉及的领域并不仅仅局限于那些,Spring还提供了多种技巧,借助它们可以实现更为高级的Bean装配功能。 环境与profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁移到另一个环境。在开发阶段中,某些环境相关做法可能并不适合迁移到生产环境中,甚至即便迁移过去也无法工作。数据库配置、加密算法以及与外部系统的集成是跨环境部署时会发生变化的几个典型例子。 有时候在不同的环境中某个Bean也会有所不同,我们必须要有一种方法使其在每种环境下都会选择最合适的配置。 其中一种方式就是在单独的配置类(或XML文件)中配置每个Bean,然后在构建阶段确定要将哪一个配置编译到可部署的应用中。 在JavaConfig中配置Profile Bean 面对不同环境有不同方法生成不同版本的Bean,Spring提供了一种策略,就是在运行时确定创建哪个版本的Bean。这样的结果就是同一个部署单元(可能会是WAR文件)能够 继续阅读 >>


贺含悦 18/05/07 22:07:31
在典型的Spring应用中,我们可能会同时使用自动化和显式配置。就产生了混合配置,即可以在JavaConfig中引入XML配置,也可以在XML配置中引用JavaConfig。 在JavaConfig中引用XML配置 之前我们在JavaConfig配置中写过一个CDPlayerConfig: 2.27:CDPlayerConfig @Configuration public class CDPlayerConfig { @Bean public CompactDisc taylorSwift(){ return new TaylorSwift(); } @Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } } 在上面地代码中,我们将CompactDisc Bean和CDPla 继续阅读 >>


贺含悦 18/05/07 22:07:10
装配是什么? 创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI的本质。 我们必须要告诉Spring要创建哪些bean并且如何将其装配在一起。 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装配 Spring的配置风格是可以互相搭配的,但应尽可能地使用自动配置的机制,因其使用起来要方便的多,显式配置越少越好。显式配置越少,代码就越容易维护。而基于Java和XML相比,JavaConfig的安全性比XML要好,并且功能更强大。 所以我们先来看Spring的自动化配置。 自动化装配Bean——便利 Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的Bean。 自动装配 (autowiring):Spring自动满足Bean之间的依赖。 组件扫描和自动装配组合在一起就能使我们的显式配置降低到最少。 为了 继续阅读 >>


贺含悦 18/05/07 22:06:34