Java面试题

1.什么是Java虚拟机?为什么Java被称作“平台无关的编程语言”?

答:Java源文件被javac编译器编译成二进制的.class字节码文件,而Java虚拟机就是可以执行Java字节码的虚拟机进程。Java被设计成允许应用程序运行在任意平台,而不需要程序员为每一个平台单独重写或重新编译。Java所谓跨平台就是在不同平台上安装不同的JVM。

2.静态方法与非静态方法能互相访问嘛?

答:非静态方法可以调用静态方法,但是静态方法不能调用非静态方法。因为静态方法随着类的创建而创建,非静态方法需要类的实例化之后创建,所以已经存在的方法去调用不存在的方法就会报错。

2-1.子类继承父类会继承什么?会不会继承静态方法?

答:子类会继承父类的所有非私有的方法,但是构造函数和静态方法不能继承,构造函数只能调用,静态方法是随着类的加载而创建,在运行时就已经分配内存且不能修改,如何子类又定义一个和父类同名的静态方法,那么只能再分配一段内存。

3.接口的作用?

答:Java中类不支持多继承,但是接口支持多继承。接口的作用是扩展对象的功能。一个子接口继承多个父接口,就相当于扩展了多个功能。

4.接口和抽象类的区别?

答:
(1)接口中所有的方法都是抽象的,抽象类里的方法可以是抽象的也可以是非抽象的
(2)类是单继承,只能通过子类继承父类实现方法,接口是多继承
(3)接口中的变量都是final,抽象类可以有非final

5.进程和线程的区别?

进程是执行着的应用程序,线程是进程内部的一个执行序列。一个进程可以有多个线程。
(1)进程间相互独立,同一个进程中的线程间共享,线程内不可见。
(2)线程上下文切换比进程上下文切换块

6.创建线程有几种方式?
四种方式
(1)继承Thread类
(2)实现Runnable接口
(3)创建线程池
(4)实现Callable接口
其中实现Runable接口更常用,因为不用继承Thread类,类不能多继承。同时,线程池也很高效。

7.线程的几种可用状态?

(1)创建:创建新的线程对象
(2)可运行:线程对象创建之后,其他线程调用了该对象的start方法,该状态的线程位于可运行的线程池中,等待运行。
(3)运行:可运行状态的线程获得CPU时间片,执行程序代码。
(4)阻塞:线程因某种原因放弃CPU的使用权,暂停运行
(5)死亡:线程结束生命周期,死亡的线程不在复生。

8.什么是死锁?

答:多个进程因竞争资源而造成的一种僵局。
(1)互斥条件:进程要求对所分配的资源进行排他控制,即在某一段时间内某资源仅为一个进程占有
(2)不剥夺条件:进程所获得的资源未使用完毕前不能被其他进程抢走,只能由自己释放
(3)请求和保持条件:进程已经保持一个资源,再去请求其他资源,这时候只能等待。
(4)循环等待条件:进程资源循环等待链,链中每一个进程已获的资源同时被链中下一个进程请求

8-1.synchronized与Lock的异同?
相同:都可以解决线程安全问题
不同:synchronized机制是执行完同步代码块之后自动释放同步监视器,Lock锁是先加锁lock(),之后手动释放锁unlock()。这样就是随时释放锁。

8-2.sleep()与wait()有什么异同?
相同:都可以让线程阻塞
不同:1)两个方法存在的类不同,sleep方法存在Thread类中,wait方法存在Object类中。2)使用地方不同,sleep方法可以使用在任何场景下,wait方法要使用在同步方法或同步代码块中。3)sleep方法调用时不会释放锁,wait方法调用释放锁

9.Java中集合类框架的基本接口有哪些?

答:
(1)Collection:代表一组对象,每一个对象都是它的子元素
(2)Set:有序不可重复元素
(3)List:无序可重复
(4)Map:哈希表是通过键值对对数据进行访问的,它通过把键值映射到表中的某个位置来加速查询效率的,如果一个位置存放多个数据,就会发生哈希碰撞,发生的哈希碰撞多了就会形成链表,大部分情况下哈希表的查询、删除、修改的速度是O(1),如果形成链表,就是O(n)。

10.HTTP和TCP/IP & get和post请求

答:HTTP的底层是TCP/IP,它是数据如何在万维网中通信的协议。get和post是HTTP协议中发送请求的两种方法。
例:在万维网这个世界中,TCP就是汽车,运送货物,不会缺件少件,很安全,但是路上的所有汽车都长得一样岂不是乱套,所以HTTP协议诞生,它就规范了TCP汽车,HTTP协议给TCP汽车规定了很多服务类别,比如,get,post,put,delete等

get与post区别:
(1)get请求会把参数放到URL后面,显示出来,对于私密的数据安全性不好,post把数据放到boby里
(2)get请求参数长度有限制,post没有
(3)get产生一个TCP数据包,post产生两个。因为get请求是直接把header和data发送出去,而post是先发送header,服务器响应之后,在发送data。这样说下来,或许get效率更高,因为它只发送一次,但是,对于网络环境好的情况下,发一次包和发两次包的时间差不多,对于网络环境不好的情况,两次TCP包在数据完整性上更有优势。

11.Session & Cookies

答 :Session应用于服务端,Cookies应用于客户端,Http就是通过Session和Cookies这两个发送一起合作来实现用户跟踪的。
Session是服务器跟踪用户的一种手段。每一个Session都有一个唯一表示Session ID,当服务器响应数据时,就会发送Cookies,这个Cookies就携带Session ID给客户端,客户端会保存这个Cookies,并且以后发送请求都会包含Session ID。
Cookies是将服务端的少量数据存到客户端硬盘或内存,或是从客户端读取数据的一种技术。

12.三次握手 & 四次挥手
答:
三次握手
第一次:客户端发送包给服务端,等待服务端响应
第二次:服务端接收来自客户端的包,再讲自己的包发送给客户端
第三次:客户端收到服务端的包并响应给服务端
在这里插入图片描述
四次挥手
第一次:客户端发送FIN给服务端
第二次:服务端回应ACK给客户端
第三次:服务端再发送FIN给客户端
第四次:客户端回应ACK给服务端
在这里插入图片描述

13.HTTP完成的请求过程

答:域名解析 ——发起TCP三次握手 ——建立TCP连接后发起HTTP请求 ——服务器回应HTTP请求,浏览器得到HTML代码 —— 浏览器解析HTML代码 —— 页面渲染给用户

14.“==” 与 equals()的区别

答: 首先“==” 是运算符,equals是方法。

==适用于基本数据类型和引用数据类型,对于基本数据类型的比较是不区分类型的,int与double也可以比较。对于引用数据类型比较的是对象的地址值是否相等

equals只适用于引用数据类型,在Object类中它的实现与==一样,但是像String、Date、File类里就重写了equals方法,比较的就是对象实体内容是否一样。重写equals方法是可以自动生成的。

15.toString():当输出一个对象的引用时,实际是在调用对象的toString方法,在Object类中。toString是一串地址值,但是String、Date、File重写了toString方法。

16.事务的四种隔离级别?

答:
第一种:读未提交(脏读):一个事务读取了另一个事务未提交的数据。
第二种:读提交的(不可重复):在一个事务中读取表中某一行数据,多次读取结果不一样
第三种:重复读(幻读):一个事务读取到别的事务插入的数据,导致前后结果不一样
第四种:序列化:这是隔离级别中最高级的,可以避免脏读、不可重复读、幻读。耗性能,不建议使用。
Mysql默认幻读

17.Comparable与Comparator的区别?

答:Java的对象正常情况下,只能进行比较== 或者 !=,但是在实际开发场景中,很多对象需要排序,所以需要两个接口Comparable、Comparator中的一个
Comparable(自然排序)
像String、包装类等实现了Comparable接口,重写了compareTo方法,对象之间就可以进行比较了。例如:Arrays.sort(str),排序字符串

自定义类操作步骤:
1.实现Comparable接口
2.重写CompareTo方法,定义排序方式

Comparator (定制排序)
自定义类操作步骤:
1.实现Comparator接口
2.重写compara方法,定义排序方式

二者区别: 实现Comparable接口的方式可以重复利用,而实现Comparator接口的方式只能在当前类中用,比较临时。

18、“==”和 equals()方法和hashCode()

hashCode用于返回对象的hash值,主要用于查找的快捷性,因为hashCode也是在Object对象中就有的,所以所有Java对象都有hashCode,在HashTable和HashMap这一类的散列结构中,都是通过hashCode来查找在散列表中的位置的。

如果两个对象equals,那么它们的hashCode必然相等,但是hashCode相等,equals不一定相等。

19.堆、栈、内存

(1)堆内存属于java 应用程序所使用, 栈内存属于线程所私有的, 它的生命周期与线程相同
(2)不论何时创建一个对象, 它总是存储在堆内存空间 并且栈内存空间包含对它的引用 . 栈内存空间只包含方法原始数据类型局部变量以及堆空间中对象的引用变量
(3)在堆中的对象可以全局访问, 栈内存空间属于线程所私有
(4) jvm 栈内存结构管理较为简单, 遵循LIFO 的原则, 堆空间内存管理较为复杂 , 细分为:新生代和老年代 etc…
(5) 栈内存生命周期短暂, 而堆内存伴随整个用用程序的生命周期

20.synchronized

synchronized是Java提供的一个并发控制的关键字。主要有两种用法,分别是同步方法和同步代码块。也就是说,synchronized既可以修饰方法也可以修饰代码块。它最大的特征就是在同一时刻只有一个线程能够获得对象的监视器(monitor),从而进入到同步代码块或者同步方法之中,即表现为互斥性(排它性)。大部分并发控制操作都能使用synchronized来完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值