Java自测题

来源:互联网 发布:tw 域名yaoqiu 编辑:程序博客网 时间:2024/05/18 00:54

来源于牛客网 含笑666的文章,原文地址 http://www.imooc.com/article/9375
看了一段时间的书了,也在牛客APP上刷了不少题。打算对照着题目自测一下。我会逐渐将答案更新到对应题目下面。自测答案!难免有理解不到位的地方,不保证完全正确!
J2SE基础
1、8种基本数据类型的大小,以及他们的封装类。
boolean
char 16bit Character
byte 8bit Byte
short 16bit Short
int 32bit Integer
long 64bit Long
float 32bit Float
double 64bit Double

2、Switch能否用string做参数?
Java 1.7之后可以
3、equals与==的区别。
大致上来说,equals比较的是内存空间对应的值是否相同。“==”运算符是比较是否指向同一块地址空间。对于引用类型对象和基本类型对象还有所不同,。基本类型对象和其包装类在比较时会对包装类进行拆包,只要数值上相等就返回true。引用变量类型必须要求指向同一对象。
4、Object有哪些公用方法?
只说几个常见的吧。
wait():线程进入等待,等待notify或者notifyAll唤醒
clone():返回对象副本
hashcode():返回对象散列值
notify():唤醒单个线程
notifyAll():唤醒所有线程
toString():对象的字符串表示,多用于打印
equals(obj):比较对象
getClass()返回此 Object 的运行时类。

5、Java的四种引用,强弱软虚,用到的场景。
强引用:不会被GC回收的引用。见的最多的应该是Object obj = new Object()
弱引用:GC线程一发现它就回回收
软引用:内存空间够就不回收,不够就回收
虚引用:虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。
(这题的场景我见的很少,理解不透彻。答案是找来的。)

6、Hashcode的作用。
在HashMap HashSet中,hashCode()方法返回的Hashcode是判断放进容器里的两个对象是否相等的依据。如果自己写容器,那就修改覆写hashCode()方法
7、ArrayList、LinkedList、Vector的区别。
三者都是List接口的实现类。前两个是线程不安全的,Vector是线程安全的。
ArrayList是基于数组实现的,LinkedList是基于链表实现的。前者适用于随机访问多的场合,后者适用于增加删除多的场合。LinkedList可用于模拟实现栈及队列。

8、String、StringBuffer与StringBuilder的区别。
String对象是不可变类型(8种基本类型的包装类和String类都是不可变immutable类),不能对其进行修改。一个String类型的引用发生改变的时候,会指向一个新的对象,但原对象不变。
StringBuffer和StringBuilder的功能类似,StringBuffer是线程安全的。

9、Map、Set、List、Queue、Stack的特点与用法。
Map:key-value映射
Set:无序不可重复集合
List:有序可重复集合
Queue:队列 先进先出
Stack:栈 先进后出

10、HashMap和HashTable的区别。
在Java语言里为HashMap类和Hashtable类。注意后者命名不符合驼峰原则,明显是老的实现类了。Hashtable是线程安全的。不过现在可以用Collections工具类来让HashMap也变成线程安全的。
11、HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
1)HashMap本质是Entry数组加链表。根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面。
2)ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁的几率,提高并发效率。
HashMap的底层源码要说啥?Entry吗?

12、TreeMap、HashMap、LindedHashMap的区别。
TreeMap可以用来对Map集合中的key进行排序。
HashMap允许null作为键,null作为值。替代了Hashtable.
LinkedHashMap可以保证HashMap集合有序。存入的顺序和取出的顺序一致

13、Collection包结构,与Collections的区别。
Collection包有List和Set、Map子接口。
Collections是集合工具类,包括有搜索、排序、线程安全化的一些方法。

14、try catch finally,try里有return,finally还执行么?
try里return的值会暂时保存,等执行完finally之后返回。特殊情况,finally中也有return,那么try里面的return就不能执行了。
15、Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
Excption和Error都是Throwable 的子类。Excption下还有RuntimeException (运行时异常),除此之外都是检查异常。
OOM(OutOfMemory) 可能是出现内存泄露。或者是堆区设置太小。虚拟机栈、本地方法栈、常量池、方法区都有可能出现OOM。
SOF(StackOverFlow)递归次数过多的情况下会出现。
(这道题要看深入理解Java虚拟机那本书才行)

16、Java面向对象的三个特征与含义。
封装:对象的状态信息被尽可能隐藏,只提供有限接口与外界交互。
继承:子类表现父类的特性
多态:将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。最明显的地方就是函数的重载(同一个类中)和覆盖(子类和父类之间)。

17、Override和Overload的含义去区别。
Override:覆盖,发生在子类和父类之间。方法名和参数类型、顺序完全相同,是一种全新的实现。
Overload,重载,发生在同一个类里。有几个方法的方法名相同,但是参数不同(参数类型、顺序、个数)。

18、Interface与abstract类的区别。
抽象类可以有自己的数据成员。接口一般不定义数据成员。
抽象类中的方法没有实现(即不会有{}),可以是私有的。接口中的方法默认是public,abstract 类型,不可以是私有。
抽象类中的变量可以是私有的。接口中的变量都是public final static,必须有初值,且实现类中不能修改。

19、Static class 与non static class的区别。
不是很明白这道题的问法。是说内部类的吗??静态内部类不需要外部类实例就可以实例化,而非静态内部类需要外部类实例才能实例化。
20、java多态的实现原理。
子类继承父类。子类覆盖父类方法。父类引用对象指向子类对象。如果是问底层实现原理的话,现在还不懂。
21、实现多线程的两种方法:Thread与Runable。
1)写一个类继承Thread类,声明该类的对象,并调用start方法
2)写一个类实现Runable接口,声明该类的对象作为Thread基类的target。
3)实现Runnable接口比继承Thread类所具有的优势:
A:可以避免java中的单继承的限制
B:多个线程可以共享同一个target对象(包括该target线程类中的实例属性),适用多个相同线程处理统一份资源的情况。

23、线程同步的方法:sychronized、lock、reentrantLock等。
1)sychronized关键字可以加到方法声明处(同步方法),也可以在方法体内部,在进行操作前使用sychronized(Obj){具体方法},其中obj就是同步资源,也称为同步监视器。
2)lock和reentrantLock我只知道后一个,声明了ReentranLock对象lock之后,在需要对某个方法实现线程安全控制时,先lock.lock()加锁,最后在finally块中unlock()释放锁。

24、锁的等级:方法锁、对象锁、类锁。
方法锁和对象锁可以参考23题synchronized关键字提到的地方。
类锁:以一个静态变量(或者class对象(类名.class))作为锁对象,或者以sychronized关键字修饰一个静态方法(因为即使通过类的实例调用静态方法,实质上还是以类来调用);此时锁住对象是一个类,而不是一个对象。

25、写出生产者消费者模式。

package ProducerConsumer;public class ProducerConsumerTest {    public static void main(String[] args) {        CubbyHole c = new CubbyHole();        Producer p1 = new Producer(c, 1);        Consumer c1 = new Consumer(c, 1);        p1.start();        c1.start();    }}class CubbyHole {//创建一个文件架作为共享资源    private int contents;//访问文件架可以获得内容    private boolean available = false;//初始状态为false,consumer消费者get不到任何东西    public synchronized int get() {        while (available == false) {            try {//当文件架没有内容可以访问时。调用wait进行阻塞,等待生产者线程的唤醒。此时同步监视器就是cubbyhole对象。                wait();            } catch (InterruptedException e) {                // TODO: handle exception            }        }        available = false;//消费者消耗了一个资源,所以又变成false        notifyAll();//唤醒生产者开始干活啦        return contents;    }    public synchronized void put(int value) {        while (available == true) {            try {//当文件架上还有东西时,生产者暂停干活。                wait();            } catch (InterruptedException e) {                // TODO: handle exception            }        }        contents = value;//生产者将内容准备好,完成生产。        available = true;//将可用标记置真        notifyAll();//唤醒消费者进行消费    }}class Consumer extends Thread {    private CubbyHole cubbyHole;    private int number;    public Consumer(CubbyHole c, int number) {        this.cubbyHole = c;        this.number = number;    }    public void run() {        int value = 0;        for (int i = 0; i < 10; i++) {            value = cubbyHole.get();            System.out.println("Consumer #" + this.number + " got:" + value);        }    }}class Producer extends Thread {    private CubbyHole cubbyhole;    private int number;    public Producer(CubbyHole c, int number) {        this.cubbyhole = c;        this.number = number;    }    public void run() {        for (int i = 0; i < 10; i++) {            cubbyhole.put(i);            System.out.println("Producer #" + this.number + " put:" + i);            try {                sleep((int) (Math.random() * 100));            } catch (InterruptedException e) {                // TODO: handle exception            }        }    }}

26、ThreadLocal的设计理念与作用。
线程局部变量,每个线程有一个该变量的副本,避免并发访问的线程安全问题。主要目的是为了隔离线程的数据共享,不能代替同步。
声明方法:public/private ThreadLocal xxx = new ThreadLocal<>();

27、ThreadPool用法与优势。
先预先创建大量空闲的线程,当程序将runnable对象传给线程池,线程池就会启动一个空闲线程,任务完成后又回收。避免了每次都要创建线程的操作。
其中一种示例代码:
ExecutorService pool = Executors.newFixedThreadPool(7);
pool.submit(new myRunnableThread());

28、Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
挖个坑,这个内容还没看
29、wait()和sleep()的区别。
wait()是Object类的方法,会释放对象的锁。等待其他对象调用notify或者nitifyAll才能被唤醒。只能在同步控制块里面用(因为是同步监视器Object嘛)。
sleep()是Thread类的方法,不释放锁。

30、foreach与正常for循环效率对比。
循环ArrayList时,普通for循环比foreach循环花费的时间要少一点(差距不大);循环LinkedList时,普通for循环比foreach循环花费的时间要多很多。
31、Java IO与NIO。
挖坑,这个地方还没看
32、反射的作用与原理。
作用:能够程序在运行的时候能够获取自身的信息。能获取到的信息包括类、方法、变量等。
原理:jvm通过字节码class文件,生成相应的对象。就像正常生成一个对象一样,都是来源于字节码class文件,之所以叫反射,只是因为他不像正常的对象声明,如A a=new A()的方式。

33、泛型常用特点,泛型为String类型的List能否转为泛型为Object类型的List。
泛型只在编译期起作用,运行时泛型都会被擦除。另外因为List可以存储任何类型的对象包括String, Integer等等,所以可转换
34、解析XML的几种方式的原理与特点:DOM、SAX、PULL。
不会。
35、Java1.8新特性。
挖坑,我只了解Lambda 表达式

JVM
1、内存模型以及分区,需要详细到每个区放什么。
2、堆里面的分区:Eden,survival from to,老年代,各自的特点。
3、对象创建方法,对象的内存分配,对象的访问定位。
4、GC的两种判定方法:引用计数与引用链。
5、GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
6、GC收集器有哪些?CMS收集器与G1收集器的特点。
7、Minor GC与Full GC分别在什么时候发生?
8、几种常用的内存调试工具:jmap、jstack、jconsole。
9、类加载的五个过程:加载、验证、准备、解析、初始化。
10、双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
11、分派:静态分派与动态分派。
推荐书籍:《深入理解java虚拟机》

TCP/IP
1、OSI与TCP/IP各层的结构与功能,都有哪些协议。
2、TCP与UDP的区别。
3、TCP报文结构。
4、TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
5、TCP拥塞控制。
6、TCP滑动窗口与回退N针协议。
7、Http的报文结构。
8、Http的状态码含义。
9、Http request的几种类型。
10、Http1.1和Http1.0的区别
11、Http怎么处理长连接。
12、Cookie与Session的作用于原理。
13、电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
14、Ping的整个过程。ICMP报文是什么。
15、C/S模式下使用socket通信,几个关键函数。
16、IP地址分类。
17、路由器与交换机区别。
网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。
推荐书籍:《TCP/IP协议族》

数据结构与算法
1、链表与数组。
2、队列和栈,出栈与入栈。
3、链表的删除、插入、反向。
4、字符串操作。
5、Hash表的hash函数,冲突解决方法有哪些。
6、各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
7、快排的partition函数与归并的Merge函数。
8、对冒泡与快排的改进。
9、二分查找,与变种二分查找。
10、二叉树、B+树、AVL树、红黑树、哈夫曼树。
11、二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
12、图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
13、KMP算法。
14、排列组合问题。
15、动态规划、贪心算法、分治算法。(一般不会问到)
16、大数据处理:类似10亿条数据找出最大的1000个数………等等

推荐书籍:《大话数据结构》《剑指offer》《编程之美》

0 0
原创粉丝点击