3.值:只有HashMap可以让你将空值作为一个表的条目的key或value
50、
51 Java中,String和StringBuffer的区别?
1, String : 字符串常量,字符串长度不可变!!!
2, StringBuffer : 字符串变量(Synchronized,即线程安全),如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString();StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。append方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。
3, (*延伸) StringBuilder 字符串变量(非线程安全),这是在JDK5.0新增加的!!!,该对象是一个线程不安全的字符串容器,在单线程操作的情况下此对象可以用于取代StringBuffer!!!
4,(String 和 StringBuffer )两者者之间的区别 :
这两者之间的区别主要区别在性能上,String,每次对存放进String当中的字符串进行更改的时候,都会生成一个新的String对象,然后指针指向该对象(虽然Java不承认自己有指针这回事),而一旦当产生的没有引用指向对象过多的时候 ,这个时候GC就会出动,对其进行清理,这个时候,性能就会有所降低!!!而使用 StringBuffer的时候,每次都会对该对象本身进行操作,而不是去创建一个新的对象,所以在多数情况下还是推荐使用该对象!!!
但是某些特殊的情况下,使用String 并不会比StringBuffer慢!!! 例如 : String str = \;&& StringBuffer sb = new StringBuffer(); sb.append(\
在这里的String str = \+ \实际上被翻译成了 str = \
52、Thread和Runnable有什么不同?
首先,Java 中Thread 和 Runnable是实现并发线程的两种方式!!!, 通过两者中的任意一个都可以达到线程并发的目的!!! 区别 :
0,Thread 是一個 Class,Runnable 是一個 interface!!!
1,通过extends Thread,可获得start(), sleep(), 并覆盖run(), 使用时直接用start(),
但有时不太方便通过继承(extends)而进行多线程,例如已继承了其它Class(Java 不允许多重继承)时,就应该实现(implements) Runnable写多线程程序。
2,注意,implements Runnable创建的只有run()方法而没有start(),因此要利用其
它机制来启动。这要创建两个对象,
第一个是Runnable的,
第二个是Thread的,然后把第一个当成参数传给第二个!!!
3,由下面的程序可以看出,实现Runnable的多线程程序要比,继承Thread的多线程程
序灵活的多!!!
4,这里还有一点,就是说使用Runnable实现多线程可以达到资源共享目的,让多个
Thread对象接收同一个Runnable实现类的参数,这样就是多个线程操作同一块资源!!!
例如 :
1. //Runnable 接口的多线程程序举例!!! 2. private class RunnableThread implements Runnable{ 3. /*这个方法中写,多线程执行的程序!!!,因为这里是实现了Runnable所以就算再去继承其他的class也不会违反java成不能多继承的规定!!!*/ 4. public void run(){ 5. } 6. } 7. /*通过将Runnable的实现类作为参数传递给一个Thread对象,然后通过开启Thread对象,就能让其执行自己复写的方法,并且是并发操作!!!*/ 8. Thread runnThread = new Thread(new RunnableThread()); 9. RunnThread.start(); 10. /*1,继承自Thread类的多线程程序 11. private class GenThread extends Thread { 12. //这个方法中写,多线程需要执行的方法!!! 13. public void run() { 14. } 15. } 16. 17. Thread theGenThread = new GenThread(); 18. theGenThread.start(); 53、struts的Action是不是线程安全的?如果不是,有什么方法可以保证Action的线程安全,如果是,请说明原因
Struts1的实现底层是servlet,是单利的,所以在Struts1的开发过程中有很多的时候是需要注意单例导致的线程安全性的问题。
Struts2核心是拦截器,是多例的,每一次的请求都会创建一个新的实例出来,所以它本身是没有线程安全性问题的。
54、Spring的工作机制以及为什么要使用?
Spring的工作记机制:
1、 springmvc将所有的请求都提交给DispatcherServlet,它会委托应用系统
的其他模块负责对请求进行真正的处理工作。
2、 DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的
Controller。
3、 DispatcherServlet请求提交到目标Controller
4、 Controller进行业务逻辑处理后,会返回一个ModelAndView
5、 Dispatcher查询一个或多个ViewResolver视图解析器,找到
ModelAndView对象制定的视图对象 6、 视图对象负责渲染返回给客户端。
AOP:让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用AOP后,公共服务(日志、持久性、事务等)就可以分解成方面并应用到域对象上。同时不会增加域对象的对象模型的复杂性。
IoC:允许创建一个可以构造对象的应用环境,然后向这些对象传递他们的协作对象。如倒置所表明的,IoC就像反过来的JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此由容器负责管理协作对象(collaborator)
Spring既是一个AOP框架,也是一个IoC容器。Spring最好的地方是它有助于您替换对象。有了Spring,只要用JavaBean属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的写作对象。
55、写出两种Java设计模式中不同的单例模式singleton
1. /*第一种(懒汉,线程不安全):所谓懒汉,就是说当这个对象在需要进行获取的时候,再去对该对象进行创建*/ 2. public class Singleton{ 3. private static Singleton instance; 4. //通过将构造方法私有化达到,不能直接通过new 类名(),创建类的目的!!! 5. private Singleton(){} 6. public static Singleton getInstance(){ 7. if (instance == null){ 8. instance = new Singleton(); 9. } 10. return instance; 11. } 12. } 13. 14. /*第二种(懒汉,线程安全):这里的线程安全看起来十分的美好,但是效率却十分的低,所以一般的情况下不会使用这种方式*/ 15. public class Singleton { 16. private static Singleton instance; 17. private Singleton(){} 18. //通过在此使用同步方法,进行将其变成线程安全的!!! 19. public static synchronized Singleton getInstance(){ 20. if (instance == null) { 21. instance = new Singleton(); 22. } 23. return instance; 24. } 25. } 26. 27. /*第三种(饿汉 : 线程安全) : 当该类一旦进行加载(classLoader机制),就需要对其该类中的对象进行创建,同样因此也就使其避免了线程的安全问题*/ 28. public class Singleton { 29. private static Singleton instance = new Singleton(); 30. private Singleton(){} 31. public static Singleton getInstance() { 32. return instance; 33. } 34. } 35. 36. /*第四种(枚举):该方法是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,保证只有一个实例,即使使用反射机制也无法多次实例化一个枚举量*/ 37. public enum Singleton { 38. INSTANCE; 39. private Singleton(); 40. } 56、如果client已经有一个接口来访问所需要的服务,我们已经有现成的类来提供这样的服务,但是服务提供的方法和client访问所需要的方法不匹配,那么如何设计变成来提供client服务?
可以写一个代理类,将client中接口的方法写在代理类中,在代理类中调用服务提供的方法。如果用的spring的话,通过配置就能解决这个问题。