中国it实验室
bbs.chinaitlab/forum.php
jiangjun88
317282717jiang
1.在项目部署到tomcat中并启动后,替换其中的jsp和jar文件包,
JSP和jar的区别?
相对于预先加载,我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法( load-on-demand ),就是在 Java 程序需要用到的时候再加载,以减少内存的消耗,因为 Java 语言的设计初衷就是面向嵌入式领域的。
2.String a="a";String a=a+"sdf";
会把a="a"销毁,再开辟一片空间a值为asdf,问为什么要这样
设计,为什么把String设计成final的类;
节约内存
如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%,
安全性,JDK中提供的好多核心类比如String,这类的类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,也只有这样才能做事,这种类是非常底层的,和操作
系统交流频繁的,那么如果这种类可以被继承的话,将是很不安全的。
3.hashCode(),==,equalse的区别
“equals”方法比较的是两个对象的内容,“==”比较的是对象的地址(是不是同一个对象),hashcode方法主要用在集合框架中,目的是为了快速比较两个对象是否相等,因为集合框架中的对象很多,每个都使用equals比较效率很差。String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同,hashCode相同,不一定相等,比较频繁的话,可以先进行hashCode的快速比较,再进行equalse比较,从而提高对象比较的速度。
4.什么时候会内存回收,什么时候不会,什么时候必须手动回收
使用System.gc()可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求
Java的垃圾回收。(),但这同样是个不确定的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。
一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。
5.写一个栈溢出
递归代码:
public class MyTest2 {
public static void main(String[] args) {
MyTest2.sum(2);
}
//栈溢出的原因是这个应用
程序的递归层次太深,一直递归调用就会栈溢出,改成sum(a-1)就不会
static void sum(long a)
{
if(a==1){
return;
}
sum(a+1);
}
}
6.断言要注意哪些?
assert关键字需要在运行时候显式开启才能生效,否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这对程序的移植和部署都带来很大的不便。da关闭
断言语句不是永远会执行,可以屏蔽也可以启用,因此:
1. 不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值:boolean isEnable=false; //... assert isEnable=true; 值会发生改变
7.同步的方法的区别?
一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用
Java同步机制有4种实现方式:① ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile
都是为了解决多线程中的对统一变量的额访问冲突
顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独