一、简答题
1.简述面向对象的特征有哪些方面?
封装
将类的属性私有化,提供一些公有方法操作属性。
隐藏了具体实现的逻辑,保证数据的安全性,完整性。
继承
创建新的类去继承已有的类。提高代码复用性。
多态
父类引用指向子类对象,接口引用指向具体实现类的对象。
传递参数可以使用父类引用,使方法更加灵活。
 


2.简述StringBuffer和StringBuilder的区别?(10分)
    都是一个可变长的字符容器。(append)
StringBuffer  线程安全的。jdk 1.0提出。  慢
StringBuilder 线程不安全。jdk 1.5提出。  快
 


3. 在main方法中的执行代码如下:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
请写出以上代码的输出的结果,分析输出结果的原因。(10分)
true 
1.== 判断的是两个对象的内存地址是否一样。
2.s1和s2都指向常量池中的“abc”对象,内存地址一致,s1==s2 返回true.



4.多线程有几种实现方法?同步有几种实现方法? (10分)
实现方式:
1.继承Thread ,重写run()
new Thread(){
public void run(){
具体逻辑
}
}
2.实现Runnable接口,实现run() 
new Thread(
new Runnable(){
public void run(){
具体逻辑
}
}
)

同步实现方法:
1.synchronized:同步代码块和同步方法
2.使用Object 的 wait()和notify() 实现。 


 
5.列出Java你所知道的集合体系,并简述各自的特点.(10分)
Collection :集合
---| List : 存放的元素有顺序,可以重复
------| ArrayList: 使用数组实现,线程不安全   查询快,插入慢
------| Vector: 线程安全,其他和ArrayList一致,相对较慢。
------| LinkedList:使用链表实现,线程不安全   查询慢,插入快

---| Set : 无序,元素不能重复
------| HashSet: 使用hash算法实现,元素不能重复,无序
------| TreeSet:使用红黑树实现,元素存储时会被排序。

Map :映射,存储数据以键值对的形式存储。
---| HashMap : 使用hash算法实现,无序,key不能重复,key可以是null,线程不安全。
---| HashTable : key value都不能为null.线程安全的。
---| TreeMap : 存入的数据会根据key被排序。




6.集合与数组的区别是什么呢?(10分)
集合和数组都是可以用来存放元素的容器。
1.集合中可以存放不同类型的元素(可以设置泛型),数组只能存放一种类型的元素。
2.集合存放的元素数量可变,数组元素数量固定。
 
7.Collection和Collections的区别?(10分)
Collection是集合的最上层接口。在Collection接口中定义了集合应该具有的一些方法。
Collections是一个操作集合的帮助类,提供了一些操作集合的常用方法,比如sort() 
 
8.HashSet是如何保证元素唯一性的。(10分)
HashSet是使用hash算法实现的。
向HashSet存储元素时,HashSet会根据元素的hashCode判断是否已经存在。

 
9.简述ArrayList与Vector的区别,ArrayList与LinkedList的区别(10分)
ArrayList:线程不安全
Vertor:线程安全

ArrayList:数组实现 查询快,插入慢
LinkedList: 链表实现  查询慢,插入快


 
二、编程题
1.使用TCP,模拟一下QQ的信息交流功能,客户端,服务端(10分)
服务端: 
ServerSocket server = new ServerSocket(端口);
Socket socket = server.accept();
socket.getInputStream();
socket.getOutputStream();

客户端:
Socket socket = new Socket(ip,端口);
socket.getInputStream();
socket.getOutputStream();

  
2.编写一个方法实现拷贝任意文件或文件夹的功能。(10分)
递归
copy(File source,File targetDir){
if(source.isFile()){
//拷贝
copyFile(source,targetDir);
}else{
File[] fileList = source.listFiles();
for(File file : fileList){
copyFile(file,new File(targetDir, source.getName()));
}
}
}

copyFile(File source,File targetDir){
File target = new File(targetDir, source.getName);
BufferedInputStream br =
new BufferedInputStream(new FileInputStream(source));
...
}


 
3.统计一个字符串中每个字符出现的次数,并按自然顺序输出。
String str = "afasd";

public Map count(String str){
Map map = new TreeMap();

for(int i = 0; i < str.length(); i++){
char c = str.charAt(i);
int count = 1;
if(map.contains(c)){
count = map.get(c) + 1;
}

map.put(c, count);
}

return map;
}