05 2016 档案
摘要:前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读写操作,相信大家都比较熟悉,使用apache的POI库即可。本篇文章,我将基于iText库编写各式各
阅读全文
摘要:什么是内部接口 内部接口也称为嵌套接口,即在一个接口内部定义另一个接口。举个例子,Entry接口定义在Map接口里面,如下代码: 为什么要使用内部接口 如下是一些强有力的理由: 一种对那些在同一个地方使用的接口进行逻辑上分组; 封装思想的体现; 嵌套接口可以增强代码的易读性和可维护性; 在Java标
阅读全文
摘要:面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? 本篇文章将解释一个常见的面试题,该问题被谷歌和很多其它公司问起过。它涉及的相对比较初级,而不是关于怎样去设计复杂的并发程序。 首先,这个问题的答案是No,因为counter++操作不是一个原子操作,而是由多个原子操作组成。 举个例子,
阅读全文
摘要:这个列表总结了10个Java开发人员最常犯的错误。 Array转ArrayList 当需要把Array转成ArrayList的时候,开发人员经常这样做: Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.u
阅读全文
摘要:Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用。类型擦除是泛型中最让人困惑的部分,本篇文章将阐明什么是类型擦除,以及如何使用它。 一个常见错误 以上代码看起来是没问题的,因为String是Object的子类。然而,这并不会工作,编译不会通
阅读全文
摘要:以下是12个关于Java数组最常用的方法,它们是stackoverflow得票最高的问题。 声明一个数组 打印一个数组 根据数组创建ArrayList 判断数组内部是否包含某个值 连接两个数组 声明一个内联数组(array inline) 根据分隔符拼接数组元素(去掉最后一个分隔符) ArrayLi
阅读全文
摘要:在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的。 执行顺序 查看下面的代码,你知道哪个先执行吗? 结果输出; 实例初始化块是如何工作的 上面的实例初始化块包含了一个打印语句。为了理解它是如何工作的,我们可以将它看成一
阅读全文
摘要:Map是一个重要的数据结构,本篇文章将介绍如何使用不同的Map,如HashMap,TreeMap,HashTable和LinkedHashMap。 Map概览 Java中有四种常见的Map实现,HashMap,TreeMap,HashTable和LinkedHashMap,我们可以使用一句话来描述各
阅读全文
摘要:译文链接 http://www.programcreek.com/2014/01/java-varargs-examples/ 什么是Java可变参数 可变参数是Java 1.5引入的一个特性,它允许一个方法接受任意数量的参数。 可变参数是如何工作的 当使用可变参数的时候,会先创建一个数组,其数组长
阅读全文
摘要:List概览 List,正如它的名字,表明其是有顺序的。当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一;下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整体架构; ArrayList vs LinkedList vs Vector 从上面的类层次结构图中
阅读全文
摘要:前言 在Java中,字符串是一个不可变的类,一个不可变的类指的是它的实例对象不能被修改,所有关于这个对象的信息在这个对象被创建时已初始化且不能被改变。 不可变类有很多优势,这篇文章总结了字符串类之所以被设计成不可变类的原因,涉及内存模型,线程同步,数据结构等知识。 字符串常量池的需求 字符串常量池是
阅读全文
摘要:这是一个展示如何使用join()方法的例子。 问题: 使用Java多线程计算表达式1*2/(1+2)的值。 解决方案: 使用一个线程做加法运算,另一个线程做乘法运算,还有一个主线程main做除法运算。由于线程之间不需要通讯,所以我们只需要考虑线程的执行顺序。 在main线程中,我们让加法运算线程和乘
阅读全文
摘要:以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程; 动态类型检查:在程序运行期间验证类型安全的过程; Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。 以下代码是一个例子,理解了他
阅读全文
摘要:什么是Java别名(aliasing) 别名意味着有多个别名指向同一个位置,且这些别名有不同的类型。 在下面的代码例子中,a和b是两个不同的名字,有不同的类型A和B,B继承A 在内存中,它们指向了同一个位置,如下: 内存中的该位置同时被a和b指向,在运行期间,方法的调用由实际存储的对象来决定。 Ja
阅读全文
摘要:下面是Java中10个最常见的关于字符串的问题。 怎样比较字符串?使用==还是equals() 简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等。除非你要比较两个字符串是否是同一个对象,否则你应该使用equals()方法。如果你知道字符串驻留的概念会更好。 对于敏感信息优先
阅读全文
摘要:对于每个Java程序员来说,HelloWorld是一个再熟悉不过的程序。它很简单,但是这段简单的代码能指引我们去深入理解一些复杂的概念。这篇文章,我将探索我们能从这段简单的代码中学到什么。如果你对HelloWorld有独到的理解,请留下你的评论。 HelloWorld.java 为什么所有东西都是从
阅读全文
摘要:如下代码是一个Java小程序,用于往文件写入数据。每次运行该程序,一个新的文件被创建,之前旧的文件被删除;这与往文件追加内容是有区别的。 这个例子使用了FileOutputStream,除了该类你还可以使用FileWriter或者PrintWriter,对于文本操作,通常是足够的; 使用FileWr
阅读全文
摘要:使用Set集合的主要原因是因为Set集合里面没有重复的元素。Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet。什么时候,选择哪一个使用非常重要。简单的说,如果你关注性能,应该使用HashSet;如果你需要一个有序的Set集合,应该使用TreeSet;如果你需要
阅读全文
摘要:当我们使用Java往文件写入数据的时候,我们有两种方式,使用FileOutputStream或FileWriter。 FileOutputStream: FileWriter: 以上两种方式都可以正常运行,但是它们究竟有何区别呢? 关于以上这两个类,有太多需要讨论,它们都很好的实现了常见操作系统的文
阅读全文
摘要:这是Java中一个很经典的问题,在stack-overflow上有很多类似的问题,然而很多回答都是错的或者回答不完整;如果你不深入思考的话,会认为这个问题很简单,但是当你深入下去,会发现这个问题很容易让人产生困惑。 一段有趣且让人困惑的代码 结果打印: C++版本如下: 打印结果: 常见有误的理解
阅读全文
摘要:下面是一个很简单的例子,关于Java中的多态:方法重载和方法覆盖; 多态指的是方法在不同的时刻表现出不同的形式;在编译期间,这被叫做方法重载;方法重载允许相关的方法被同一个方法名字调用,这有时候被叫做ad-hoc polymorphism; 那么对于编译器来说,如何生成方法代码以便能被正确调用呢?
阅读全文
摘要:当需要对元素进行计数时,HashMap非常有用,如下例子,统计一个字符串中每个字符出现的次数: 输出结果: HashMap遍历 打印HashMap的元素 根据键值对的value排序 以下代码往TreeMap的构造函数传入一个比较器,来对map进行排序: 虽然有很多种方法来对HashMap进行排序,但
阅读全文
摘要:Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现。 本篇文章将介绍什么是内存泄露,为什么会发生,以及怎样阻止内存泄露。 什么是内存泄露 内存泄露的定义:对于
阅读全文
摘要:Java中有两种类型的数组: 基本数据类型数组; 对象数组; 当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说也是一样的,因为数组也是一个对象; 一维数组 在以上代码中,arr变量存放了数组对象的引用;如果你创建了空间大小为10的整形数组,情况是一样的,一
阅读全文
摘要:在Java的基类java.lang.Object中有两个非常重要的方法: 对这两个方法的理解非常重要,特别是当用户自己定义对象,并将其存入到Map中的时候; 然而,即便是高级开发人员,有时候也搞不清楚如何正确的使用它们; 在这篇文章,我首先会展示一种常见的错误示例,然后解释如何正确的使用这两个方法;
阅读全文
摘要:一般来说,Map是一种由键值对组成的数据结构,其中键(key)在Map中是不能重复的; 本篇文章总结了9个最常见的问题(关于Java Map及其实现类); 出于简单考虑,在代码例子中我将不使用泛型,因此,我将仅仅写上Map而不是写上Map<K, V>,且Map中的Key和Value都是可以比较的,意
阅读全文
摘要:Collection和Collections的区别 首先要说的是,"Collection" 和 "Collections"是两个不同的概念; 如下图所示,"Collection"是集合类(Collection)的顶级接口,然而”Collections“是一个提供了一系列静态方法的集合工具类; Col
阅读全文
摘要:Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限); 对于类成员来说,访问权限控制修饰符可以是public,protected, package private(无修饰符), or priva
阅读全文
摘要:前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合; 下面是若干个关于枚举的例子,可以帮助我们更好的使用枚举类型; 一个简单的例子 结果输出: 调用构
阅读全文
摘要:本篇文章总结了一些关于Java构造方法的常见问题。 为什么创建了一个子类对象会调用其父类的构造方法 如下代码示例: 结果打印: 当一个类继承了某个类时,在子类的构造方法里,super()必须先被调用;如果你没有写,编译器会自动调用super()方法,即调用了父类的构造方法; 这并不是创建了两个对象,
阅读全文
摘要:本篇文章将展示一个基本的面向对象概念-属性隐藏。 Java中的成员属性能被重写吗? 让我们先看以下代码示例,创建了两个Sub对象,并将其引用分别赋给SUb类和其父类Super; 运行程序,输出结果如下: 为什么创建了两个Sub对象,第二个却输出了”Super“; 隐藏属性而不是重写它们 先看一下属性
阅读全文
摘要:这篇文章总结了十个经常被问到的JAVA异常问题; 1.检查型异常VS非检查型异常 简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理; 非检查型异常指那些不能解决的异常,如除0,空指针等; 检查型异常非常重要,因为你希望使用你API接口的人知道如何处理这些异常;
阅读全文
摘要:前言 怎样判断一个无序数组是否包含某个特定值呢? 这在JAVA中是一个非常实用的操作,在Stack Overflow问答网站中也同样是一个热门问题; 要完成这个判断,可以通过若干种不同的方式来实现,每种实现方式对应的时间复杂读有很大的不同; 接下来,我将展示四种不同的实现方式,以及这四种方式对应的时
阅读全文
摘要:环境准备 Eclipse上新建一个简单的maven工程,Artifact Id选择maven-archetype-quickstart; 添加spring-context依赖; resources目录下添加spring的配置文件spring.xml; 开始编写bean及测试代码; Bean的创建方式
阅读全文
