整理简单面试题

equals与==的区别:
1、==是判断两个变量或实例是不是指向同一个内存空间。
2、equals是判断两个变量或实例所指向的内存空间的值是不是相同。

String、StringBuffer与StringBuilder的区别:
1、String类型和StringBuffer类型的性能区别在于String是不可变的对象。
2、StringBuffer和StringBuilder底层是 char[]数组实现的
3、StringBuffer是线程安全的,而StringBuilder是线程不安全的

Override和Overload的含义:
1、Overload是重载:方法名称不变,其余的都是可以改变的。它的关系是同一个类,同一个方法名,不同的方法参数或返回值。
2、Override是重写:方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系。

抽象类和接口的区别:
1、接口是公开的,里面不能有私有的方法或变量,是用于让别人调用的,而抽象类是可以有私有方法或私有变量的。
2、实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
3、接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承。

wait()和sleep()的区别:
1、sleep来自Thread类,wait来自Object类。
2、调用sleep()方法的过程中,线程不会释放对象锁。而调用wait方法线程会释放对象锁。
3、sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU。
4、sleep需要指定一个睡眠时间,时间一到会自动唤醒。
就是说sleep有时间限制的就像闹钟一样到时候就叫了,而wait是无限期的除非用户主动notify。

面向对象编程有三大特性:
1、封装。
2、继承。
3、多态。

java中的集合:
1、List是有序,数据可以重复。
2、set是无序(可以自己排序),数据不能重复。
3、Map是键值成对的保存数据。

list集合继承Collection接口,是有序接口,list接口的实现类有arrayList和LinkedList。
1、arraylist内存分配连续的空间 善于查找比较快!
2、LinkedList采用链表,删除和插入效率比较高!
3、ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
4、LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.

ArrayList、LinkedList与Vector的对比:
主要区别在于因为实现方式的不同,所以对不同的操作具有不同的效率。
1、ArrayList是一个可改变大小的数组。当更多的元素加入到ArrayList中时,其大小将会动态地增长。内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组。
2、LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList。当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义。
3、Vector和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的,那么使用ArrayList是更好的选择。
4、Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%。
ArrayList示例:
public static void testArrayList() {  
    ArrayList<Integer> al = new ArrayList<Integer>();  
    al.add(3);  
    al.add(2);          
    al.add(1);  
    al.add(4);  
    al.add(5);  
    al.add(6);  
    al.add(6);
    //迭代器
    Iterator<Integer> iter1 = al.iterator();  
    while(iter1.hasNext()){  
        System.out.println(iter1.next());  
    }  
}
LinkedList示例:
public static void testLinkedList() {  
    LinkedList<Integer> ll = new LinkedList<Integer>();  
    ll.add(3);  
    ll.add(2);          
    ll.add(1);  
    ll.add(4);  
    ll.add(5);  
    ll.add(6);  
    ll.add(6);  
    //迭代器
    Iterator<Integer> iter2 = ll.iterator();  
    while(iter2.hasNext()){  
        System.out.println(iter2.next());  
    }  
}  
如上面的例子所示,其使用方式是相似的,实际的区别在于底层的实现方式以及操作的复杂性不同。

Vector:
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized).因此,开销就比ArrayList要大。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。


list与map的区别:
list是列表,map是键值对形式存在。

Hashmap和hashtable的区别:
1、HashTable的方法是同步的,HashMap的方法是不同步的。
1、HashTable不允许null值的存在,HashMap允许null值的存在。

Map集合的常用遍历方法及HashMap的应用实例:

1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中,放着的就是Map中的某一对key-value;
2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来读取Map中的元素;
3、遍历Map.values():它是Map中value的集合,我们可以直接通过这个集合遍历
Map<String, String> map = new HashMap<String, String>();            
map.put("a", "zhangsan");  
map.put("b", "lisi");  
map.put("c", "wangwu");  
    
/** 
 * 方法一遍历map 
 */  
Set<String> keySet = map.keySet();  
  
for(Iterator<String> iterator = keySet.iterator();iterator.hasNext();){  
    String key = iterator.next();  
      
    String value = map.get(key);  
      
    System.out.println(key+"="+value);  
} 
  
/** 
 * 方法二遍历map 
 */  
for(String key : map.keySet()){  
    System.out.println(key+"="+map.get(key));  
}   
  
/** 
 * 方法三遍历map,推荐使用该方法遍历map集合,尤其是容量大时 
 */  
for(Map.Entry<String, String> entry : map.entrySet()){  
    System.out.println(entry.getKey()+"="+entry.getValue());  
}  
  
/** 
 * 方法四遍历map 
 */  
Set<Entry<String, String>> entrySet = map.entrySet();  
  
for(Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();iterator.hasNext();){  
    Map.Entry<String, String> entry = iterator.next();  
      
    System.out.println(entry.getKey()+"="+entry.getValue());  
}  
  
/** 
 * 方法五,这种方法遍历的是所有的值 
 */  
for(String value : map.values()){  
    System.out.println(value);  
}  

引用数据类型
1、String 类、接口、数组

什么是引用类型:
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
示例如下:
public class MyDate {
    private int day = 8;
    private int month = 8;
    private int year = 2008;
    private MyDate(int day, int month, int year){...}
    public void print(){...}
}
public class TestMyDate {
    public static void main(String args[]) {
        //这个today变量就是一个引用类型的变量
        MyDate today = new MyDate(23, 7, 2008);
    }
}

final, finally, finalize的区别:
1、final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
2、finally是异常处理语句结构的一部分,表示总是执行。
3、finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。


char型变量中能不能存贮一个中文汉字?
可以。JAVA默认的编码是unicode

静态变量和实例变量的区别?
1、静态变量属于类,该类不生产对象,通过类名就可以调用静态变量。
2、实例变量属于该类的对象,必须产生该类对象,才能调用实例变量。

单例模式?
单例模式就是确保一个类只能有一个实例,并且提供一个全局访问点
1、单例类确保自己只有一个实例。
2、单例类必须自己创建自己的实例。
3、单例类必须为其他对象提供唯一的实例。
public class Singleton {
	private static Singleton instance;
	private Singleton() {}
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

数据库的分页查询?
select * from
(
select a.*, rownum rn from (select * from table_name) a where rownum <= 20
)
where rn >= 10

jsp的九大内置对象和四大作用域(四种会话跟踪技术):
1.request对象
2.response对象
3.session对象
4.out对象
5.page对象
6.exception对象
7.application对象
8.pageContext对象
9.config对象 
page -> 页面级别,显然只有在一个页面内可用。
request -> 请求级别 服务器跳转,一次请求之后消失。
session -> 会话级别 客户端跳转(服务器跳转),与浏览器有关,ie是在重新打开ie时才会不同。
application -> 应用级别,当重启服务器时才会消失。

三个Statment区别,用法:
1、Statment基本的;
2、PreparedStatement是可编译的,提高效率;
3、callablestatment存储过程

Get请求和Post请求区别:
1、Post是通过Http中的Post机制将表单中的数据提交到Action所制定的程序。Get方法是通过Url请求来提交表单数据的。
2、Get适用于传输数据量小于1K数据,执行效率高。Post传输数据量较大,但也有限量。

servlet生命周期:
Servlet 的生命周期始于将它装入 Web 服务器的内存时,并在终止或重新装入 Servlet 时结束。包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,  service 和 destroy 方法表达。

如何获得客户cookie的信息:
request.getCookies();

如何设置response的头部信息:
response.setHeader();

描述servlet的生命周期:
服务器实例化一个servlet对象,容器运行其init方法,请求到达时运行其service方法,
service方法根据请求的类型调用(doGet,doPost)方法,当服务器决定将实例销毁时调用其destory方法。

获得ServletConfig对象:
ServletConfig sc=getServletConfig();

如何获得servletContext对象:
servletContext sc=getservletContext();

面向对象的特征有哪些方面:
1、抽象
2、继承
3、封装
4、多态性

String是最基本的数据类型吗? 
基本数据类型包括byte、int、char、long、float、double、boolean和short

int 和 Integer 有什么区别:
Java 提供两种不同的类型:原始类型和引用类型。
Int是java的原始数据类型,Integer是java为int提供的封装类。

Collection 和 Collections的区别:
Collection是集合类的上级接口,继承与他的接口主要有Set 和List。
Collections是针对集合类的一个帮助类。

&和&&的区别:
1、&是位运算符,表示按位与运算。
2、&&是逻辑运算符,表示逻辑与(and)。

Hashmap和hashtable的区别:
1、HashTable的方法是同步的,HashMap的方法是不同步的。
2、HashTable不允许null值的存在,HashMap允许null值的存在。
3、ConcurrentMap 线程安全

forward 和redirect的区别:
1、forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
2、redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 
1、short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
2、short s1 = 1; s1 += 1;(可以正确编译)

Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 
Math.round(11.5)==12
Math.round(-11.5)==-11

String s = new String("xyz");创建了几个String Object? 
两个

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
public class ThreadTestDemo {
	private int j;
	public static void main(String args[]) {
		ThreadTestDemo tt = new ThreadTestDemo();
		Inc inc = tt.new Inc();
		Dec dec = tt.new Dec();
		for (int i = 0; i < 2; i++) {
			Thread t = new Thread(inc);
			t.start();
			t = new Thread(dec);
			t.start();
		}
	}
	private synchronized void inc() {
		j++;
		System.out.println(Thread.currentThread().getName() + "-inc:" + j);
	}
	private synchronized void dec() {
		j--;
		System.out.println(Thread.currentThread().getName() + "-dec:" + j);
	}
	class Inc implements Runnable {
		public void run() {
			for (int i = 0; i < 100; i++) {
				inc();
			}
		}
	}
	class Dec implements Runnable {
		public void run() {
			for (int i = 0; i < 100; i++) {
				dec();
			}
		}
	}
}

Java有没有goto?
java中的保留字,现在没有在java中使用。

启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
1、接口可以继承接口。
2、抽象类可以实现(implements)接口。
3、抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。

数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。

构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

是否可以继承String类?
String类是final类故不可以继承。

swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
Switch(expr1)中,expr1是一个整数表达式。
因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。Long,string 都不能作用于swtich。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。

用最有效率的方法算出2乘以8等於几? 
2 << 3

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。

编程题: 写一个Singleton出来:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 

请说出你所知道的线程同步的方法:
Wait():使一个线程处于等待状态,并且释放所持有的对象锁。
Sleep():使一个正在运行的线程处于睡眠状态。
Notify():唤醒一个处于等待状态的线程。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 
同步的实现方面有两种,分别是synchronized,wait与notify

一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。必须只有一个类名与文件名相同。

java中有几种类型的流?
字节流,字符流。
字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。

java中会存在内存泄漏吗,请简单描述:
会。如:
int i,i2;  
return (i-i2);//when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。

什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
序列化的实现:将需要被序列化的类实现Serializable接口。

List、Map、Set三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

冒泡排序法:
基本思想:在要排序的一组数中,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
int[] arr = { 9, 5, 3, 1, 8, 7 };
/** 
* 冒泡排序法 
* @param arr 
*/  
public static void bubbleSort(int[] arr) {  
	for (int i = 0; i < arr.length - 1; i++) {  
	    // 外层循环控制多少趟  
	    for (int j = 0; j < arr.length - i - 1; j++) {  
		if (arr[j] > arr[j + 1]) {  
		    int temp = arr[j];  
		    arr[j] = arr[j + 1];  
		    arr[j + 1] = temp;  
		}  
	    }  
	}  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值