字节流,字符流。
字节流继承自InputStream:
和OutputStream:
字符流继承自Reader:
和Writer:
在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个标识接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
栈存放基本类型的数值和一些对象的引用地址;
堆存放对象。如:
Person p = new Person();
new 出来的Person对象放入堆内存中,Person的引用变量p放入栈内存
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
43,什么时候用assert。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
public class Test extends Date{
publicstaticvoid main(String[] args) {
new Test().test();
}
publicvoid test()
{
System.out.println(
super.getClass().getName()
);
}
}
答案是,Test,并非是父类的类名,因为getClass()方法继承自Object,而其中的方法定义为:获取当前运行类(即Test),若真的需要获取父类的名字可采用这个方法:
getClass().getSuperClass().getName()
要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
java.util.Date,System,Class,List,HashMap
常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate
常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
1.通过new语句实例化一个对象
2.用过过反射机制创建对象:
使用Class类的newInstance方法,或者Constructor类的newInstance方法
3.通过clone()方法创建一个对象
4.通过反序列化的方式创建对象:
49.jvm加载class文件过程
(1) 装载:查找和导入class文件
(2) 链接:执行校验,准备和解析步骤,其中解析步骤可选:
a)校验:校验载入class文件的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用转成直接引用;
(3)初始化:对类的静态变量静态代码块初始化;
page、request、session和application,具体如下:
由于HTTP协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的ID,下一次用户在请求中包含此ID,服务器据此判断到底是哪一个用户。
53.简单介绍El 表达式
El表达式是jsp中的一种技术,原要用java语言获取的值可以是用El表达式代替,使代码更加简洁。
El表达式使用${}取值,可以从四个域中取值:page,request,session,application.如果知道确定的域,可以使用${resquestScope.name}取值,可以获取对象属性,获取list,map集合中的值。支持基本的运算符和三元运算符。
54.介绍ognl表达式
OGNL是Struts 2默认的表达式语言。是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。
1.#符号的用途一般有三种。 1)访问非根对象属性,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext();;#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(”msg”) 。 2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用来构造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。
2.struts2配置文件中也可以使用ognl表达式获取值栈总的值。
3.和El表达式的区别:
El表达式:
单纯在jsp页面中出现,是在四个作用域中取值,page,request,session,application.
>>如果在struts环境中,它除了有在上面的四个作用域的取值功能外,还能从值栈(valuestack)中取值.
>>特点1:${name},name在值栈中的查找顺序是:先从对象栈中取,取到终止,否则,向map中取。
>>特点2:在对象栈的查找顺序是,先从model中找是否有name这个属性,找到终止,否则,找action中是否有name这个全局变量。
>>特点3:${#name},里面的是不带#号的。
>>特点4:如果放在对象栈中的是一个自定义的对象,那么${property}里面可以直接去该对象的属性值,不用这样${object.property}
OGNL表达式:
1:读取从后台传递的值
%{#name}:表示从值栈的map中取值
%{name}:表示从值栈的对象栈中取值
%{#request.name}:表示从request域中取值
55.堆内存和栈内存的区别
1.堆内存用来存放对象和数组,栈内存用来存放基本数据类型和引用
2.栈内存的存储速度快于堆内存
3.堆内存的生命周期长一直到程序结束,栈内存的生命周期短
4.栈内存相对与堆内存要小很多
56.深复制和浅复制
浅复制是把对象中的所有变量都复制过来与原对象中的值一样,但是引用还是指向原来的地址。
深复制把对象的所有变量都复制过来与原对象中的值一样,是把引用的对象复制了一遍。
57.简单工厂模式和单例模式
工厂模式:
1) 简单工厂模式:根据参数的不同返回不同类的实例
优点:简单方便
缺点:当我们需要一个新的产品的时候就需要修改工厂类添加新的生产方法,违反开闭原则
2) 工厂方法模式:简单工厂模式只有一个工厂,而工厂方法模式中每一个产品对应一个工厂需要添加新产品的时候只需要添加相应的工厂类。
3) 抽象工厂模式:
单例模式:指在java程序中某个类只有一个实例存在,一些管理器和控制器常被设计成单例模式。
单例模式通过将构造器私有化禁止其他类实例化本类,然后提供一个静态的实例提供给调用者。
饿汉模式:类加载的时候自行创建
懒汉模式:调用时使用其静态方法getInstance创建并一直存在。
58jsp中动态include和静态include区别
动态INCLUDE 用jsp:include动作实现
静态INCLUDE 用include伪码实现,不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>
@ include是先把文件包含就来,然后统一编译