- 1、说说JRE,JDK,JVM有什么区别?
- 2、Java的基本数据类型有哪些
- 3、Java的权限修饰符有哪些?
- 4、 Object类常见的方法有哪些
- 5、重载和重写的区别
- 6、String 和 StringBuffffer、StringBuilder 的区别是什么
- 7、什么是自动装箱与拆箱
- 8、== 与 equals的区别
- 9、final关键字的用法
- 10、final、finally、finalize的区别
- 11、Java中如何处理异常
- 12、接口和抽象类的区别
- 13、Java的集合体系
- 14、List接口下的实现类有哪些?它们之间的特点?
- 15、Set接口下的实现类有哪些?它们之间的特点?
- 16、Map接口下的实现类有哪些?它们之间的特点?
- 17、HashMap的实现原理
- 18、ConcurrentHashMap 和 HashTable 的区别
- 19、Http和Https的区别
- 20、Cookie和Session的区别、
- 21、Get 和 Post请求的区别?
- 22、Servlet的生命周期
- 23、TCP协议与UDP协议的区别
1、说说JRE,JDK,JVM有什么区别?
- JVM:Java虚拟机,只认识.class文件,是Java跨平台运行的核心;
- JRE:Java运行环境,它包含JVM外和Java的一些基本类库;
- JDK:是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
- 三者的关系是:一层层的嵌套关系,JDK>JRE>JVM
2、Java的基本数据类型有哪些
- 有四种基本数据类型:整数类型有:byte、short、int、long;浮点数类型有:float、double;字符类型有:char;布尔类型有:boolean
- 他们之间的类型转换有两种:
- 自动转换 :char、byte—>short—>int—>long—>float—>double (char和byte自动转换成short,short自动转换成int,int自动转换成long,long自动转换成float,float自动转换成double)
- 强制转换取值范围大的强转成小的的过程:
- 缺点:
- ①会损失精度,产生误差,小数点以后的数字全部舍弃。
- ②容易超过取值范围。
- 缺点:
- 记忆:8位:Byte(字节型)、16位:short(短整型)、char(字符型)、32位:int(整型)、float(单精度型/浮点型)、 64位:long(长整型)、double(双精度型)、boolean(布尔类型)
3、Java的权限修饰符有哪些?
- public:修饰类方法变量,对应的访问权限是:所有包下的任何类
- protected [prəˈtektɪd] :用protected修饰的类、方法、变量;protected修饰的类中的方法和成员变量,只能被子类访问,不论这个子类和父类是否在同一个包中
- default:如果类、方法、变量没有使用任何访问修饰符,对应的访问修饰符就是default,只有包内的任何类可以进行访问
- private:用private修饰的类、方法、变量、只有本类中可以访问。
4、 Object类常见的方法有哪些
- getClass();
- hashCode();
- equals();
- clone();
- toString();
- notify(); [ˈnoʊtɪfaɪ]
- notifyAll();
- wait();
- finalize() [ˈfaɪnəlaɪz]
5、重载和重写的区别
- 重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同(参数列表不同),方法返回值和访问修饰符可以不同,发生在编译时。
- 重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private 则子类就不能重写该方法。
6、String 和 StringBuffffer、StringBuilder 的区别是什么
- String:string类中使用final关键字修饰了字符数组保存字符串,该字符数组对象是不可变的,可以理解为常量,因此以String对象创建的字符串长度不可改变 ,线程安全,每次对String进行改变时都会生成一个新的对象;
- StringBuider:用它创建的字符串(长度)是可变的,且每次改变不会生成新的对象,没有对方法加同步锁,线程不安全,效率比SringBuffer快;
- StringBuffer:用它创建的字符串(长度)是可变的,且每次改变不会生成新的对象,对方法加同步锁,线程安全,效率比SringBuider慢;
7、什么是自动装箱与拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
8、== 与 equals的区别
- == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址);
- equals():如果类中重写了equals 方法则比较两对象的内容是否相等;如果没有重写equals 方法则比较的是地址值。
9、final关键字的用法
- final关键字主要用在三个地方:变量、方法、类。
- final修饰的变量是常量,一旦初始化后不能更改,如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象;
- final修饰的类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法;
- final修饰的方法不能被重写,可以重载
10、final、finally、finalize的区别
- final:关键字主要用在三个地方:变量、方法、类;final修饰的变量是常量不能被修改;final修饰的方法是私有(private)不可被调用;final修饰的类不能被继承,类中的所有成员方法都被指定为final方法;
- finally:是异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下;
- finalize:finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的(将对象从内存中清除出去之前做必要的清理工作,确定这个对象没有被引用时对这个对象调用)。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。
11、Java中如何处理异常
- Java中的异常父类是Throwable类,有两个重要的子类:Error(错误)和Exception(异常);Error的程序无法处理的错误,和代码无关,主要是JVM的错误(虚拟机运行错误,类定义错误);Exception是程序本身可以处理的异常,包括编译时异常和运行时异常(注意:需要了解常见的运行时异常有哪些?)
- 异常处理的方法:
- 1、抛异常,通过在方法名后面加throws+异常类刨出异常;
- 2、通过try()、catch()捕获异常:
12、接口和抽象类的区别
- 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法;
- 接口中的实例变量默认是 final 类型的,而抽象类中则不一定;
- 一个类可以实现多个接口,但最多只能实现一个抽象类;
- 一个类实现接口的话要实现接口的所有方法,而抽象类不一定;
- 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
13、Java的集合体系
- 单列集合:Collection:
- List—> ArrayList、LinkedList、Vector
- Set—> HashSet、LinkedHashSet、TreeSet
- Queue
- 双列集合:Map:
- Hashtable
- LinkedHashMap
- HashMap
- TreeMap
- ConcurrentHashMap
14、List接口下的实现类有哪些?它们之间的特点?
- ArrayList
- 优点: 底层数据结构是数组,因为数组基于索引查询,相对于linkedList查询快,效率高,可重复,有序性,但是因为底层是数组的原因,增删元素都必须要牵动整个数组中的元素,因而它对元素的增删效率比较低的;缺点: 线程不安全,。
- LinkedList
- 优点: 底层数据结构是链表,当将元素存到相对应的位置或者从相对应的位置删除时只需让前面的元素和当前元素相互记录地址值或将地址值相互断开,再让当前元素与下一个元素相互记录地址值或将地址值相互断开,这样就相对的效率高些,可重复性,有序性。缺点: 线程不安全,查询慢,
- Vector
- 优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程安全,效率低
15、Set接口下的实现类有哪些?它们之间的特点?
- HashSet底层数据结构是哈希表。(无序,唯一)如何来保证元素唯一性?1.依赖两个方法:hashCode()和equals()
- LinkedHashSet底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
- 1.由链表保证元素有序
- 2.由哈希表保证元素唯一
- TreeSet底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?自然排序比较器排序
- 2.如何保证元素唯一性的呢?根据比较的返回值是否是0来决定
16、Map接口下的实现类有哪些?它们之间的特点?
- Map集合是key,value格式的双列集合;Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。TreeMap是有序的,HashMap和HashTable是无序的。Hashtable是线程安全的,因此Hashtable效率较低。HashMap不是线程安全的,因此HashMap效率较高。如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized [ˈsɪŋkrənaɪzd] 关键字,而HashMap的源码中则没有。Hashtable不允许null值,HashMap允许null值(key和value都允许)父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap
17、HashMap的实现原理
- HashMap底层是数组和链表也就是链表散列,添加元素时HashMap 通过key 的hashCode 经过相应的处理过后得到 hash 值,然后通过数组长度经过哈希判断当前元素存放的位置,如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突;JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)及数组长度达到64时,将链表转化为红黑树,以减少搜索时间;当链表长度短于6的时候有会转化为链表;
- 扩容机制:HashMap默认长度16、达到75%的阀值会自动按其两倍的长度扩容;扩充后数据的位置变化:jdk1.8中在计算新位置的时候并没有跟1.7中一样重新进行hash运算,而是用了原位置+原数组长度这样一种很巧妙的方式,而这个结果与hash运算得到的结果是一致的,只是会更块。至于为什么新位置要么是原位置,要么是原位置+原数组长度的位置是由于每次扩容相当于数组长度的高位多了一个1,新的hash运算取决于hashCode在这一位上的值是0还是1,如果是0则无需变化位置,如果是1则位置为原位置+原数组长度的位置。1.8之后的尾插法和1.7的头插法有什么区别:JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。
18、ConcurrentHashMap 和 HashTable 的区别
- ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。
- 底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用分段的数组+链表实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的HashMap 的底层数据结构类似都是采用数组+链表的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
- 实现线程安全的方式(重要):①在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和CAS 来操作。(JDK1.6以后 对synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。②Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。
19、Http和Https的区别
- 1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用;
- 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议;
- 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;
- 4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
20、Cookie和Session的区别、
- Cookie是服务器给客户端发的一个“通信证”,无论谁访问服务器时都必须携带自己的“通行证”,这样服务器就可以通过“通行证”确定用户身份了。
- 由于HTTP协议是无状态的协议 ,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session了。
- 1、数据存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。
- 2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
- 3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。
- 5、会话机制不同:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie
21、Get 和 Post请求的区别?
- 1、GET请求的数据会暴露在地址栏中,而POST请求则不会。
- 2、两种请求传输数据的大小在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
- 3、安全性:POST的安全性比GET的高。这里的安全是指真正的安全,
- 4、HTTP中的GET,POST,SOAP协议都是在HTTP上运行的
22、Servlet的生命周期
- Servlet 加载—>实例化—>服务—>销毁
- 1、加载配置文件:加载Servlet容器;2、初始化阶段 :调用init()方法;3、响应客户请求阶段:调用service()方法;4、终止阶段:调用destroy()方法。
23、TCP协议与UDP协议的区别
- 1、TCP是可靠传输,UDP是不可靠传输(TCP有三次握手四次挥手的传输协议,UDP是丢包形式,不管你有没有接受到数据,会有数据丢失的情况发生);
- 2、TCP面向连接,UDP无连接;
- 3、TCP传输数据有序,UDP不保证数据的有序性;
- 4、TCP不保存数据边界,UDP保留数据边界;
- 5、TCP传输速度相对UDP较慢;
- 6、TCP有流量控制和拥塞控制,UDP没有;
