java 复习001

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在编译期间不会转换成泛型类的目标代码,而是生成

    t

    前加必要的类型转换代码

  3. java的泛型是伪泛型,因为只是在编译期间添加了类型转换代码,和自己手动添加没有任何区别,只能起更直观的类型控制作用,没有像c++那样提高效率

  4. 而且这种类型转换导致java的泛型不能是基础类型(如:int),而c++就没有这个限制了

java内存溢出问题


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

      )

  2. 特别注意资源调用时注意关闭,容易导致内存泄漏

链条编程


  • 方法返回和本身类同样的对象

  • 使用效果:

    )

filter(过滤器)


  • 一个统一的Filter接口
    • 一个

      )

      方法

  • 一个主FilterChain,可能嵌入很多子FilterChain
    • 实现了Filter接口

    • 多个过滤类的集合(ArrayList)
      • 也实现了Filter接口

  • 处理程序的

    s

    方法有待处理的参数和主FilterChain

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


  • 情景:当你想给一个已经存在且没法改源代码的类,在类的某个方法前后加上处理代码(如:计算运行时间代码)

  • 实现方法(面向切面编程AOP):
    1. 使用

      <ul>
      <li>不够灵活,因为继承只能是一个确定的类,不能多态,也就不容易嵌套代理</li>
      </ul></li>
      <li>使用

      implements`实现类的父类的接口,并且保存一个父类的引用(聚合),然后重写方法,在父类方法的前后加上处理代码
      • 很灵活,实现一个统一的接口能代理所有实现了这个接口的类对象,可以很容易嵌套代理

      • 真正体现了多态之强大了

    2. 根据DynamicHandlerInterface和ObjectInterface动态得到一个代理类

    3. 底层实现有两种方法:jdk动态代理和cglib动态代理
      • 两者区别:jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。csdn

工厂模式(Factory)


  • 情景:手机切换主题

  • 简介:能用来创建一系列实现了相同接口的对象,如:多样的主题类

  • 可参考:iteye

单例模式


  • 简介:一个类只有一个对象

  • 必要条件
    1. 私有的构造方法

    2. static的自身引用

    3. static

      )

      方法

Hibernate


  • 对象状态转换图

  • 1+N问题

    • 问题简述
      1. @ManyToOne关系中,给Many的

        R

      2. 在查询这个类对象时,Hibernate会先发送一条Select语句查询这个类对象,接着发送N条Select语句来查询与之相关的类对象

    • 解决方法
      1. 将这个类的

        ;gutter:true;"><li>在这个类定义前加上

        @BatchSize

        ;gutter:true;"><li>使用HQL语句

        join
        fetch

        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提交的数据丢失了

  • 悲观锁:基于数据库的加锁实现

    • 思想:程序悲观的认为在它操作期间肯定会有人修改数据,所以先给数据库加把锁,不让其他人操作数据库,直到自己处理完成时才解锁

  • 乐观锁:程序控制(不加锁,效率稍高)

    • 思想:程序乐观的认为在它操作期间不会有人修改数据,所以先大胆的操作,只是在存数据时检查下是否有人修改过数据

    • 具体实现:给数据库表中加上

      n

      值是否一致,不一致再重新执行事物,或者采取其他操作

  • 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

时间: 2024-10-22 03:39:51

java 复习001的相关文章

java复习整理之集合

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.ios培训..Net培训</a>.期待与您交流!------ java复习整理之集合: Collection:集合中的最顶层接口,提供了一些操作集合的共性方法添加:boolean add(E e)boolean addAll(Collection<? extends E> c)删除:void

Java复习第一天---Javascript的基本知识点

1.HelloWord: 2.基础语法: 3.嵌入HTML 借助window.onload事件在整个窗体载入完毕之后运行程序代码 4.事件驱动: 5.DOM操作 5.1 查找元素节点 5.1.1 依据id值 方法:document.getElementById(id值) 获取到的是一个元素节点 var bj = document.getElementById("bj"); alert(getText(bj)); 5.1.2 依据标签名 方法:document.getElementsBy

Java复习第四天---IO流

File类测试 //根据指定的文件名和路径创建File对象 File file = new File("myFile.txt"); //file.exists();检测文件是否存在 boolean exists = file.exists(); System.out.println(exists); //按照file对象指定的路径和文件名创建一个新的文件 file.createNewFile(); exists = file.exists(); System.out.println(e

Java复习第二天---JavaSE基础

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

java复习汇总之面试篇

这些个人感觉都是基础,希望看的园友不要喷. 1.什么是servlet线程安全,如何解决? 2.spring事物管理,在项目中你是怎么管理事物的? 3.java中的有几种线程? 4.java有几种锁? 5.怎么理解java中的多态,项目中何时用到抽象类? 6.如何处理js,sql注入? 7.struts2拦截器的原理? 8.如何理解spring AOP? 11.java中常用的集合,在项目中用到时,有什么需要注意的? 12.如果优化项目中sql,为什么要那样优化? 13.java性能优化? 14.

Java复习第三天---集合框架的相关知识

集合框架总览: Collection 接口常用方法 //1.add()向集合中添加数据 c.add(apple01); c.add(apple02); c.add(apple03); c.add(apple04); c.add(apple05); //2.isEmepty()检测当前集合是否为空 boolean empty = c.isEmpty(); System.out.println("is empty:"+empty); //3.size()返回当前集合的长度 int size

Int与Integer(Java复习一)

最近一直在复习java,写一下其中自己的疑惑点.第一个讲Int和Integer. 首先,应该明确的式Int是数据类型,Integer是封装Int的一个类. 八大数据类型,java都有封装.boolean->Boolean;char->Character;byte->Byte;short->Short;int->Integer;long->Long;float->Float;double->Double; 后者就成了类. 区别一: 在比较两个数大小的时候两者就

java复习预科知识-Markdown学习

java复习预科知识-Markdown学习 写在前面 1.最近深感在家学习效率低下,java基础不太稳固,因此趁放假在家,也无法走动,闲来无事,借写博客进行复习.2月份争取一天一更,每篇博客仅探讨一个小的技术点. 2.Markdown语法并不属于java语法,但是现在几乎所有的博客网站都支持该语法,关于该语法的介绍就不做介绍了,本套系列博客都是基于该语法进行编写,并发布在博客园网站内.百度上搜孤傲的咸鱼,欢迎各位读者关注. 1."标题"语法 # 表示一级标题 => h1标签 ##

Java复习——枚举与注解

枚举 枚举就是让某些变量的取值只能是若干固定值中的一个,否则编译器就会报错,枚举可以让编译器在编译阶段就控制程序的值,这一点是普通变量无法实现的.枚举是作为一种特殊的类存在的,使用的是enum关键字修饰 枚举常量 枚举常量默认都是使用static final修饰的,所以语法建议使用大写,一个枚举类在第一次被实例化的时候,这些常量就会被创建,这些常量都是枚举类子类的对象 public enum WeekDay{ //每一个枚举的元素(枚举常量)就是一个枚举类子类的对象,是使用static fina