Sayi
Sayi
List是一个有序的序列结构,基于 **位置访问** ,List接口在Collection接口上新增加了一些方法,允许在指定位置插入和删除元素,也允许对元素的搜索(indexOf)。List是如何实现Iterator迭代器,ArrayList 和 LinkedList的性能差异为何会表现在不同方面,本文将对ArrayList进行详细分析。 ## List接口 我们先来看看List接口,提供了基于位置访问的一些方法。 | 方法 | 作用 | | --- | --- | |E get(int index)|从某个位置获取元素| |E set(int index, E element)|某个位置设置元素| |void add(int index, E...
在编程实践中,容器类库对于面向对象语言来说是最重要的类库,Java Collections Framework是Java设计者提供的容器集合,通过使用这些容器,无须费力就可以完成大量有趣的工作。 > 某些时候,你必须更多的了解容器以便正确的使用它们。你必须对散列操作有足够的了解,从而能够编写自己的hashcode方法(并且你必需知道何时该这么做),你还必须对不同容器的实现有足够的了解,这样才能够为你的需要进行恰当的选择。--节选自Java编程思想》 本系列文章将对Java Collections Framework的一些核心数据结构API进行介绍,并从源码角度分析其实现原理,文章中将更多的探讨为什么这样设计以及性能的分析和优化。 本文对Collections API一些通用概念和设计作一个概览。 ## 类图  从类图中可以看出,Java容器核心接口是Collection和Map。Collection是一个通用接口,定义了一些数据的集合,Map是个Key-Value映射集合 * List表示一个线性(有顺序)的表结构,可以拥有重复元素 * Queue表示一个队列,FIFO方式 * Deque表示一个双向队列,同时支持FIFO方式或者LIFO,它集成Queue接口,即实现了队列,又实现了栈 * Set表示一个数据集合,不允许拥有重复的元素 针对Set和Map还有两个支持排序的接口: * SortedSet表示一个排序的Set * SortedMap表示一个排序的Map > **设计问题:为什么Map要独立于Collection接口?** 我想Java的设计者肯定也考虑过让Map继承于Collection接口,比如Collection的元素是EntrySet来满足Map的实现。但是,Map的意义不应该只是一些数据的集合,更应该是键值对映射,它和Collection的结构和用法上有不一样的地方,所以为了更清晰的定义Ma这样的数据结构,分离了Map接口,同时提供了方法entrySet()将Map转化为Collection。...
AOP是依赖注入框架的一个完善,本文将会对Spring和Guice的AOP部分进行详细分析。 ## Spring AOP 我们直接看看AOP的使用示例。 1. 写一个服务接口和实现 ```java public interface PersonService { String get(); } public class PersonServiceImpl implements PersonService { @Log @Override public String get() { System.out.println("execute get method");...
## 什么是AOP AOP全称为Aspect Oriented Programming。 AOP的关注点是在切面,它的核心单元是Aspect,面向对象编程中核心单元是类Class。 AOP为我们从切面角度去解决一类问题,比如数据库事务、日志、安全性等。 ## AOP Alliance Java许多通用技术都有一套规范,AOP也不例外。[AOP Alliance](http://aopalliance.sourceforge.net/)定义了一组AOP技术的基础API,所有实现AOP功能的框架都应该遵守这个约定。 org.aopalliance.aop包定义了一个最通用的接口Advice,拦截器都集成于它。 ```java package org.aopalliance.aop; public interface Advice { } ``` org.aopalliance.intercept包定义了拦截机制所需要的一些列接口,主要分为两类,一类是拦截器Interceptor,一类是连接点Joinpoint,下表是官方的javadoc: 拦截器接口 | 功能 -- | -- Interceptor...
Guice开发者说过,如果没有Spring,Guice可能根本不会出现,或者不会这么早出现。Guice源自于Google的一个项目AdWords,当他们坐下来去思考自己到底想要如何构造这个项目的时候,guice给了他们答案。 相比于Spring这个全面的解决方案栈,Guice则专注于依赖注入,全文搜索引擎elasticsearch使用Guice作为依赖注入组件。 ## 简单示例 Guice是一个轻量级的DI框架,我们先从一个简单的里子开始。 1. 我们先写一个接口和实现类 ```java public interface AccountService { String get(); } public class AccountServiceImpl implements AccountService { final UserService userService; @Inject public AccountServiceImpl( UserService userService) {...
Spring核心功能之一是IOC容器,Spring凭借优雅的扩展性和强大的配置功能,几乎已经让它成为服务端IOC的标杆。也正因为Spring,才有了Guice等后起之秀。 ## IOC 容器 我们先从一个简单的例子开始,了解一下Spring IOC容器的用法,更多的用法可以参见Spring官方文档。 1. 写一个服务接口 ```java package com.deepoove.diexample.service; public interface AccountService { String get(); } ``` 2. 实现这个接口 ```java package com.deepoove.diexample.service; public class AccountServiceImpl implements AccountService {...
无论你对依赖注入这个概念是否了解,你或许早就驾轻就熟了。甚至当你在一个复杂项目中,因为没有使用依赖注入而感到烦劳(在我第一个Android项目中,因为没有使用依赖注入而感到彷徨无助)。 依赖注入并不是一门新的技术,也不是为了解决一个新的课题诞生的,它是一种模式,它告诉我们如何优雅的**创建对象以及对象的依赖**,姑且把这种模式想象成一个新的new操作符吧。 > Think of Dependency Injection as the new new. 本系列文章分为三篇: * 第一篇介绍下依赖注入的背景以及规范,手动写一个实验性质的DI框架 * 第二篇对Spring DI进行深度分析。 * 第三篇对Guice DI进行深度分析。 ## 为什么需要依赖注入 Java为我们提供了new操作符来创建对象。我们的代码可能看起来是这样的: ```java class Stopwatch { final TimeSource timeSource;...
> **我喜欢简单,什么是简单?正如若干字符组成的命令行。** 有时候我们用Java开发了一个小工具,希望通过命令行(CLI)或者图形界面直接调用。命令行相较于图形界面,实现迅速,交互更接近于程序员人群,本文主要介绍Java在命令行交互上的应用,我们不妨先看看命令行的两种风格: * POSIX风格 `tar -zxvf foo.tar.gz` * Java风格 `java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo` ## JCommander介绍 > [JCommander](http://jcommander.org)是Java解析命令行参数的工具,作者是[cbeust](https://github.com/cbeust),他的开源测试框架testNG相信很多程序员都有耳闻。 根据官方文档,我简单总结了JCommander的几个特点: * 注解驱动 它的核心功能**命令行参数定义**是基于注解的,这也是我选择用它的主要原因。我们可以轻松做到命令行参数与属性的映射,属性除了是String类型,还可以是Integer、boolean,甚至是File、集合类型。 * 功能丰富 它同时支持文章开头的两种命令行风格,并且提供了输出帮助文档的能力(`usage()`),还提供了国际化的支持。 * 高度扩展 下文会详述。 在看具体应用示例前,我们先读懂核心注解`@Parameter`的源码(你大可以跳过下面这段长长的源码,直接看示例),以此来了解它向我们展示了哪些方面的能力: ```java...
> RPC(Remote Procedure Call)远程过程调用,也可以称作RMI(Remote Method Invoker),是一种client-server的形式,即一台机器调用远程机器的方法,就像执行本地方法一样。目前的远程技术有: > * Facebook开源的thrift > * Spring’s HTTP invoker > * Hessian > * JDK RMI > * WebServices > * ... 本文以一个极简的RPC实现和Spring’s HTTP invoker开始,对RPC的基本原理进行介绍,并进一步分析Hessian的的设计。...
> Java将源码编译成面向虚拟机的字节码(ByteCode),这种程序存储格式可以实现在不同平台,不同虚拟机下运行。[Oracle JVM specification](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) 本文将对字节码作一个简单的介绍,列举一些字节码操纵工具。 ## ByteCode字节码 一个class文件的结构如下: ``` ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2...