java面试总结

java内容:
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。重用性、灵活性和扩展性。封装,继承,多态,抽象。
封装:封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。通过隐藏对象的属性来保护对象内部的状态。 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。
多态:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。
继承:继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。
抽象:抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
1、Jdk跟jre的区别:
Jdk:java开发工具包,提供了 java 的开发环境和运行环境。
Jre:java运行环境,为 java 的运行提供了所需环境。
JDK 其实包含了 JRE,同时包含了编译java文件的编译器javac,如果需要编写java代码,jre即可,java程序的话必须jdk
2、== 跟 equal()区别:
==比较引用,equal()就比较值;
3、两个对象的 hashCode()相同,equals()不一定 true;
4、final 在 java 中有什么作用
Final修饰类叫最终类,该类不能被继承;
Final修饰的方法不能被重写;
Final修饰常量,必须初始化,初始化的值不能修改;
5、String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
6、Java中操作字符串:
String、stringbuffer、stringbuilder
String声明的对象都是不可变的对象,每次都会形成新的对象,stringbuffer和stringbuilder声明的对象是在原基础上操作。
Stringbuffer是线程安全的,stringbuilder是非线程安全的。单线程的话推荐使用是stringbuilder,多线程使用stringbuffer。
7、String str="i"与 String str=new String(“i”)一样吗
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
8、普通类和抽象类有哪些区别
普通的抽象类不能包含抽象方法,抽象类可以包含抽象方法
抽象类不能直接实例化,普通类可以直接实例化
抽象类不能用final修饰,抽象类就是用来继承的,final修饰不能继承
抽象类的子类是用extend继承,使用important实现接口
抽象类可以有构造函数,接口不行
抽象类可以有main方法,接口不行
一个类可以有很多的接口,但是只能继承一个抽象类
接口默认public访问,抽象类可以任一修饰符
接口可以继承,list继承collection
9、Java中的io流
输入流(input)和输出流(output)
字节流和字符流

10、BIO、NIO、AIO
Bio:block io 同步阻塞式io,平时使用的传统io,使用简单方便,处理并发能力低
NIO:new io 同步非阻塞式io,传统io的升级,客户端服务端通过channel通道通讯 ,实现了多路复用
AIO:NIO的升级,异步非阻塞式io,异步io的操作基于时间和回调机制
11、Files常用方法
Delete ,copy,exists,createfile,move,size,read,write
12、Java的容器有哪些?
List、set、map
在这里插入图片描述

Hashmap非同步、hashtable同步,效率上hashmap更高,hashmap允许空值,hashtable不允许。
删除 、插入、定位元素hashmap操作最好,有序的key集合遍历的话treemap最好。
在这里插入图片描述

13、ArrayList 和 LinkedList 的区别
ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问

14、如何实现数组和list的转换
List装换成数组,调用ArrayList的toarray方法
数组转换成为List:调用Arrays的asList方法

15、迭代器 Iterator
迭代器iterator是一个设计模式,是一个对象,

16、(线程)并行和并发有什么区别
并行是两个或多个事件在同一时刻发生,并发是是指两个或多个事件在同一时间间隔发生。
并行不是一个实体,并发是一个实体。

17、 线程和进程
进程是程序进行资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程,进程是线程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。一个进程可以有多个线程之间并发执行。

18、守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。

19、创建线程的方式
A.继承thread创建线程类
定义thread的子类,重写该类的run方法,run方法又叫执行体
B.通过runnable接口创建线程类
定义runnable接口的实现类,重写run方法,该方法也是该线程的线程执行 体。
调用线程对象的start()方法来启动该线程。
C.通过callable和funture创建线程

20、线程状态
创建、就绪、运行、阻塞、死亡
A.创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于 创建状态
B.就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态, 但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。 在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
C.运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就 进入了运行状态,开始运行run函数当中的代码。
D.阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比 如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致 线程阻塞
E.死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程 就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

21、Runnable与callable区别
Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;
Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果

22、sleep() 和 wait()
Sleep是线程thread的静态方法,让调用的线程进入睡眠状态,让出执行给其它线程,等休眠结束进入就绪状态,与其它线程一起竞争CPU执行时间。Sleep是static静态方法,不能修改对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象
Wait是object的方法,执行wait以后进入一个和该对象相关的等待池,同时释放机锁对象,其它线程可以访问,可以通过notity,notityall唤醒线程;

23、notify()和 notifyAll()
调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。

24、线程的 run()和 start()
每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值