第一次面试,第一次写博客20170928
来源:互联网 发布:新疆卫生系统网络直报 编辑:程序博客网 时间:2024/06/05 05:15
今天在某公司面试,被问到以下知识,写出来让自己谨记。
1.在开发中单例模式的不同形式,分别应用在什么场景。
我的回答:懒汉式由于延时加载的特点,只在用到时才会创建实例,例如配置文件。
饿汉式在类加载时就完成初始化,类加载较慢,但获取实例快
正确答案:
我们到底什么时候选择懒加载,什么时候选择饿加载呢?
首先,饿汉式的创建方式对使用的场景有限制。如果实例创建时依赖于某个非静态方法的结果,或者依赖于配置文件等,就不考虑使用饿汉模式了(静态变量也是同样的情况)。但是这些情况并不常见,我们主要考虑的还是两种方法对空间和时间利用率上的差别。
饿汉式因为在类创建的同时就实例化了静态对象,其资源已经初始化完成,所以第一次调用时更快,优势在于速度和反应时间,但是不管此单例会不会被使用,在程序运行期间会一直占据着一定的内存;而懒汉式是延迟加载的,优点在于资源利用率高,但第一次调用时的初始化工作会导致性能延迟,以后每次获取实例时也都要先判断实例是否被初始化,造成些许效率损失。
所以这是一个空间和时间之间的选择题,如果一个类初始化需要耗费很多时间,或应用程序总是会使用到该单例,那建议使用饿汉模式;如果资源要占用较多内存,或一个类不一定会被用到,或资源敏感,则可以考虑懒汉模式。
摘自:http://blog.csdn.net/jswawawa/article/details/622228072.你用cookie时想没想过安全问题。
这个问题很尴尬,cookie确实很方便,但也确实存在安全问题,完全避免安全问题用户体验就不爽,所以个人认为,像现在的一些网站,给cookie设置一个生命周期,在一段时间内保存用户信息是一种折中的办法。
3.报表功能用的什么技术?简单说明下。
请看大佬经典代码讲解:http://www.cnblogs.com/hongten/p/java_poi_excel_xls_xlsx.html
4.springMVC用到哪些技术。
这个就不多说了,必须会的东西。
5.观察者模式
一个Observer接口:
[java] view plaincopy
- public interface Observer {
- public void update();
- }
两个实现类:
[java] view plaincopy
- public class Observer1 implements Observer {
- @Override
- public void update() {
- System.out.println("observer1 has received!");
- }
- }
[java] view plaincopy
- public class Observer2 implements Observer {
- @Override
- public void update() {
- System.out.println("observer2 has received!");
- }
- }
Subject接口及实现类:
[java] view plaincopy
- public interface Subject {
- /*增加观察者*/
- public void add(Observer observer);
- /*删除观察者*/
- public void del(Observer observer);
- /*通知所有的观察者*/
- public void notifyObservers();
- /*自身的操作*/
- public void operation();
- }
[java] view plaincopy
- public abstract class AbstractSubject implements Subject {
- private Vector<Observer> vector = new Vector<Observer>();
- @Override
- public void add(Observer observer) {
- vector.add(observer);
- }
- @Override
- public void del(Observer observer) {
- vector.remove(observer);
- }
- @Override
- public void notifyObservers() {
- Enumeration<Observer> enumo = vector.elements();
- while(enumo.hasMoreElements()){
- enumo.nextElement().update();
- }
- }
- }
[java] view plaincopy
- public class MySubject extends AbstractSubject {
- @Override
- public void operation() {
- System.out.println("update self!");
- notifyObservers();
- }
- }
测试类:[java] view plaincopy
- public class ObserverTest {
- public static void main(String[] args) {
- Subject sub = new MySubject();
- sub.add(new Observer1());
- sub.add(new Observer2());
- sub.operation();
- }
- }
输出:
update self!
observer1 has received!
observer2 has received!6.工厂模式
11、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
举例如下:(我们举一个发送邮件和短信的例子)
首先,创建二者的共同接口:
[java] view plaincopy
- public interface Sender {
- public void Send();
- }
其次,创建实现类:
[java] view plaincopy
- public class MailSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is mailsender!");
- }
- }
[java] view plaincopy
- public class SmsSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is sms sender!");
- }
- }
最后,建工厂类:
[java] view plaincopy
- public class SendFactory {
- public Sender produce(String type) {
- if ("mail".equals(type)) {
- return new MailSender();
- } else if ("sms".equals(type)) {
- return new SmsSender();
- } else {
- System.out.println("请输入正确的类型!");
- return null;
- }
- }
- }
我们来测试下:
- public class FactoryTest {
- public static void main(String[] args) {
- SendFactory factory = new SendFactory();
- Sender sender = factory.produce("sms");
- sender.Send();
- }
- }
输出:this is sms sender!
22、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
将上面的代码做下修改,改动下SendFactory类就行,如下:
[java] view plaincopypublic class SendFactory {public Sender produceMail(){
- return new MailSender();
- }
- public Sender produceSms(){
- return new SmsSender();
- }
- }
测试类如下:
[java] view plaincopy
- public class FactoryTest {
- public static void main(String[] args) {
- SendFactory factory = new SendFactory();
- Sender sender = factory.produceMail();
- sender.Send();
- }
- }
输出:this is mailsender!
33、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
[java] view plaincopy
- public class SendFactory {
- public static Sender produceMail(){
- return new MailSender();
- }
- public static Sender produceSms(){
- return new SmsSender();
- }
- }
[java] view plaincopy
- public class FactoryTest {
- public static void main(String[] args) {
- Sender sender = SendFactory.produceMail();
- sender.Send();
- }
- }
输出:this is mailsender!
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
2、抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。
请看例子:
[java] view plaincopy
- public interface Sender {
- public void Send();
- }
两个实现类:
[java] view plaincopy
- public class MailSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is mailsender!");
- }
- }
[java] view plaincopy
- public class SmsSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is sms sender!");
- }
- }
两个工厂类:
[java] view plaincopy
- public class SendMailFactory implements Provider {
- @Override
- public Sender produce(){
- return new MailSender();
- }
- }
[java] view plaincopy
- public class SendSmsFactory implements Provider{
- @Override
- public Sender produce() {
- return new SmsSender();
- }
- }
在提供一个接口:
[java] view plaincopy
- public interface Provider {
- public Sender produce();
- }
测试类:
[java] view plaincopy
- public class Test {
- public static void main(String[] args) {
- Provider provider = new SendMailFactory();
- Sender sender = provider.produce();
- sender.Send();
- }
- }
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
- 第一次面试,第一次写博客20170928
- 第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客
- 我第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客文章
- 我第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客
- 第一次写博客!
- 第一次写博客
- 第一次写博客文章
- 【codevs 1001】舒适的路线
- div显示未展示内容,有条件的隐藏内筒
- Android--------工具类StatusBarUtil实现完美状态栏
- 数据库服务器构建和部署最佳实践
- 【牛客网】直通bat-面试算法精品课_第2章 排序 2.6 快速排序练习题(JAVA版)
- 第一次面试,第一次写博客20170928
- Unity AssetBundle爬坑手记
- 欢迎使用CSDN-markdown编辑器
- Json转Markdown表格代码实现
- Spring 源码解析之HandlerAdapter源码解析(二)
- hadoop 2.7.2 yarn中文文档—— Capacity Scheduler
- 网络请求图片
- 常见的负载均衡算法
- 第二阶段