自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 IOC的两种实现方式

IOC的两种实现方式构造方法注入setter注入Ioc需要实现两个技术: - 对象的构建 - 对象的绑定spring提供了两种类型的容器,一个是BeanFactory,一个是ApplicationContext(可以认为是BeanFactory的扩展),下面我们将介绍这两种容器如何实现对对象的管理。BeanFactory如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当

2017-06-06 15:01:47 7508 1

原创 原子变量和原子操作

原子变量和原子操作通常情况下,在Java里面,++i或者–i不是线程安全的,这里面有三个独立的操作:获得变量当前值,为该值+1/-1,然后写回新的值。在没有额外资源可以利用的情况下,只能使用加锁才能保证读-改-写这三个操作是“原子性”的。Java 5新增了AtomicInteger类,该类包含方法getAndIncrement()以及getAndDecrement(),这两个方法实现了原子加以及原子

2017-06-04 19:47:31 1732

原创 java线程池常见问题

java线程池常见问题常见的四种java线程池Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线

2017-06-04 19:46:59 1001

原创 从HashMap到ConcurrentHashMap

从HashMap到ConcurrentHashMapjdk1.8的HashMapJava为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但

2017-06-04 19:46:21 627

原创 java应用基础

2 java应用基础位运算>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。一个数字位运算,每左移n为等于这个数乘以2的n次方,每右移n为就等于这个数除以2的n次方,而这个算法非常快。使用BigDecimal构造更精确的浮点数BigDecimal money1 = new BigDecim

2017-06-04 19:44:57 271

原创 排序相关算法

Sortbubble sortpublic static void bubbleSort(int[] list){ int i,j; for(i=0;i<list.length-1;i++){ for(j=list.length-2;j>=i;j--){ if(list[j]>list[j+1]) swap(li

2017-06-04 19:44:10 244

原创 二叉树相关算法

二叉树Path Sum判断二叉树是否有一条path,路径和等于sum递归遍历二叉树,每到一个节点判断是否是叶子节点,是叶子节点再判断路径和是否和sum相等。路径和由compare函数的result参数传入。方法每次进入java栈前将此节点的val值传给result参数。/** * Definition for a binary tree node. * public class TreeNode

2017-06-04 19:42:46 245

原创 List相关算法

List判断链表是否有环一个快节点,一个慢节点,如果有环,快节点一定会追上慢节点/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next

2017-06-04 19:41:28 421

原创 MySQL深入浅出2

MySQL深入浅出TEXT 与BLOB一般在保存少量字符串的时候,我们会选择CHAR 或者VARCHAR;而在保存较大文本时, 通常会选择使用TEXT 或者BLOB,二者之间的主要差别是BLOB 能用来保存二进制数据,比 如照片;而TEXT 只能保存字符数据,比如一篇文章或者日记。删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上 会有影响。为了提高性能,建议定期

2017-06-04 19:40:30 274

原创 MySQL深入浅出

MySQL深入浅出SQL 语句主要可以划分为以下3 个类别。DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter 等。DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查 询数据库记录,

2017-06-03 16:34:50 326

原创 8 锁与并发

8 锁与并发对象头与锁在java虚拟机的实现中,每个对象都有一个对象头,用于保存对象的系统信息。对象头中有一个称为Mark Word的部分,它是实现锁的关键。在32位系统中,Mark Word为一个32位的数据,在64位系统中,它占64位。它是一个多功能的数据区,可以存放对象的hash值,对象年龄,锁的指针信息。一个对象是否占用锁,占用哪个锁,就记录在这个Mark Word中。以32位系统为例,普通

2017-06-03 16:32:24 290

原创 7 分析java堆

7 分析java堆常见内存溢出(OOM)堆溢出直接内存溢出java NIO支持直接内存的使用,也就是通过一段java代码,获得一块堆外的内存空间,这块空间是直接向操作系统申请的。直接内存不一定能触发GC,除非直接内存使用量达到了-XX:MaxDirectMemorySize的设置,所以保证直接内存不溢出的方法是设定一个系统实际可达的-XX:MaxDirectMemorySize值(默认情况下等于-X

2017-06-03 16:31:56 286

原创 5 垃圾收集器与内存分配

5垃圾收集器与内存分配串行回收器串行回收器是指使用单线程进行垃圾回收的回收器。串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。新生代串行回收器主要有两个特点 1. 它仅仅使用单线程进行垃圾回收 2. 它是独占式的垃圾回收新生代串行回收器使用复制算法,实现相对简单。使用-XX:+UseSerialGC参数可以指定使用新生代串行收集器和老年代串行收

2017-06-03 16:31:27 332

原创 4 垃圾回收概念与算法

4垃圾回收概念与算法标记清除法复制算法在java的新生代串行垃圾回收器中,使用了复制算法的思想标记压缩法标记压缩法是一种老年代的回收算法分代算法将内存空间分成几块,使用不同的回收算法分区算法将整个堆空间划分成连续的不同小区间,每一个小区间独立使用,独立回收。强引用强引用可以直接访问目标对象强引用的对象在任何时候都不会被系统回收软引用 SoftReferenceGC未必会回收软引用的对象,但是,当内存

2017-06-03 16:30:53 261

原创 3 常用java虚拟机参数

3 常用java虚拟机参数-XX:+PrintGC 使用这个参数启动java虚拟机后,只要遇到GC,就会打印日志。1996K->608K(125952K), 0.0023511 secs]GC前已使用堆空间->GC后使用的堆空间(当前可用堆空间)需要更加详细的信息,可以使用 -XX:+PrintGCDetails,在虚拟机退出之前打印堆的详细信息。配置堆的参数-Xms 指定堆初始空间的大小-Xmx

2017-06-03 16:30:15 277

原创 2 认识java虚拟机的基本结构

2 认识java虚拟机的基本结构类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类信息外,方法区还会存放运行时常量池信息,包括字符串字面量和数值常量。java堆在虚拟机启动时建立,它是java程序中最主要的内存工作区域。几乎所有的java对象实例都存放在java堆中。堆空间是所有线程共享的。每一个java虚拟机线程都有一个私有的java栈。一个

2017-06-03 16:29:42 330

原创 7 拾遗增补

7 拾遗增补7.1 线程的状态NEW 线程实例化但未执行start()的状态RUNNABLE 线程进入运行状态TERMINATED 线程被销毁时的状态TIMED_WAITING 线程执行了Thread.sleep()方法BLOCKED 线程在等待一个锁的状态WAITING 线程执行了Object.wait()方法所处的状态

2017-06-03 16:18:36 289

原创 6 单例模式与多线程

6 单例模式与多线程6.3 使用静态内部类实现单例模式public class MyObject { private static class MyObjectHandler{ private static MyObject object = new MyObject(); } private MyObject(){ } public static

2017-06-03 16:18:03 203

原创 5 定时器 Timer

5 定时器 TimerTimer类的主要作用是设置计划任务,但封装任务的却是TimerTask类,。执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。TimerTask实现了Runnable接口。

2017-06-03 16:17:34 216

原创 4 Lock的使用

4 Lock的使用4.1.3 使用Condition实现等待/通知:错误用法与解决在一个Lock对象中可以创见多个Condition(即对象监视器)实例。使用ReentrantLock结合Condition类可以实现“选择性通知”Object类中的wait()方法相当于Condition类中的await()方法。Object类中的wait(long timeout)方法相当于Condition类

2017-06-03 16:17:11 606

原创 3 线程间通信

3 线程间通信3.1.3 等待/通知机制的实现方法wait()的作用是使当前执行代码的线程进行等待。该方法用来将当前线程置入“预执行队列”中,并且在wait()所在的代码处停止执行直到接到通知或被中断为止。调用wait方法钱前,线程必须获得该对象的对象级别锁,即只能在同步方法或者同步块中调用wait()方法。执行wait()方法后,当前线程释放锁。在从wait()返回前,线程与其他线程竞争重新获得锁

2017-06-03 16:16:44 259

原创 对象及变量的并发访问

2 对象及变量的并发访问2.1 synchronized同步方法“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是”脏读”。2.1.1 方法内的变量为线程安全2.1.2 实例变量非线程安全结论:在两个线程访问同一个对象中的同步方法时一定是线程安全的。2.1.4 synchronized方法和锁对象A线程先持有object对象的Lock锁,B线程可以 以异步方式调

2017-06-03 16:14:00 188

原创 1 java多线程技能

1 java多线程技能1.2.1 继承Thread类Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。如果调用thread.run()就不是异步执行了,而是同步,那么此线程对象不会交给“县城规划器”来进行处理,而是由main主线程来调用run()方法。另外,执行start()方法的顺序不代表线程的启动顺序。1.2.3 实例变量和线程

2017-06-03 16:13:05 259

原创 19 枚举类型

19 枚举类型19.1 基本enum特性创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum。19.4 values()的神秘之处由于values()方法是由编译器插入到enum定义中的static方法,所以如果你将enum实例向上转型为Enum,那么values()方法就不可访问了。不过,在Class中有一个getEnumConstants()方法,所以即便Enu

2017-06-03 16:03:22 248

原创 18 java IO

18 java IO18.2.1 InputStream类型每一种数据源都有相应的InputStream子类。另外,FilterInputStream也属于一种InputStream,为“装饰器”(decorator)类提供基类,其中,装饰器类可以把属性或有用接口与输入流连接在一起。18.2.2 OutputStream类型FilterOutSteam为“装饰器”类提供一个基类。18.4 Reade

2017-06-03 16:02:51 215

原创 17 容器深入研究

17 容器深入研究17.1 完整的容器分类法java SE5 新添加了 1. Queue接口,LinkedList已经为实现该接口做了修改,及其实现PriorityQueue和各种风格的BlockingQueue。 2. ConcurrentMap接口和其实现ConcurrentHashMap,它们也是用于多线程机制的。 3. CopyOnWriteArrayList和CopyOnWriteA

2017-06-03 15:56:45 354

原创 16 数组

16 数组16.7 Arrays实用功能equals() 用于比较两个数组是否相等fill() 用同一个值填充数组各个位置sort() 用于对数组排序binarySearch() 在已经排序的数组中查找元素toString() hashCode() 此外,Arrays.asList() 接收任意的序列或者数组作为参数,并将其转变为List容器。16.7.1 复制数组java标准库提供s

2017-06-03 15:54:09 272

原创 14 类型信息

14 类型信息运行时类型信息使得你可以在程序运行时发现和使用类型信息本章讨论java如何让我们在运行时识别对象和类的信息。主要有两种方式:一种是传统的“RTTI”,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制14.2 Class对象-每个类都由一个Class对象,每编译一个新类,Class对象就被保存在同名的.class文件中。为了生成这个类的对象,JVM将使用被称为“类加载器”的子

2017-06-03 15:53:15 339

原创 13 字符串

13 字符串13.2 重载“+”和StringBuilder在循环中使用“+”连接字符串每次进行连接时都会创建一个新的StringBuilder,所以,多次拼接字符串不要使用重载的“+”,改用StringBuiler.append()方法,但如果在append方法中又使用了“+”拼接字符串,那编译器就会调入陷阱,从而为你创建另一个StringBuilder对象处理括号内的字符串操作。13.3 无意识

2017-06-03 15:52:51 316

原创 11 持有对象

11 持有对象java容器的基本类型 - List - Set - Queue - Map11.2 基本概念java容器类库的用途是保存对象,并将其划分为两个不同的概念 1. Collection 一个独立元素的序列,这些元素都服从一条或者多条规则 2. Map 键值对对象,允许使用键值来查找11.5 List有两种类型的List - 基本的ArrayList,长于随机访问,但中间插入

2017-05-14 00:30:59 262

原创 10 内部类

10 内部类10.1 创建内部类如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须具体的指明这个对象的类型:OuterClassName.InnerClassName10.2 链接到外部类当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间有了一种联系,所以它能访问外围对象的所有成员,不需要任何特殊条件。10.6 匿名内部类如果定义一个匿名内

2017-05-14 00:30:20 179

原创 9 接口

9 接口9.1 抽象类和抽象方法abstract void f();来定义一个抽象方法,如果一个类包含一个或多个抽象方法,则该类被限定为抽象的9.7 接口中的域接口中的任何域自动都是static和final的9.7.1 初始化接口中域这些域并不是接口的一部分,他们的值存储在该接口的静态存储区域内

2017-05-14 00:29:41 248

原创 8 多态

8 多态8.2.1 方法调用绑定除了static和final方法,java中其他方法都是后期绑定8.2.4 缺陷:“覆盖”私有方法私有方法既不能被覆盖,也不能被重写8.3.3 构造器内部的多态方法的行为构造器中唯一能够调用的方法是基类的final方法,应避免调用其他方法

2017-05-14 00:28:51 252

原创 7 复用类

7 复用类7.1 组合初始化对象引用的四个位置 1. 在定义对象的地方,意味着成员对象在构造器调用之前初始化 2. 在类构造器中 3. 在使用这种对象之前,这种方法称为惰性初始化 4. 实例初始化7.2.1 初始化基类当创建一个子类的实例对象时,也同时创建了一个基类的对象,不过这个对象被包装在子类的内部,为了正确的创建基类子对象,需要在子类构造器中调用基类构造器来执行初始化。java会自动在

2017-05-14 00:27:14 273

原创 6 访问权限控制

6 访问权限控制访问权限等级: 从大到小依次为 public,protected,包访问权限(没有关键字),private使用package关键字将构建捆绑到一个单元中。6.1 包:库单元1 java代码存在.java文件中,一个.java文件称为一个编译单元2 一个.java文件中可以有多个类,但只能有一个public类,并且这个public类的类名必须与文件名相同(包括大小写)3 当编译

2017-05-14 00:22:39 281

原创 5 初始化与清理

5 初始化与清理5.2.1 区分重载方法每一个重载方法都必须有独一的参数类型列表(包括参数的类型和参数的顺序) 不能以返回值来区分重载方法5.6 成员初始化1 局部变量未初始化不能通过编译 2 类的数据成员会保证得到一个初始值5.7 构造器初始化无法阻止自动初始化的进行,自动初始化将在构造器调用之前执行5.7.1 初始化顺序变量初始化的顺序取决于类内部变量定义的先后顺序5.7.2 静态数据的初始

2017-05-14 00:21:52 189

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除