interview01

1overload:编译时多态(参数修改) 类中

override重写: 运行多态(参数不修改)  父子.构造器可重载overload

2checked unchecked

throw交给上一级处理(栈的上一个方法),程序停止

throws 声明可能

3java字节码的虚拟机进程

4collection :使用 ==:1非new ,integer&integer =>128比较引用地址,当小于128时比较值;2当integer时new时,integer&integer永远(无论是否小于128)比较是地址;3integer&int比价自动拆箱比较值。

HashMap/Hashtable、ArrayList/LinkedList、Vector,

JUC:concurrentHashMap、Executor框架、CopyOnWrite容器

5****Swing编程和Android开发中常用此方式来实现事件监听和回调。(匿名内部类)

一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

 6GC

一是Java的内存分配原理与C/C++不同,C/C++每次采用malloc或new申请内存时都要进行brk和mmap等系统调用,而系统调用发生在内核空间,每次都要中断进行切换,这需要一定的开销,而Java虚拟机是先一次性分配一块较大的空间,然后每次new时都在该空间上进行分配和释放,减少了系统调用的次数,节省了一定的开销,这有点类似于内存池的概念;

二是有了这块空间过后,如何进行分配和回收就跟GC机制有关。(GC结构+具体操作)

GC原理、画图表示年轻代(Eden区和Survival区)、年老代、比例分配及为啥要这样分代回收(我认为巧妙就在于这里),GC是具体如何进行内存分配和垃圾回收。

7项目的基本架构、所使用的算法原理、如何改进的、数据如何处理

UserCF的原理及如何使用用户的社交数据和六维理论改进传统的UserCF

用户的相似性你怎么算的:余弦相似性的计算方式

数据的存储格式

你刚说到struts有漏洞,那么Hibernate是安全的吗?有没有可能发生xss攻击和sql注入攻击?

 8username != null &&!username.equals("") NullPointerException异常

9四舍五入的原理是在参数上加0.5然后进行下取整。

10在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

11数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到

12如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。不这样,则Set可存放相同元素,增加新元素性能下降

13equals重写问题1. 使用==操作符检查"参数是否为这个对象的引用";2. 使用instanceof操作符检查"参数是否为正确的类型";3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4.equals 四性 必重写hashCode

14对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

A HAS-A relationship is dynamic (run time ) binding while inheritance is a static (compile time ) binding.

15传递,相当于=。 swap c中ref问题

 

16数组、列表、集合、哈希表、队列

176. 会用框架,理解注入
7. 正确使用语言提供的模式,例如单例、观察者等
8. 正确使用反射,正确使用切面,正确使用线程,8.0以后还要会正确使用 lambda
9. 理解JVM,会做优化,会根据需要改框架,或者自己写框架
10. 自己定制JVM

 

18

1. Spring 是干嘛用的,为什么要用 Spring?
2. Spring 是如何管理事务的?
3. Spring 的不同事务传播行为有哪些,干什么用的?
4. Bean 是如何被管理的,生命周期如何?
5. Bean 的不同 scope,比如 prototype、singleton 有什么区别?
6. Resource 是如何被查找、加载的?
7. 有哪些常用的 Context?
8. Spring 的 AOP 如何配置与使用?

 

 

19 2<<3 hashCode 31

20stringBuilder单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

21javap -c StringEqualTest.class命令获得class文件对应的JVM字节码

22JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的

Java中的类加载器负责在运行时查找和装入类文件中的类。

源程序并不是一个可执行程序,而是一个或多个类文件,使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

load:.class文件中的数据读入到内存中即创建一个字节数组读入,然后产生与所加载类对应的Class对象并将此实例返回

****link:验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤

****initialize:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。

根加载器(BootStrap 加载核心类库rt.jar resources.jar sunrsasign.jar jce.jar charsets.jar 等等,不是普通java类,在jvm中添加-Xbootclasspath参数,指定Bootstrcp ClassLoader加载类的路径,并追加我们自已的jar(ClassTestLoader.jar)或者将class文件放到JAVA_HOME/jre/classes/目录下)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)

父亲委托机制(PDM)保证了Java平台的安全性也避免重复: JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器路径中无时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。String已经在启动时就被引导类加载器(Bootstrcp ClassLoader)加载,所以用户自定义的ClassLoader永远也无法加载一个自己写的String,除非你改变JDK中ClassLoader搜索类的默认算法。

如何判相同class?类名是否相同,而且要判断是否由同一个类加载器实例加载的

定义classloader:1、继承java.lang.ClassLoader2、重写父类的findClass方法。loadClass方法中帮我们实现了ClassLoader搜索类的算法,当在loadClass方法中搜索不到类时,loadClass方法就会调用findClass方法来搜索类,所以我们只需重写该方法即可。如没有特殊的要求,一般不建议重写loadClass搜索类的算法。目前常用web服务器中都定义了自己的类加载器,用于加载web应用指定目录下的类库(jar或class),如:Weblogic、Jboss、tomcat等

 

23Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于C程序员来说,要完成这样****的编码转换恐怕要依赖于union(联合体/共用体)共享内存的特征来实现了。

24抽象类和接口

不能够实例化,但可以定义抽象类和接口类型的引用。

一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。

抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。

抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。

有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。

 25存在无用但可达的对象,这些对象不能被GC回收,也不会处理该对象引用的其他对象,对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。也会导致内存泄露的发生。

****如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。

栈内部维护着对这些对象的过期引用(obsolete reference)。public T pop() { if(size == 0) throw new EmptyStackException(); return elements[--size]; }//内存泄漏

在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。 

26内部类需要在外部类实例化后才能实例化.静态方法中没有this,也就是说没有所谓的外部类对象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:new outer().new inner();

27本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

28****(什么时候使用静态变量)静态变量在内存中有且仅有一个拷贝,实现让多个对象共享内存 。上下文类和工具类中通常会有大量的静态成员。

静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。

 291). 实现Cloneable接口并重写Object类中的clone()方法; 

2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象

 @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);

        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();
    }
}

 

30System.gc() 或Runtime.getRuntime().gc(),JVM可以屏蔽掉显示的垃圾回收调用。

外部资源(如文件流)的释放则close

垃圾回收器通常是作为一个单独的低优先级的线程运行不可预知的情况下进行回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

 

31.java可有多个类但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

32创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。第二次创建则调用父构造器,再初始化非静态,在调用自身。

33****如何将字符串转换为基本数据类型? 
- 如何将基本数据类型转换为字符串? 
34递归反转 return reverse(originStr.substring(1)) + originStr.charAt(0);

35****GB2312编码的字符串转换为ISO-8859-1编码

new String(s1.getBytes("GB2312"),"ISO-8859-1")

36利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期

****Java的时间日期API一直以来都是被诟病的东西,为了解决这一问题,Java 8中引入了新的时间日期API,其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等类,这些的类的设计都使用了不变模式,因此是线程安全的设计。

 37 1Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言

2JavaScript的前身是LiveScript;而Java的前身是Oak语言。 

3Java是一种真正的面向对象的语言,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。 

4解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率) 一个是静态语言,一个是动态语言.JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure)
5强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。 
6代码格式不一样。

 

38断言:调试,测试,发布后关闭,包含bool表达式,false为AssertionError,JVM时使用-enableassertions或者-ea标记,禁用则-da或者-disableassertions标记,不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。要在系统类中启用或禁用断言,可使用-esa或-dsa标记。还可以在包的基础上启用或者禁用断言。

语法:assert Expression1; assert Expression1 : Expression2(调试信息的字符串消息) ;

 

 

 

39Error表示系统级的错误和程序不必处理的异常

递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件

 

40try{}里有一个return语句 finally在方法返回调用者前执行.

如果在finally中修改了返回值,就会返回修改后的值。Eclipse中可以进行设置,强烈建议将此项设置为编译错误。

 

41六原则一法则- 单一职责原则(内聚,耦合)- 开闭原则:软件实体应当对扩展开放,对修改关闭。①抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点;②封装可变性:《设计模式精解》一书中对****桥梁模式的讲解的章节。) - 依赖倒转原则:面向接口编程。(声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型) -里氏替换原则:任何时候都可以用子类型替换掉父类型。- 接口隔离原则:接口要小而专。

- 合成聚合复用原则:优先使用聚合或合成关系复用代码。Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成

****例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值两个泛型参数设置为String类),而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。

记住:任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。
- 迪米特法则:对其他知道少。门面模式和调停者模式就是对迪米特法则的践行。

Java Web开发中作为前端控制器的Servlet或Filter,前端控制器就能够根据你的请求得到相应的服务。

主板作为一个调停者的身份出现,它将各个设备连接在一起而不需要每个设备之间直接交换数据,这样就减小了系统的耦合度和复杂度。(网->中心发散)

 

42、****
创建型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象化]共23种设计模式,包括:

Abstract Factory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。

 

- 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 
- 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。 
- 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。 
- 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。 

43反射 String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str)); // HELLO

44、面向对象处理异常,每个异常都是一个对象,它是Throwable类或其子类的实例。try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。

内层能捕获,则外层catch不执行:内层catch处理了异常,所以没有执行外层catch,内层finally结束再外层finally。如内层不处理,则内层先finally再外层catch。

出现异常,之后语句不执行,直接执行catch finally,但外层try还是要继续执行。除非内层异常没捕获则外层直接到catch

 finally:只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。 

****运行异常虚拟机的通常操作中可能遇到的异常:- ArithmeticException(算术异常) - ClassCastException (类转换异常) - IllegalArgumentException (非法参数异常) - IndexOutOfBoundsException (下标越界异常) - NullPointerException (空指针异常) ****- SecurityException (安全异常)

****(不明白) - 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常) - 对可以恢复的情况使用受检异常,对编程错误使用运行时异常 

编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常

****异常的继承问题

45****举例?
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作

 

46Map是键值对映射容器非collection,List是线性结构的容器,适用于按数值索引访问元素的情形。

47ArrayList 和Vector都允许直接按序号索引元素,实现方式:元素数大于实际存储的数组,插入慢,vector有synchronized性能差于Arraylist成为遗留容器,

LinkedList使用双向链表实现存储(插入块,索引慢)

Hashtable、Dictionary、BitSet、Stack、Properties(一个键和值都是字符串的特殊的键值对映射)都是遗留容器已经不推荐使用

由于ArrayList和LinkedListed都是非线程安全的,通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)

 

Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

Set用对象的equals()方法来区分元素是否重复

****map一对一或多对一

****Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。

48TreeSet要求存放的对象所属的类必须实现Comparable接口,其中compareTo()当插入元素时会回调该方法比较元素的大小。

TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。

Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。 
***由于Java中没有函数指针、仿函数、委托这样的概念 。 因此要将一个算法传入一个方法中唯一的选择就是通过接口回调

49sleep() Thread的静态方法,将执行机会(CPU)让给其他线程且不考虑线程的优先级,因此会给低优先级的线程以运行的机会,对象的锁依然保持,自动恢复到就绪状态,声明抛出InterruptedException。

wait()是Object类的方法,当前线程放弃对象的锁进入对象的等待池(wait pool)即阻塞状态,只有调用对象的notify(唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关)(或notifyAll(池中所有线程竞争,得锁者进入就绪)方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

****Node.js就采用了单线程异步I/O的工作模式。 

yield()方法只会给相同优先级或更高优先级的线程以运行的机会,转入就绪; 无异常声明;

****sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池中等待对象的锁。 

****信号量, condition

 

****(写代码)同步的synchronized  锁机制 信号量

实现多线程继承Thread类;实现Runnable接口,5后实现Callable接口。Java中的继承是单继承,继承了Thread类就无法再继承其他类,使用Runnable接口更为灵活call方法可以在线程执行结束时产生一个返回值

****临界资源(资源数量少于竞争资源的线程数量的资源)

例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好的例子)。同步就是指阻塞式操作,而异步就是非阻塞式操作。

****启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。

创建和销毁对象是很费时间的(要获取内存资源),虚拟机将试图跟踪每一个对象

 ****
- newSingleThreadExecutor:单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。任务的执行顺序按照任务的提交顺序执行。支持定时以及周期性执行任务的需求。 
- newFixedThreadPool:提交一个任务就创建一个线程,直到线程池的最大大小。异常则新建。
- newCachedThreadPool:创建一个可缓存的线程池。回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。
- newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 

阻塞状态又有多种情况,可能是因为调用wait()方法进入等待池,也可能是执行同步方法或同步代码块进入等锁池,或者是调用了sleep()方法或join()方法等待休眠或其他线程结束,或是因为发生了I/O中断。

50如果不进行序列化可能会存在数据乱序的问题.一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出

;反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆

****字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

51

XML文档定义分为DTD和Schema两种形式,Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。

对XML的解析主要有DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML)

DOM树结构占用的内存较多,在解析文件之前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略)

SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理XML文件,适合对XML的顺序访问

****StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理。不同之处在于StAX允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。

 

Sublime已经开始将配置文件书写成JSON格式
XML:数据交换和信息配置. 异构系统间交换数据几乎已经被JSON(JavaScript Object Notation取代XML来存储配置信息dom4j作为处理XML的工具

 

52 JDBC 驱动,连接,语句,执行,处理结果,关闭连接

先关闭ResultSet、再关闭Statement、在关闭Connection。上面的代码只关闭了Connection(连接),虽然通常情况下在关闭连接时,连接上创建的语句和打开的游标也会关闭,但不能保证总是如此,因此应该按照刚才说的顺序分别关闭。

第一步加载驱动在JDBC 4.0中是可以省略的(自动从类路径中加载驱动),但是我们建议保留。

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");

PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
    ps.setInt(1, 1000);
    ps.setInt(2, 3000);

ResultSet rs = ps.executeQuery();

 while(rs.next()) {
        System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
    }

finally {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

 

 53 ①PreparedStatement接口为预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(****减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

对存储过程调用的CallableStatement接口。调用存储过程会在网络开销、安全性、性能上获好处,底层数据库发生迁移时语法不同。

读取:ResultSet对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略)

更新:PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。

由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的)事先创建若干连接置于连接池中,空间换时间。Java的开源数据库连接池主有:C3P0ProxoolDBCPBoneCPDruid等。

****数据库与数据仓库

****etl

 54缓存的置换策略

55****DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,访问数据等,编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAOData Accessor(数据访问器)Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。

 56事务的ACID 原子性(Atomic) 一致性(Consistent):事务结束后系统状态是一致的 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态; 
- 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

存在并发数据访问时才需要事务。

当多个事务访问同一数据时3类数据读取问题(脏读、不可重复读和幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。

脏读:B操作A读,B未提交B回滚。A读到脏。BABA(B的操作后的数据读、回滚后的数据读)

不可重复读(Unrepeatable Read):A读,B提交,A重读到与之前不同。BABA(B操作前的数据读、提交后的数据读)

幻读(Phantom Read):A统计,B提交,A中插入一条B提交相关的内容。  BABA (B操作前的数据读、提交后的数据读)

第1类丢失更新:A读B读B提交A写&撤销。ABBA (B操作前数据写&回滚覆盖B操作)

第2类丢失更新:B读A读B提交A提交。BABA   (B操作前数据提交覆盖B操作)

ABBA BABA (ABAB?即BABA; BAAB即ABBA,但A分有无操作是不是只读)

总结:分为B操作有无提交。A在B操作前、B提交4种(分A操作有无提交:12类数据丢失更新;A读:B存幻读取则不可重复读),A在B操作后、B回滚1种(脏读)

锁机制解决数据并发访问

锁定对象不同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁
自动锁机制,分析sql为资源加锁,维护锁提性能,对用户来说透明

****ANSI/ISO SQL 92标准定义了4个等级的事务隔离级别,事务隔离级别越高并发性就越差。

 

Connection调用****setAutoCommit(false)手动,当事务完成后用commit()显式提交事务;异常则rollback()回滚。保存点。

 Blob是指二进制大对象(Binary Large Object),而Clob是指大字符对象(Character Large Objec),因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。

 57****正则

58获得类

- 方法1:类型.class,例如:String.class 
- 方法2:对象.getClass(),例如:"hello".getClass() 
- 方法3:Class.forName(),例如:Class.forName("java.lang.String")

反射创建实例:

- 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance() 
- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");

getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了

59****Spring的IoC容器可以为普通的类创建单例,它是怎么做到的呢?

60UML

用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协作图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。

 

61Servlet:服务器进程中,在Servlet容器中运行(JSP容器能够运行servlet的服务器,提供jsp页面运行环境),多线程运行serviec(),一个实例服务多个请求关联一个或多个JSP页面、(容器将请求传递给servlet程序,响应传给用户)、不会销毁。****不能生成动态网页,所有的文本和HTML标签都是硬编码,即使做出微小的修改,都需要进行重新编译。Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。

JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。

Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

CGI:每个请求产生新进程,销毁,效率低于servelet

处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet,Fast CGI

 

五个接口,三个生命周期相关: init(Web容器加载Servlet并将其实例化后) service(根据请求调用doGet或doPost等) destroy(服务器关闭或项目被卸载时); getinfo getconfig

forward 更高效是容器中控制权的转向,是服务器请求资源,隐藏实际链接.ServletRequest对象的getRequestDispatcher()方法获得RequestDispatcher,再获对象的forward()

redirect就是服务器端发送一个状态码告诉浏览器重新去请求那个地址,HttpServletResponse对象调用其sendRedirect()

62****JSP有9个内置对象: - request- response- session - pageContext:通过该对象可以获取其他对象; - application - out - config - page-exception。为用户呈现视图。

JSP4作用域:page、request、session和application

****Tomcat就是一个Servlet/JSP容器。第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。JspPage接口是Servlet的子接口,因此每个JSP页面都是一个Servlet。转换成功后,容器会编译Servlet类,之后容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,如果修改过就会重新转换并重新编译并执行。如果没有则执行内存中已经存在的Servlet实例。

63****get获资源,表单数据name=value,添加action所指向的url后两者使用"?"连接,变量之间&连接,传输的数据要受到URL长度限制(1024字节),get时参数会显示在地址栏上,如果这些数据不是敏感数据get,MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"

post提交,表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;可以传输大量的数据,如上传文件 ,敏感数据,

64

****常用的Web服务器有哪些? 
最广泛的免费HTTP服务器是Apache服务器,而Windows平台的服务器通常使用IIS作为Web服务器。

选择Web服务器应考虑的因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。
- IIS:Microsoft的Web服务器产品,全称是Internet Information Services。IIS是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。 
- Kangle:Kangle Web服务器是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。此外,Kangle也是一款专为做虚拟主机研发的Web服务器。实现虚拟主机独立进程、独立身份运行。用户之间安全隔离,一个用户出问题不影响其他用户。支持PHP、ASP、ASP.NET、Java、Ruby等多种动态开发语言。 
- WebSphere:WebSphere Application Server是功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于Java的应用环境,用于建立、部署和管理Internet和Intranet Web应用程序,适应各种Web应用程序服务器的需要。 
- WebLogic:WebLogic Server是一款多功能、基于标准的Web应用服务器,为企业构建企业应用提供了坚实的基础。针对各种应用开发、关键性任务的部署,各种系统和数据库的集成、跨Internet协作等Weblogic都提供了相应的支持。由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发等优势,很多公司的企业级应用都选择它来作为开发和部署的环境。WebLogic Server在使应用服务器成为企业应用架构的基础方面一直处于领先地位,为构建集成化的企业级应用提供了稳固的基础。 
- Apache:目前Apache仍然是世界上用得最多的Web服务器,其市场占有率很长时间都保持在60%以上(目前的市场份额约40%左右)。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支强大的开发团队、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。 
- Tomcat:Tomcat是一个开放源代码、运行Servlet和JSP的容器。Tomcat实现了Servlet和JSP规范。此外,Tomcat还实现了Apache-Jakarta规范而且比绝大多数商业应用软件服务器要好,因此目前也有不少的Web服务器都选择了Tomcat。 
- Nginx:读作"engine x",是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。 Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。在2014年下半年,Nginx的市场份额达到了14%。

 

65****讲解JSP中的四种作用域。 
答:JSP中的四种作用域包括page、request、session和application,具体来说: 
- page代表与一个页面相关的对象和属性。 
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。 
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。 
- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

 66 单线程模式 每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收):<%@page isThreadSafe=”false”%>

自定义的Servlet实现SingleThreadModel标识接口

67

 

 

编程题:

文件拷贝

统计字符串字数

列出所有文件

套接字实现多线程回显

冒泡排序

折半查找

 

 

 

 

 

 

 

 

posted on 2017-12-06 04:56  satyrs  阅读(221)  评论(0编辑  收藏  举报

导航