一、java基础
1.java中的几种基本数据类型是什么,各自占用多少字节?
java分为两种数据类型:
1.基本数据类型
2.引用数据类型,如,类,接口,数组
基本数据类型:8种
1)byte 1个字节,-128~127
2)short 2个字节,-32768~32767
3)int 4个字节
4)long 8个字节
5)float 4个字节
6)double 8个字节
7)char 2个字节
8)boolean 1或4个字节,一个字节表示,至少也得用一个字节来表示,4个字节,32位的CPU每次处理4个字节,效率问题。
2.String类能被继承吗?为什么?
不能,应该改类final类,不能被继承
3.String,StringBuffer,StringBuilder的区别。
String对象一旦被创建,里面的值便不可改变,需要改变就需要创建新的对象
StringBuffer和StringBuilder是可变的,里面的值改变而不需要创建新的对象。
StringBuffer是线程安全的,性能低。
StringBuilder是线程不安全,性能高。
4.ArrayList和LinkedList有什么区别。
都实现了List接口。
ArrayList的底层实现原理是数组类型,数组类型代表着,查询快,但是插入和删除慢,需要查询某个值时,直接通过索引,时间复杂度O(1)。当需要插入某个值时,在这个位置后面的值都得向后移动一位,物理上是一段连续内存。
LinkedList底层实现是链表,链表则表示查询慢,新增删除快,删除,只需要改变,指针的指向,当然在java中没有指针这一概念
5.类的实例化对象
类的实例化顺序,最先执行的是父类的静态数据->子类的静态数据->父类的构造方法->子类的构造方法,记住两个顺序,父静子静,父构构子构构,先静态,先父类。
6.用过哪些Map类,都有什么区别?
直接实现了map接口的主要有HashMap和AbstractMap以及Hashtable。而TreeMap和ConcurrentHashMap都继承与AbstractMap.
区别:
1)HashMap的底层数据结构是数组加链表。每一个entry都有一个key,value,当不同的key经过hash函数运算之后得到了一个相同的值,这个时候便发生了hash冲突。便会把value值存在一个数组里面。而多个entry便构成一个数组。允许key,value为null。采用链表可以有效的解决hash冲突。
2)Hashtable方法是同步的,也就是线程安全的,key和value都不能为空。
3)CurrentHashMap是线程安全的,采用了分段锁,在java1.8之后放弃的分段锁的使用。
4)TreeMap底层的数据结构是有顺序访问的红黑树。
7.抽象类和接口的区别?
抽象类:可以有默认的方法实现,可以有构造器,不可以实例化,可以有public,protected,default。可以有main方法,可以运行main放法。
接口:没有方法的实现,没有构造器,不可以实例化,只要public。不可以有main方法。
8.IO模型有哪些。
BIO:同步阻塞IO,意思是当进行IO操作时,我们的一个线程对应一个IO操作。并且是阻塞的。假如socket通信,当客服端没有发送信息到服务端时,服务器上这个线程便一直阻塞在这里,不会向下执行。
NIO:同步非阻塞,采用的原理主要是轮询。当多个IO操作同时存在时,一个线程便可以解决,线程先走到一个IO操作的代码处,如果此时通道并没有数据,也不需要写入,线程会继续走,访问下一个IO操作,就这样不停的轮询访问,当通道有数据了,并且需要读取的时候,线程便执行读操作。
AIO:异步非阻塞,也成为NIO2是NIO的改进版,每一个IO操作都会有一个回调函数。线程不会去轮询,当某个IO需要读取或写入数据时,便会执行回调函数,线程便在此处。
reactor:基于事件处理。
9.fianl的用途
表示最终类,不能被继承
1)final关键字提高了性能,JVM和Java应用都会缓存final变量
2)final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销
3)使用final关键字,JVM会对方法。变量及类进行优化
用途:常量;多线程共享
10.请写出三种单例模式
1.饿汉模式
public class Student{
private static final Student student = new Student();
private Student(){}
public static Student getInstance(){
return student;
}
}
2.懒汉模式
public class Student{
private static Student student=new Student();
private Student(){}
public static Student getInstance(){
synchronized(Student.class){
if(student == null){
return new Student();
}
return student;
}
}
}
3.静态内部类实现(登记者模式)
public class Student{
private Student(){}
private static Student getInstance(){
return Holder.student;
}
private static class Holder{
private static Student student=new Student();
}
}
11.如何在父类中为了子类自动完成所有的hashcode和equals实现?这么做有何优劣
Object是所有类的父类,里面封装了hashcode本地方法和equals方法。
如果我们自定义父类,来重写hashcode方法和equals方法
优势:这个不用说了,所有的类都享有父类的方法
劣势:当前我们的子类拥有不同的属性时,而这个属性有需要作为判断是否相等,这时候我们还是需要自己重写父类的方法,而在java中继承是不推荐使用的。
12.error和exception的区别,CheckedException,RuntimeException的区别
简单来说,Error是系统级错误,是程序员不可控的;Exception是应用程序的错误,分为检查异常和非检查异常。
CheckedException,检查异常也叫编译异常,必须处理,在代码中捕获或者抛出
RuntimeException,非检查异常也叫运行时异常,不必须要求处理。
13.请列出5个运行时异常
IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
ArithmeticException(算术运算异常,如除数为0)
ArrayStoreException(向数组中存放于与声明类型不兼容对象异常)
SecurityException(安全异常)
14.a.hashcode()有什么用,与a.equals(b)有什么关系?
在没有重写这两个方法的情况下,同一个对象的hashcode一定相同,不同的hashcode有可能不同,也有可能相同
equals方法即在比较两个对象是同一个对象
两点:同一个对象,equals一定为true,hashcode一定相同
不同对象,equals一定为false,hashcode有可能相同
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
后期慢慢更新,再加进去