1overload:编译时多态(参数修改) 类中前端
override重写: 运行多态(参数不修改) 父子.构造器可重载overloadjava
2checked uncheckednode
throw交给上一级处理(栈的上一个方法),程序中止git
throws 声明可能程序员
3java字节码的虚拟机进程github
4collection :使用 ==:1非new ,integer&integer =>128比较引用地址,当小于128时比较值;2当integer时new时,integer&integer永远(不管是否小于128)比较是地址;3integer&int比价自动拆箱比较值。web
HashMap/Hashtable、ArrayList/LinkedList、Vector,算法
JUC:concurrentHashMap、Executor框架、CopyOnWrite容器sql
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
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:一、继承java.lang.ClassLoader二、重写父类的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,前端控制器就可以根据你的请求获得相应的服务。
主板做为一个调停者的身份出现,它将各个设备链接在一块儿而不须要每一个设备之间直接交换数据,这样就减少了系统的耦合度和复杂度。(网->中心发散)
4二、****
建立型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一块儿造成更大的结构]、行为型[对在不一样的对象之间划分责任和算法的抽象化]共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
4四、面向对象处理异常,每一个异常都是一个对象,它是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的开源数据库链接池主有:C3P0、Proxool、DBCP、BoneCP、Druid等。
****数据库与数据仓库
****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
编程题:
文件拷贝
统计字符串字数
列出全部文件
套接字实现多线程回显
冒泡排序
折半查找