java 复习001

比较随意的记录下我的java复习笔记

ArrayList 内存扩展方法

  1. 分配一片更大的内存空间,复制原有的数据到新的内存中,让引用指向新的内存地址
  2. ArrayList在内存不够时默认是扩展为1.5倍 + 1个

ArrayList,LinkedList,Vector 区别

  1. Vector内存扩展和ArrayList一样,不过Vector是默认扩展为2倍
  2. Vector支持线程的同步,因此牺牲了访问性能
  3. ArrayList,Vector都是使用数组实现,插入删除效率低
  4. LinkedList是链表实现,插入删除效率高,但遍历和随机访问速率低
  5. LinkedList提供操作链头和链尾的方法,可以轻松实现栈和队列

HashMap和HashTable的区别

HashMap实现详见:vblog-HashMap
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。

附张简单的java集合类关系图

java泛型和c++的区别

  1. c++叫函数模板(template),在编译期间会转换为模板类的目标代码
  2. java在编译期间不会转换成泛型类的目标代码,而是生成Object的目标代码,然后在Object前加必要的类型转换代码
  3. java的泛型是伪泛型,因为只是在编译期间添加了类型转换代码,和自己手动添加没有任何区别,只能起更直观的类型控制作用,没有像c++那样提高效率
  4. 而且这种类型转换导致java的泛型不能是基础类型(如:int),而c++就没有这个限制了

java内存溢出问题

  1. 数据库查询条目太多,Hiberate session处理数据时,同个session会缓存所有的条目,导致内存不够溢出了

    • 同一个session进行分页查询,注意session.clear()
  2. 特别注意资源调用时注意关闭,容易导致内存泄漏

链条编程

  • 方法返回和本身类同样的对象
  • 使用效果: chain.add("1").add("2")

filter(过滤器)

  • 一个统一的Filter接口

    • 一个doFilter()方法
  • 一个主FilterChain,可能嵌入很多子FilterChain
    • 实现了Filter接口
    • 多个过滤类的集合(ArrayList)
      • 也实现了Filter接口
  • 处理程序的process方法有待处理的参数和主FilterChain

动态代理(dynamic proxy)->interaptor(拦截器)

  • 情景:当你想给一个已经存在且没法改源代码的类,在类的某个方法前后加上处理代码(如:计算运行时间代码)
  • 实现方法(面向切面编程AOP):
    1. 使用extends继承,然后重写方法,在父类方法的前后加上处理代码

      • 不够灵活,因为继承只能是一个确定的类,不能多态,也就不容易嵌套代理
    2. 使用implements实现类的父类的接口,并且保存一个父类的引用(聚合),然后重写方法,在父类方法的前后加上处理代码
      • 很灵活,实现一个统一的接口能代理所有实现了这个接口的类对象,可以很容易嵌套代理
      • 真正体现了多态之强大了
    3. 根据DynamicHandlerInterface和ObjectInterface动态得到一个代理类
    4. 底层实现有两种方法:jdk动态代理和cglib动态代理
      • 两者区别:jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。csdn

工厂模式(Factory)

  • 情景:手机切换主题
  • 简介:能用来创建一系列实现了相同接口的对象,如:多样的主题类
  • 可参考:iteye

单例模式

  • 简介:一个类只有一个对象
  • 必要条件
    1. 私有的构造方法
    2. static的自身引用
    3. staticgetInstance()方法

Hibernate

  • 对象状态转换图
  • 1+N问题
    • 问题简述

      1. 在*@ManyToOne*关系中,给Many的FetchType设为EAGER
      2. 在查询这个类对象时,Hibernate会先发送一条Select语句查询这个类对象,接着发送N条Select语句来查询与之相关的类对象
    • 解决方法
      1. 将这个类的FetchType设置为LAZY;与之相关的类对象查询语句将按需而发
      2. 在这个类定义前加上@BatchSize(批处理);设置批数据大小,也就是一次操作对象的数目,这样可以成倍减少查询语句的条数
      3. 使用HQL语句join fetch,例如:from Topic t left join fetch t.category c;合并查询,一个对象将只发一条查询语句
  • 缓存
    • 一级缓存:session级别的缓存
    • 二级缓存:SessionFactory级别的缓存,跨session存在
      1. 经常访问
      2. 改动不大
      3. 数量有限
  • 事务ACID
    • Atomic(原子性):事务不可分
    • Consistency(一致性):数据一致,必须满足必要的约束,如:约束条件(a-b=1),如果a=2,那么b必须为1
    • Itegrity(完整性):事务之间不会交叉执行,防止数据不一致
    • Durability(持久性):事务运行成功后数据将持久到数据库,不会出现意外的回滚
  • 事务并发问题
    1. 脏读:A事务读到B事务没有提交的数据(B可能出现回滚,导致数据不一致)
    2. 不可重复读:A有两次读数据,第一次在B提交数据之前,第二次在B提交事务之后,出现两次读取的数据不一致
    3. 幻读:和不可重复读一样,只是突出A在查询时的数据不一致
    4. 第一类丢失更新:A读取数据然后进行修改,B在A回滚数据之前提交了一次修改过的数据,最后A回滚到最开始的数据,丢失了B的操作
    5. 第二类丢失更新:A读取数据然后进行修改,在A提交数据之前,B先于A提交了一次修改过的数据,导致B提交的数据丢失了
  • 悲观锁:基于数据库的加锁实现
    • 思想:程序悲观的认为在它操作期间肯定会有人修改数据,所以先给数据库加把锁,不让其他人操作数据库,直到自己处理完成时才解锁
  • 乐观锁:程序控制(不加锁,效率稍高)
    • 思想:程序乐观的认为在它操作期间不会有人修改数据,所以先大胆的操作,只是在存数据时检查下是否有人修改过数据
    • 具体实现:给数据库表中加上version字段,每次update都给version加一,在update之前先检查version值是否一致,不一致再重新执行事物,或者采取其他操作
  • hibernateibatis的对比:
    1. ibatis非常简单易学,hibernate相对较复杂,门槛较高。
    2. 二者都是比较优秀的开源产品
    3. 当系统属于二次开发,无法对数据库结构做到控制和修改,那ibatis的灵活性将比hibernate更适合
    4. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标。在这种情况下ibatis会有更好的可控性和表现。
    5. ibatis需要手写sql语句,也可以生成一部分,hibernate则基本上可以自动生成,偶尔会写一些hql。同样的需求,ibatis的工作量比hibernate要大很多。类似的,如果涉及到数据库字段的修改,hibernate修改的地方很少,而ibatis要把那些sql mapping的地方一一修改。
    6. 以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po是截然不同的,本质区别在于这种po是扁平化的,不像hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
    7. hibernate现在已经是主流o/r mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于ibatis。
      参考至:http://blog.csdn.net/cdh1213/article/details/5967405

java 复习001的更多相关文章

  1. java 复习003 之排序篇

    由java 复习003跳转过来的C语言实现版见some-sort-algorithms 快速排序(不稳定 O(n log n)) package vell.bibi.sort_algorithms; ...

  2. java复习(1)---java与C++区别

    [系列说明]java复习系列适宜有过java学习或C++基础或了解java初步知识的人阅读,目的是为了帮助学习过java但是好久没用已经遗忘了的童鞋快速捡起来.或者教给想快速学习java的童鞋如何应用 ...

  3. Java复习11. 单例编程

    Java复习11. 单例编程 1.最简单的写法,那个方式是线程不安全的 public class Singleton {     private static Singleton instance; ...

  4. Java复习9网路编程

    Java 复习9网路编程 20131008 前言: Java语言在网络通信上面的开发要远远领先于其他编程语言,这是Java开发中最重要的应用,可以基于协议的编程,如Socket,URLConnecti ...

  5. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  6. Java复习10.Servlet编程

    Java复习10. Servlet编程知识 20131008 前言: 之前在大三下的时候,学习了一个月的JSP和Servlet知识,但是没有什么项目经验,把JSP Web开发学习实录看了前面几张,后面 ...

  7. Java复习6异常处理

    Java复习6.异常处理 20131005 前言: Java中的异常处理机制是非常强大的,相比C++ 来说,更加系统.但是我们开发人员没有很好的使用这一点.一些小的程序是没有什么问题的,但是对于大型项 ...

  8. Java复习4.数组初始化.

    Java复习4.Java中的数组声明方式  20131004 1.数组声明和初始化, 数组元素和变量一样,可以在定义的时候i进行初始化.数组元素的初始化工作实在编译阶段完成的,可以减少运行时间. 在初 ...

  9. Java复习7.输入输出流

    Java复习7.输入输出流 20131005 前言: Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别.如 ...

随机推荐

  1. java获取当前操作系统的信息

    java获取当前操作系统的信息 JavaOS虚拟机UnixEXT  从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...

  2. JavaMail如何保证邮件发送成功

    使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是Java ...

  3. spring boot 1.4默认使用 hibernate validator

    spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能.hibernate validator 5.2.4 Final是JSR 349 Be ...

  4. bzoj1132

    每次都选最左边的点,然后以这个点为原点 统计和这个点构成的三角形面积和 不难想到极角排序然后由叉积很容易求出 shl ; eps=1e-8; var i,j,k,m,n:longint; x,y:.. ...

  5. iOS开发:本地数据存储-NSUserDefaults

    Getting Default Values arrayForKey(_:) boolForKey(_:) dataForKey(_:) dictionaryForKey(_:) floatForKe ...

  6. iOS开发:告诉git不要跟踪UserInterfaceState.xcuserstate

    在xcode中使用git管理项目的技巧: 在多人协作开发的时候,每个开发者都会在项目中的某个目录生成一个 UserInterfaceState.xcuserstate 文件,这个文件大概每5s会刷新一 ...

  7. java读取照片信息 获取照片拍摄时的经纬度

    项目结构 源码:ImageInfo.zip 第一步:添加需要的架包metadate-extractor.jar 架包下载地址:https://code.google.com/p/metadata-ex ...

  8. apache开源项目 -- Wicket

    [infoq] Apache Wicket是一个功能强大.基于组件的轻量级Web应用框架,能将展现和业务逻辑很好地分离开来.你能用它创建易于测试.调试和支持的高质量Web 2.0应用.假设其他团队交付 ...

  9. win32 摄像头捕获系统vfw

    //win32 摄像头捕获系统vfw //  VideoRecord.h ///  用于定义一些资源ID #include "resource.h" //#define EXIT  ...

  10. directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失

    原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分 ...