MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。本教程偏重实践,需要读者动手操作来理解什么是Mybatis及Mybatis的功能。
在 Java 中我们常使用 Comparable 接口来实现排序,其中 compareTo 是实现该接口方法。我们知道 compareTo 返回 0 表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道 equals 也可以判断两个对象是否相等,那么他们两者之间是否存在关联关系呢? public class Student implements Comparable<Student>{ private String id;
我们经常使用 subString 方法来对 String 对象进行分割处理,同时我们也可以使用 subList、subMap、subSet 来对 List、Map、Set 进行分割处理,但是这个分割存在某些瑕疵。一、subList 返回仅仅只是一个视图首先我们先看如下实例: public static void main(String[] args) { List<Integer> list1 = new ArrayList<Integer> ();
在实际开发过程中我们经常使用 asList 讲数组转换为 List,这个方法使用起来非常方便,但是 asList 方法存在几个缺陷:一、避免使用基本数据类型数组转换为列表使用 8 个基本类型数组转换为列表时会存在一个比较有味的缺陷。先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.
集合是我们在 Java 编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,Collection 的初始容量也显得异常重要。所以:对于已知的情景,请为集合指定初始容量。
在 JDK 的 Collection 中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。
在前面 LZ 详细介绍了 HashMap 、HashTable 、TreeMap 的实现方法,从数据结构、实现原理、源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面 LZ 就 Map 做一个简单的总结。
前面 LZ 已经充分介绍了有关于 List 接口的大部分知识,如 ArrayList、LinkedList、Vector、Stack,通过这几个知识点可以对 List 接口有了比较深的了解了。只有通过归纳总结的知识才是你的知识。所以下面 LZ 就 List 接口做一个总结。
在 Java 中 Stack 类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下:Stack 通过五个操作对 Vector 进行扩展,允许将向量视为堆栈。这个五个操作如下:操作 说明 empty() 测试堆栈是否为空。
迭代对于我们搞 Java 的来说绝对不陌生。我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代。 Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next();
在 Java提高篇(二一)—–ArrayList 、Java 提高篇(二二)—LinkedList ,详细讲解了 ArrayList、linkedList 的原理和实现过程,对于 List 接口这里还介绍一个它的实现类 Vector,Vector 类可以实现可增长的对象数组。一、Vector 简介Vector 可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用 JDK 中的 Timer 定时任务来实现。下面 LZ 就其原理、实例以及 Timer 缺陷三个方面来解析 Java Timer 定时器。一、简介在 Java 中一个完整定时任务需要由 Timer、TimerTask 两个类来配合完成。 API 中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。
与 HashSet 是基于 HashMap 实现一样,TreeSet 同样是基于 TreeMap 实现的。在《Java 提高篇(二七)—–TreeMap》中 LZ 详细讲解了 TreeMap 实现机制,如果客官详情看了这篇博文或者多 TreeMap 有比较详细的了解,那么 TreeSet 的实现对您是喝口水那么简单。
TreeMap 的实现是红黑树算法的实现,所以要了解 TreeMap 就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析 TreeMap 的实现,但是为了与 Java 提高篇系列博文保持一致还是叫做 TreeMap 比较好。通过这篇博文你可以获得如下知识点:1、红黑树的基本概念。2、红黑树增加节点、删除节点的实现过程。3、红黑树左旋转、右旋转的复杂过程。
在前面三篇博文中 LZ 讲解了(HashMap、HashSet、HashTable),在其中 LZ 不断地讲解他们的 put 和 get 方法,在这两个方法中计算 key 的 hashCode 应该是最重要也是最精华的部分,所以下面 LZ 揭开 hashCode 的“神秘”面纱。hashCode 的作用要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。
在 Java 中与有两个类都提供了一个多种用途的 hashTable 机制,他们都可以将可以 key 和 value 结合起来构成键值对通过 put(key,value)方法保存起来,然后通过 get(key) 方法获取相对应的 value 值。一个是前面提到的 HashMap,还有一个就是马上要讲解的 HashTable。
在前篇博文中(Java 提高篇(二三)—–HashMap)详细讲解了 HashMap 的实现过程,对于 HashSet 而言,它是基于 HashMap 来实现的,底层采用 HashMap 来保存元素。所以如果对 HashMap 比较熟悉,那么 HashSet是 so easy!!一、定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.
HashMap 也是我们使用非常多的 Collection,它是基于哈希表的 Map 接口的实现,以 key-value 的形式存在。在 HashMap 中,key-value 总是会当做一个整体来处理,系统会根据 hash 算法来来计算 key-value 的存储位置,我们总是可以通过 key 快速地存、取 value。下面就来分析 HashMap 的存取。一、定义HashMap 实现了 Map 接口,继承 AbstractMap。
一、概述LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现。基于链表实现的方式使得 LinkedList 在插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 逊色些。LinkedList 实现所有可选的列表操作,并允许所有的元素包括 null。
一、ArrayList 概述ArrayList 是实现 List 接口的动态数组,所谓动态就是它的大小是可变的。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。默认初始容量为 10。
关注时代Java