资讯Android 面试专辑Android面试问题专题分享

一个Java小白面试得力集团的收获

2017-11-16  本文已影响885人  cmazxiaoma

前言

昨天知道得力集团在某一个培训机构进行校园招聘。于是我今天就来了,听了一下宣讲内容。发现得力集团刚8月份在武汉成立了研究院,主要是做云服务,从0开始,现在的团队规模大概在20多人。一开始宣讲的是HR,后来就是技术总监,感觉技术总监给人一种很厉害的感觉。

不过薪资的确是太低了,4.5K - 5.5K,而且浮动的1k还要看学历。得力主要诱惑我的是云服务项目是从0开始,能让自己得到很大的提高。我的确心动了一下,心想先去面试一下,看自己的技术怎么样。

persistence.jpg

初面

我回答的很干净利落,然后进入了复试。复试面试官是一个HR和技术总监,很让我意外的是技术总监问的题目把我问懵逼了,我都无法完整的答上来。

面试的最后,技术总监问我有什么想说的吗,我就咨询了加薪的标准,然后HR顿时脸黑了,很不耐烦的跟我说一堆。我从她的话知道了,涨薪极小值是10%,极大值是30%。我顿时感觉无望了,考核标准还是一年,而且实习没有薪水。最后HR还问我挂科没有,我说挂了单片机。

HR一听脸又黑了,不耐烦的噼里啪啦的说了一堆。我现在对得力集团完全没有好感了,但是技术总监难倒我的问题,我还是需要复盘分析一波,毕竟学习是自己的。


关于复试的题目

观察者模式

这个模式我很熟悉,EventBus的实现就是基于这个模式。但是还是有必要的提起这个模式。

public class Subject {

    private List<Observer> observers = new ArrayList<Observer>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}
public abstract class Observer {

    protected Subject subject;

    public abstract void update();
}
 public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("binary=" + Integer.toBinaryString(subject.getState()));
    }
}
 public class OctalObserver extends Observer {

    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("octal:" + Integer.toOctalString(subject.getState()));
    }
}
public class ObserverPatternDemo {

    public static void main(String[] args) {
        Subject subject = new Subject();

        new BinaryObserver(subject);
        new OctalObserver(subject);

        subject.setState(15);

        subject.setState(10);
    }
}
image.png

POST和GET的区别

面试的时候,回答POSTGET的区别,受到了网上一些博客的误导。现在必须开始纠正了。


什么是幂等?


SpringMVC注解


Java序列化

面试官问我JavaSerializable序列化性能太差,问我如何高效的序列化。当时一脸懵逼,不知所云。现在回想起来,应该回答使用第三方序列化工具,也就是fastjson

图片来自互联网.png

写着写着,突然又想到了Externalizable接口。这是Java提供的另一种序列化机制,这种序列化方式完全由程序员决定存储和恢复对象数据。要实现该目标,Java类必须实现Externalizable接口。我们接下来写一个Demo

public class Person implements Externalizable {

    private String name;
    private int age;

    public Person(String name, int age) {
        System.out.println("有参数的构造器");
        this.name = name;
        this.age = age;
    }

    public Person() {
        System.out.println("无参数的构造器");
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(new StringBuffer(name).reverse());
        out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.name = ((StringBuffer) in.readObject()).reverse().toString();
        this.age = in.readInt();
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
public class ExternalizableDemo {

    public static void main(String[] args) throws IOException {
        File fileName = new File("externalizable.txt");
        FileOutputStream fos = new FileOutputStream(fileName);
        FileInputStream fis = new FileInputStream(fileName);
        ObjectOutputStream os = new ObjectOutputStream(fos);
        ObjectInputStream is = new ObjectInputStream(fis);

        try {
            Person person = new Person("cmazxiaoma", 21);
            os.writeObject(person);
            os.writeObject(person);

            Person newPerson = (Person) is.readObject();
            System.out.println(newPerson);
            System.out.println("两个person对象引用是否相等 :" + person == newPerson + "");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            close(is);
            close(os);
            close(fis);
            close(fos);
        }
    }

    public static void close(Closeable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关于对象序列化,还有几点需要注意。

在这里还需要说,Java序列化机制采用一种特殊的序列化算法,如下:


什么是NIO?

关于NIO这个概念,也是我学习Java知识所忽略的一个点吧。以前看博客的时候,零星的看过,当时没有什么在意。记得昨天技术总监问我NIO是什么? 我当时没听清他的回答,然后反问NIO是什么? 他跟我说NIO是异步IO,也就是Asynchronous IO的意思。当时一脸懵逼,不知所云。今天在掘金上面搜索了一下关于NIO的文章,也总结一波。

那么我们需要说同步和异步的区别了。

那么NIOIO有什么区别呢

区别说完了,那么开始NIO之旅了。

在Buffer中有3个重要的概念: 容量(capacity),界限(limit),位置(position)

接着就来说Buffer中的flip()clear()方法。

理论总结的很多,那么开始手写代码吧。

public class NIODemo {

    public static void main(String[] args) throws IOException {
        // methodOne();
        // methodTwo();
        methodThree();
    }

    public static void methodOne() throws IOException {
        String rFile = "nio_read.txt";
        String wFile = "nio_write.txt";
        FileChannel rFileChannel = new FileInputStream(rFile).getChannel();
        FileChannel wFileChannel = new FileOutputStream(wFile).getChannel();
        ByteBuffer buff = ByteBuffer.allocate(1024);

        while (rFileChannel.read(buff) > 0) {
            buff.flip();
            wFileChannel.write(buff);
            buff.clear();
        }

        close(wFileChannel);
        close(rFileChannel);
    }

    public static void methodTwo() throws IOException {
        String rFile = "nio_read.txt";
        String wFile = "nio_write.txt";
        FileChannel rFileChannel = new FileInputStream(rFile).getChannel();
        FileChannel wFileChannel = new FileOutputStream(wFile).getChannel();

        rFileChannel.transferTo(0, rFileChannel.size(), wFileChannel);

        close(wFileChannel);
        close(rFileChannel);
    }

    public static void methodThree() throws IOException {
        String rFile = "nio_read.txt";
        String wFile = "nio_write.txt";
        RandomAccessFile raf = new RandomAccessFile(rFile, "rw");
        FileChannel randomChannel = raf.getChannel();
        FileChannel wFileChannel = new FileOutputStream(wFile).getChannel();

        // 将Channel中的所有数据映射成ByteChannel
        ByteBuffer buff = randomChannel.map(FileChannel.MapMode.READ_ONLY, 0, raf.length());

        // 把Channel的指针移动到最后
        randomChannel.position(raf.length());
        wFileChannel.write(buff);

        close(wFileChannel);
        close(randomChannel);
    }

    public static void close(Closeable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考文献


注意事项


尾言

心之所向,素履以往。生如逆旅,一苇以航。总有一天,已百炼,遂成钢。

上一篇下一篇

猜你喜欢

热点阅读