Java面试题

一、Java基础

1.面向对象有哪些特性?

封装、继承、多态、抽象

封装:把类的信息封装在类的内部,不让外面的程序直接访问

继承:从已有的类中派生出新的类,新的类继承父类的属性和行为,并扩展新的能力

多态:同一个行为具有不同的表现形式的能力。实现多态的三要素:继承、重写、父类引用指向子类对象

抽象:把客观事物用代码抽象出来

2、Java的基本数据类型有哪些?

char           16bit

byte           8bit

int              32bit

long           64bit

double       64bit

float           32bit

boolean     1bit和4bit都有可能

short          16bit

3、String 类的常用方法有哪些?

charAt()      返回指定索引的字符

indexOf()    返回字符的索引

replace()    字符串替换

split()          分割字符

length()       返回string的长度

equals()     比较字符

getBytes()  返回字符串的byte类型数组

4、堆和栈和方法区的区别

:存储对象本身,被使所有线程共享,一个jvm只有一个堆                                                                   new创建的实例化对象及数组,是存放在堆内存中,用完之后靠垃圾回收机制不定期自动消除 

:方法调用时进栈,存储堆中的对象引用、存储基本数据类型                                                             基本数据类型、局部变量都是存放在栈中的,用完就消失

方法区:被线程共享的区域,一个jvm只有一个                                                                                                 虚拟机在完成类装载操作后,将class文件中的常量池载入内存中,并保存在方法区中

数据段:存放类变量、常量。
代码段:存放方法的定义。

 5、判断float类型是否等于0

Math.abs(num)<0.001

6、Math类中的方法

abs()取绝对值

round()四舍五入

random() 随机

sqrt()平方根

7、访问修饰符public,private,protected,以及不写时的区别?

public        所有类都可以访问

protected  对同包和子类可以访问

default      对同包公开,子类不行

private      除了本类都不行

8、java 实例变量 , 局部变量 , 类变量和 final 变量

实例变量: 定义在类中的变量是类的成员变量,可以不进行初始化, java 会自动进行初始化。(如果是引用类默认初始化为 null, 如果是基本类型,默认初始化为 0 )

局部变量 :定义在方法中的变量,必须进行初始化,使用没有进行赋值的局部变量才会报错。

类变量 :(也叫作静态变量)是类中独立于方法之外的变量,用 static 修饰。

final 修饰的变量: 也称为常量。
 

8、下面两个代码块能正常编译和执行吗

short s1 = 1;
s1 = s1 + 1;

s1 += 1;

s1 = s1 + 1;错误:s1+1运算时会自动转换成int类型,最终赋值的目标s1为short类型,因为int类型所占空间大于short,会导致数据丢失

s1 += 1; 正确:使用拓展赋值运算符(+=)时,系统会自动帮外面强制类型转换:(T1) a=(T1)(a+b)

9、Java的向上转型与向下转型

向上转型:将子类转化为父类

向下转型:将父类转化为子类

10、Java类加载的执行顺序?

超类的静态变量和代码块-->父类的静态变量和代码块-->子类的静态变量和代码块-->超类的非静态变量和代码块-->超类的构造器-->父类的非静态变量和代码块-->父类的构造器-->子类的非静态变量和代码块-->子类的构造器

注意:静态与对象无关只会加载一次

11、怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串?

String(byte[] bytes, Charset charset)
          通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

11、 String、StringBuilder、StringBuffer的区别及使用场景

String一旦定义就不可改变,可空赋值。操作少量数据时使用。
StringBuilder 可改变,线程不安全。操作单线程大量数据时使用。
StringBuffer 可改变,线程安全。操作多线程大量数据时使用。

12、Thread类中的sleep()方法和对象中的wait()方法有什么区别?

sleep():Thread类中的静态方法,此方法会让当前线程暂停执行指定时间,将cpu让给其他线程,但对象的锁依然保持,因此休眠时间结束会自动恢复(线程回到就绪状态)。

wait():调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池,只有调用对象的notify()方法/notifyAll()方法时才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就能进入就绪状态。

13、JVM加载class文件的原理机制

14、线程中的状态(最好答JDK1.8之后)

15、 7种结构型设计模式

二、Java集合

1、HashMap的put方法的具体流程

判断键值对table是否为空或null,否则执行resize()扩容

①hashCode()得到k对应的hash值,和现在hashmap的数值长度相&得到数组下标i

②如果table[i]==null,把v赋给table[i]

③table[i]!=null,如果k一样的话就覆盖当前的v                                                                                                                     不一样的话,如果table[i]是红黑树的话就在红黑树中插入键值对                                                                                    table[i]是链表的话就放到链表尾部,然后判断链表长度是否大于8,如果大于8,链表就转换成红黑树  

2、HashMap的resize()方法的具体流程

3、红黑树

三、数据结构与算法

1、现有一字符串"hello world",使用哈夫曼编码最少使用多少bit内存:()

①先用字符和权重构建哈夫曼树

 ②结果 等于 叶子节点路径 * 权重 相加

2、假设一个数组采用快速排序,则下面的选项中,不可能是第3趟排序结果的是

快速排序一趟确定1个或者2个点的最终位置,如果是第一次,确定1个。

第二次以后,如果基点在最左边或者最右边确定1个点最终位置。

如果在中间,那么确定2个点的最终位置 

3、十种排序算法

①冒泡排序

 

四、Java框架面试题

1、SpringMVC的底层原理

①客户端发送请求到DispatcherServlet

②DispatcherServlet调用HandlerMapping,找到对应的处理器映射器生成处理器对象返回给DispatcherServlet,如果有拦截器,返回相对应的拦截器对象给DispatcherServlet

③DispatcherServlet调用HandlerAdapter,适配调用具体的处理器

④方法上添加了@ResponseBody,通过HttpMessageConverter来返回结果转换为JSON来响应

2、SpringBoot自动装配

3、Spring中的AOP

aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

①基本术语:

Aspect(切面) : 由切入点和通知组成,它既包含了横切逻辑的定义,也包含了切入点的定义。

joinPoint(连接点):程序执行过程中明确的点

PointCut(切入点) :切入点是对连接点进行拦截的条件定义

Advice(通知):指拦截到连接点之后要执行的代码

②示例

@Component
@Aspect // 切面
public class LogAspect {
 private final static Logger LOGGER = LoggerFactory.getLogger(LogAspect.class.getName());
 // 切入点,表达式是指com.remcarpediem.test.aop.service
 // 包下的所有类的所有方法
 @Pointcut("execution(* com.remcarpediem.test.aop.service..*(..))")
 public void aspect() {}
 // 通知,在符合aspect切入点的方法前插入如下代码,并且将连接点作为参数传递
 @Before("aspect()")
 public void log(JoinPoint joinPoint) { //连接点作为参数传入
 if (LOGGER.isInfoEnabled()) {
 // 获得类名,方法名,参数和参数名称。
 Signature signature = joinPoint.getSignature();
 String className = joinPoint.getTarget().getClass().getName();
 String methodName = joinPoint.getSignature().getName();
 Object[] arguments = joinPoint.getArgs();
 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();

 String[] argumentNames = methodSignature.getParameterNames();

 StringBuilder sb = new StringBuilder(className + "." + methodName + "(");

 for (int i = 0; i< arguments.length; i++) {
                Object argument = arguments[i];
                sb.append(argumentNames[i] + "->");
                sb.append(argument != null ? argument.toString() : "null ");
 }
 sb.append(")");
 LOGGER.info(sb.toString());
 }
 }
}

五、计算机网络面试题

1、tcp和udp的区别是什么,他们实际的应用场景有哪些?

tcpudp
可靠性可靠不可靠
连接面向连接无连接
报文面向字节流面向报文
效率
双工全双工一对一、一对多、多对一、多对多
传输速度

应用场景

tcp:①http ②FTP ③SMTP ④QQ文件传输

udp:①QQ语音 ②QQ视频

2、常用HTTP状态码是怎么分类的,有哪些常见的状态码?

1xx指示信息-表示请求已接受,正在处理
2xx成功
3xx重定向
4xx客户端错误
5xx服务器端错误

3、tcp的三次握手

三次握手时建立可靠的通信信道,主要的目的是双方确认自己与对方的发送和接受机能正常            ①第一次握手:客户端向服务器发送SYN,请求连接 ,进入SYN_SEND状态                                  ②第二次握手:服务端接受连接请求,发送一个确认收到和请求连接 ,进入SYN_SEND状态        ③第三次握手:客户端接受连接请求+确认,向服务器发送确认,客户端和服务器都进入ESTABLISHRED状态。

4、tcp的四次挥手

①客户端对服务器发送关闭连接请求                                                                                                  ②服务器收到客户的关闭连接请求后,回复一个确认收到的消息                                                      ③服务器确定不再给客户端发送请求后,对客户发送准备关闭连接的消息                                        ④客户收到服务器要关闭连接的消息给服务器发送:已收到关闭连接的消息

六、操作系统面试题

1、程序、进程、线程的区别

程序:一段静态代码

进程:程序的一次执行过程。程序是静态的,进程是动态的。进程是操作系统调度和分配资源的最小单位。

线程:进程可以进一步细化为线程,是程序内部的一次执行路径。线程是cpu调度和执行的最小单位。

2、说一下几种进程通信的方式和它们之间的优点

进程通信时两个进程之间产生数据交互。

①共享存储:设置一个共享内存区域,并映射到进程的虚拟空间;互斥访问共享空间。                                        两种方式:基于数据结构、基于存储区共享

②消息传递:传递结构化的消息(消息头和消息体),系统提供“发送和接受原语”                                                两种方式:直接通信方式:消息直接挂到接收进程的消息队列里                                                                        间接通信方式(信箱):消息先发送到信箱

③管道通信:设置一个特殊共享文件(管道),其实是一个内存缓冲区;一个管道只能实现半双工通信;实现双向通信需要两个管道;各进程要互斥访问管道;管道写满时,写进程阻塞,管道为空读进程阻塞。

3、并发与并行

并行:同一时刻一起发生。

并发:两个或多个事件在同一时间段发生。

4、磁盘驱动调度算法

先来先服务FCFS:根据进程请求访问磁盘的先后次序进行调度
最短寻道时间优先SSTF:要求访问的磁道与当前磁头位置距离最近最短寻道时间优先SSTF:要求访问的磁道与当前磁头位置距离最近
扫描算法SCAN/电梯算法:首先自里向外访问,下一个对象是其欲访问的磁道既在当前磁道之外,又是距离最近的;直至无更外的磁道需要访问时,才将磁臂换向为自外向里移动
循环扫描算法CSCAN:按磁头移动方向,依次按距离移动到最边上的磁道,然后又回到离起始磁道位置最近的位置,依次按距离移动循环扫描算法CSCAN:按磁头移动方向,依次按距离移动到最边上的磁道,然后又回到离起始磁道位置最近的位置,依次按距离移动                                    ⑤LOOk和C-LOOK算法:LOOK和C-LOOK就是对应SCAN和C-SCAN的改进算法。因为SCAN和C-SCAN中每次磁头都要走到磁道尽头,而实际过程中并不需要要求磁头走到尽头,而是到达该方向的最后一个请求后即可返回,这样可以避免一些不必要的磁头移动。

七、Linux

1、Linux 系统中列出当前占用8080端口进程的命令

lsof -i :8080

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值