- Java语言的内存回收机制:内存回收线程负责释放无用内存。Java程序不允许用户使用指针来释放内存。
- ,>>和>>>符号
两个表示数据带符号向右移动,三个的表示数据不带符号向右移动,主要应用在十进制和二进制之间,向右移动的位数要看后面的数字,假如为2,那么就向右移动两个位数。 - ResultSet中记录行的第一列索引为1因为ResultSet数组是从1开始遍历的,ResultSet是jsp,用来接收获取的数据库信息,查询时也是从第1列开始的。
- 线程中run方法和start方法的区别:run()方法就是一个普通的方法,真正启动一个新线程的话是start()
- 一个Java源程序文件中定义几个类和接口。
- 这个考察的是for循环的判断,首先先执行A,再执行判断,当为真时执行循环体中的语句,当条件为假时,跳出循环体,执行外面的方法,虽然这个方法也写在了for语句中,但是也得是这的流程。
public class Print{
static boolean out(char c){
System.out.print(c);
return true;
}
public static void main(String[] argv){
int i = 0;
for(out('A');out('B') && (i<2);out('C')){
i++;
out('D');
}
}
}
- 在线程中,执行什么方法会让线程销毁:run( )方法是线程的具体逻辑方法,执行完后线程结束。
需要注意的是wait( )方法,这个方法是让线程进入等待状态,等待别的线程执行notify( )或者notifyAll( )唤醒后继续执行。 - 如果要导入一个java.scut.computer的包:只需在代码中加入“import java.scut.computer;”一个语句,并且必须放在代码非注释的第一行,
- Java去除了指针的概念,使用引用,并且Java的内存管理不需要程序员来管理,由Java虚拟机来完成对内存的管理。
StringBuffer s1=new StringBuffer(10);
s1.append(1234);
System.out.println(s1.length());
System.out.println(s1.capacity());
声明这个字符串初始化长度为10,但是里面是没有参数的。
如果字符串长度没有初始化长度大,capacity返回初始化的长度,如果append后的字符串长度超过了初始化长度,capacity返回增长后的长度。
- Java反射机制主要提供了那些功能:
在运行时判断一个对象所属的类
在运行时构造一个类的对象
在运行时判断一个类所具有的成员变量和方法。
在运行时调用一个对象的方法。 - abstract修饰的类,不可实例化,所以需要子类去继承,然后重写其中的抽象方法,但是final修饰类是不可继承的,两者**属性相冲。
- RMI采用的是TCP/IP协议**
- 在类方法中调用本类的类方法可以直接调用,实列方法也叫做对象方法。
- 类方法属于整个类的,而实例方法是属于类的某个对象的,类方法体有如下限制:
1、类方法中不能引用对象变量。
2、类方法中不能调用类的对象方法。
3、在类方法中不能使用super,this关键字。
4、类方法不能被覆盖。 - 对象方法相比:
1、对象方法中可以引用对象变量,也可以引用类变量。
2、对象方法可以调用类方法
3、对象方法中可以使用super,this关键字。 - abstract class 表示的是 is-a关系,interface表示like-a关系。
volatile关键字
- 对volatile变量的操作是原子性的。
- 对volatile变量的操作不会造成阻塞。
- 一旦一个共享变量(类的成员变脸,类的静态成员变量)被volatile修饰之后,具备两层语义:
1、保证不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2、禁止进行指令重排序。
线程局部存储TLS(thread local storage)
- 解决多线程中的对同一变量的访问冲突的一种技术
- TLS会为每一个线程维护一个和该线程绑定的变量的副本
- Java平台的Java.lang.ThreadLocal是TLS技术的一种实现。
对象成员占用内存
- 同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间。
- 当创建一个新的实例对象时,会得到一块新的内存空间,但是类中的静态成员变量时所有对象共有的,也就是在一片属于类的存储空间中,被所有对象共有。
子类和父类
- 只要是被子类重写的方法,不被super调用都是调用子类方法
- 子父类存在同名成员时,子类中默认访问子类成员,可以通过super指定访问父类成员。格式:super.xx (注:xx是成员名)。
- 创建子类对象时,默认会调用父类的无参构造方法,可通过super指定调用父类其他构造方法,格式:super(xx)(注:xx是父类构造方法需要传递的参数)。
- super访问父类中被public、default、protected修饰的成员变量,实列方法,构造方法,不能访问private修饰的成员变量,实例方法,构造方法。
关于servlet和cgi的描述
- servlet处于服务器进程中,一个进程拥有多个线程,一个实例可以服务于多个请求,并且实例一般不会被销毁。
- CGI对于每个请求都产生新的进程,服务完就销毁,并且效率低于servlet。
throws和throw
- throws出现在方法头,表示出现异常的一种可能性,并不一定会发生异常。
- throw出现在方法体,表示抛出异常,执行throw一定会抛出某种异常。
- 两者都是消极的异常处理方式,只是抛出或者可能抛出异常,是不会由函数处理,真正的处理异常由它的上层调用处理。
jvm垃圾回收方式采用的复制算法回收
- 新生代串行收集器
- 新生代并行回收收集器
- 最基本的Java回收算法:复制算法和标记清理算法。
- 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B,此为新生代最常用的算法。
- 标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出标记整理算法:多个碎片整理,整理出更大的内存放更大的对象。
常见的代码优化技术
- 复写传播,删除死代码,强度削弱,归纳变量删除,代码外提。
- 删除多余运算在编译期就会自动优化,不是专门针对循环优化的。
Web应用程序
- Web容器负责将HTTP请求转换为HttpServletRequest对象。web容器是一种服务程序,在服务期一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如Java中tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器。
ThreadLocal:使用开放定址法来解决哈希冲突的。
HashMap:使用链地址法来解决哈希冲突的。
-
HttpSessionAttributeListener:可以实现此侦听器接口获取此web应用程序中会话属性列表更改的通知;
-
HttpSessionBindingListener:当该对象从一个会话中被绑定或者解绑时通知该对象,这个对象由HttpSessionBindingEvent对象通知。这可能是servlet程序显式地从会话中解绑定属性的结果,可能是由于会话无效,也可能是由于会话超时;
-
HttpSessionObjectListener:没有该接口API;
-
HttpSessionListener:当web应用程序中的活动会话列表发生更改时通知该接口的实现类,为了接收该通知事件,必须在web应用程序的部署描述符中配置实现类;
-
HttpSessionActivationListener:绑定到会话的对象可以侦听容器事件,通知它们会话将被钝化,会话将被激活。需要一个在虚拟机之间迁移会话或持久会话的容器来通知所有绑定到实现该接口会话的属性。
关键Java类加载器
- 扩展类加载器extension class loader:用来加载Java的扩展库。
- 引导类加载器bootstrap class loader:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar)
- 系统类加载器system class loader:根据Java应用的类路径来加载Java类
- tomcat为每个APP创建一个loader,里面保存着webApp的class loader,需要加载webApp下的类时,就去除class loader来使用。
关于forward 和redirect
- 执行forward时,浏览器不知道服务器发送的内容从何处来,浏览器地址栏中还是原来的地址
- 执行redirect时,服务器端高数浏览器重新去请求地址。
- forward时内部重定向,redirect是外部重定向。
JVM内存映像–看到映射就要想到map
- jps:查看本机Java进程信息
- jstack:打印线程的栈信息,制作线程dump文件
- jmap:打印内存映射,制作堆dump文件
- jstat:性能监控工具
- jhat:内存分析工具
- jconsole:简易的可视化工具。
- jvisualvm:功能强大的控制台。
- jdb:Java的调试器
JVM规范
- JVM内存区:程序计数器,虚拟机栈,本地方法栈,堆,方法区
- 不属于JVM内存区:直接内存,用户I/O操作。
CMS垃圾回收器
- 初始标记和重新标记是没有用户线程参与的。
servlet中init,service,destory方法
- init()方法是servlet生命的起点,一旦加载了某个servlet,服务器将立即调用它的init()方法。
- service方法处理客户机发出的所有请求。也是在这个方法里创建对象。
- destroy方法标志servlet生命周期的结束。
- servlet在多线程下其本身并不是线程安全的。
- ServletConfig.getParameter( )方法是获取Servlet的初始化参数。
- ServletContext对象:servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servletContext对象。
数组的复制方法
- 效率上:System.arraycopy>clone>Arrays.copyOf>for循环
set集合
- TreeSet:自然排序,使用二叉树的原理对新add()的对象,按照指定的顺序排序。
- LinkedHashSet:按添加顺序进行排序
- HashSet:存储元素的顺序是按照哈希值来存的,所以取数据也是按照哈希值取得。
关于泛型
- 虚拟机中没有泛型,只有普通方法和普通类
- 创建泛型对象时指明泛型类型,让编译器尽早做参数检查
- 泛型的类型擦除机制意味着不能再运行时动态获取List中T的实际类型
- 在编译阶段,所有泛型类的类型参数都会被object或者它们的限定边界来替代(类型擦除)
final,finally,finallize区别
- final:用于声明属性,方法,类,表示属性不可变,方法不可覆盖,类不可以继承,例如引用变量被final修饰后,不再指向其他对象,但是对象的内容可以被改变。
// 引用变量被final修饰之后,不能再指向其他对象,但是它指向的对象的内容是不可变的。
final StringBuffer sb = new StringBuffer();
sb.append("hello");
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,但是不是关闭文件这种操作而是一些通过调用了native方法产生的资源的释放.
- finally:异常处理语句结构的一部分,表示总是执行。
- finallize:object类的一个方法,在垃圾收集器执行的时候会被调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件。
关系数据模型与对象模型之间匹配关系
- 表对应类,记录对应对象,表的字段对应类的属性。
floor,ceil,round
- floor: 求小于参数的最大整数。返回double类型-----n. 地板,地面
例如:Math.floor(-4.2) = -5.0 - ceil: 求大于参数的最小整数。返回double类型-----vt. 装天花板;
例如:Math.ceil(5.6) = 6.0 - round: 对小数进行四舍五入后的结果。返回int类型
例如:Math.round(-4.6) = -5
反射
- Java反射主要涉及的类如Class类在lang包下。
- 反射的本质是从字节码中查找,动态获取类的整容结构,包括属性,构造器,动态调用对象的方法,而不是修剪类
- 通过反射可以动态实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法
- 通过反射可以访问一般方式不能访问的成员。
- Java的反射机制会给内存带来额外的开销,例如对永生堆的要求比不通过反射要求的更多。