2,HashTable和HashMap的区别
HashMap:允许将null作为一个entry的key或者value;有containsKey和containsValue方法,没有contains方法;多个线程访问HashMap时,必须为之提供外同步
HashTable:不允许有null值,Hashtable的方法是Synchronize的,多个线程访问 Hashtable时,不需要自己为它的方法实现同步
4,动态INCLUDE用jsp:include动作实现,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,不会检查所含文件的变化,适用于包含静态页面,只用于同级目录
7,sleep是不释放同步锁,wait释放同步锁,进入等待状态。使用interreput打断sleep的线程,notify唤醒wait的线程,前者更像是自己让自己的状态改变,后者像是为了配合线程协作而执行的操作
9,notify():唤醒一个处于等待状态的线程,在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
10,EJB包括Session Bean、Entity Bean、Message Driven Bean
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean 被用来代表
应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是 一种
持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean
11,字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter
13,stop这个方法将终止所有未结束的方法,包括run方法。当一个线程停止时候,他会立即释放所有他锁住对象上的锁。这会导致对象处于不一致的状态。假如一个方法在将钱从一个账户转移到另一个账户的过程中,在取款之后存款之前就停止了。那么现在银行对象就被破坏了。因为锁已经被释放了。当线程想终止另一个线程的时候,它无法知道何时调用stop是安全的,何时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止他。
suspend不会破坏对象。但是,如果你用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend的方法线程试图取得相同的锁,程序就会死锁。
15,一段socket通信的代码
服务端:
import java.net.*; import java.io.*; public class Server { private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWriter out; public Server() { try { ss = new ServerSocket(10000); while (true) { socket = ss.accept(); String RemoteIP = socket.getInetAddress().getHostAddress(); String RemotePort = ":" + socket.getLocalPort(); System.out.println("A client come in!IP:" + RemoteIP + RemotePort); in = new BufferedReader(new InputStreamReader( socket.getInputStream())); String line = in.readLine(); System.out.println("Cleint send is :" + line); out = new PrintWriter(socket.getOutputStream(), true); out.println("Your Message Received!"); out.close(); in.close(); socket.close(); } } catch (IOException e) { out.println("wrong"); } } public static void main(String[] args) { new Server(); } };
客户端:
import java.io.*; import java.net.*; public class Client { Socket socket; BufferedReader in; PrintWriter out; public Client() { try { System.out.println("Try to Connect to 127.0.0.1:10000"); socket = new Socket("127.0.0.1", 10000); System.out.println("The Server Connected!"); System.out.println("Please enter some Character:"); BufferedReader line = new BufferedReader(new InputStreamReader( System.in)); out = new PrintWriter(socket.getOutputStream(), true); out.println(line.readLine()); in = new BufferedReader(new InputStreamReader( socket.getInputStream())); System.out.println(in.readLine()); out.close(); in.close(); socket.close(); } catch (IOException e) { out.println("Wrong"); } } public static void main(String[] args) { new Client(); } };
17,switch只能用int,char,byte,short,不能用于long
18,shorts1=1;s1=s1+1语句在java里面会出错,s1+1将结果转换成int,再将int赋值给short就出错,但是s1+=1就不会
19,使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的
22,vector是线程安全的,ArrayList是线程不安全的,记住Vector与Hashtable是旧的,是java 一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。ArrayList和Vector都是使用数组方式存储数据,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用
23,set里面的元素重复是使用equal来判断的
24,Java用有向图的方式进行垃圾管理。java也会发生内存泄露的问题,想象下内部类和外部类的例子
//java内存泄露的例子 Vector v=new Vector(10); for (int i=1;i<100; i++) { Object o=new Object(); v.add(o); o=null; } //vector将对象o用add方法添加,但是o已经null了,vector中还存在对这些对象的引用
26,java中对象不一定由垃圾回收机制销毁,垃圾回收不等于析构,finalize()执行,然后执行垃圾回收..主要是处理java中调拥c/c++代码的情况
27,java中基本类型如int,double等是直接存在栈中,而Double,String等都是存放在堆上的..
28,java类的访问权限
29,final的用法
数据:修饰基本类型时,保持该值不变,当修饰对象引用时,final使引用不变
参数:当final修饰参数时,无法在方法中修改参数所指向的对象
方法:被final修饰的方法不能被继承,并且该方法会被内嵌执行,感觉很像inline
类:表明该类不能被继承
ps:private方法都会隐式的制定为final
例子:String对象建立之后不再改变,StringBuffer允许经常更改,String覆盖了equal方法,StringBuffer没有
finalStringBuffera=newStringBuffer("immutable"); //执行如下语句将报告编译期错误: a=newStringBuffer(""); //但是,执行如下语句则可以通过编译: a.append("broken!");
30,int 的默认值为0,而Integer的默认值为null,所以int不能表示未赋值的情况
31,内部类要访问局部变量,局部变量必须定义成final 类型
32,异常分为runtime exception和checked exception,前者比如数组越界,空指针等,也叫系统异常,是软件设计者考虑不周出现的;后者比如io,网络等异常,是软件的运行环境变化导致的,用户可以自行解决,jdk要求程序员必须处理这种异常
33,synchronized锁的是这个类对象,即使synchronized(this),容易理解的,非static的synchronized方法不能防止其他线程访问static的方法,static的synchronized方法也不能防止其他线程访问非static的方法(因为static方法中的this不一样)
34,Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
35,如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.
36,字节流:针对非二进制数据,ouputStream和inputSteam,不同的实现类代表不同的输入输出设备,针对字节操作
字符流:针对字符数据,其实是实现在字节类之上的,底层设备只认识字节类,不能处理字符类,字符类需要处理编码的问题
37,当finally没有return语句的时候,finally语句在return执行之后在执行,加入try里面有return x,那么不管在finally里面再如何改变x的值,return的都是x未进入finally时候的值,当finally有return语句的时候,finally语句中的return结果会覆盖之前的return结果。参考地址:http://www.cnblogs.com/sky-manbu/archive/2011/11/17/2253102.html
38,下面一段程序输出是1,-1,-1
Integer aInteger = 10, bInteger = -3; System.out.println(aInteger % bInteger); aInteger = -10; bInteger = -3; System.out.println(aInteger % bInteger); aInteger = -10; bInteger = 3; System.out.println(aInteger % bInteger);
被除数和模除之后的数正负是一样的