java基础 面试题

1.jdk,jre,jvm 之间的关系
jdk 是开发环境,jre是开发工具包,jvm是虚拟机 jdk>jre>jvm

2.java程序运行原理
java源代码在编译之后转化为字节码文件即 class文件,再经过jvm转化为机器码;

3.基本数据类型和引用数据类型都有哪些
(1)基本数据类型 : 整形 long short int byte
浮点型 float(4) double
布尔型 boolean
字符型 char
(2)引用数据类型
类:class
接口:interface
数组:array
String类型

基本数据类型和引用数据类型的区别:
	基本数据类型有一段内存,   在栈空间存储 
	引用数据类型有两段内存   一段内存存放引用地址	一段空间存放实例

!4.成员变量和局部变量的区别
(1)作用域不同 : 局部变量只能在 定义他的方法中使用 ,成员变量再整个类中都是可见 的
(2)在内存中的位置不同: 局部变量存放在栈中 , 成员变量存放在堆中
(3)生命周期不同 :局部变量随着方法的调用或者代码块的执行而存在,随着方法或者代码块的执行完成而消亡, 成员变量随着类的加载而存在 随类的消失而消失
(4)初始值; 局部变量没有初始值 要使用 必须先赋予初始值, 局部变量有初始值
(5)当超出作用范围的时候局部变量会立即回收, 成员变量等jvm 空闲的时候回收.

静态成员变量和实例成员变量
	静态成员变量:
	(1)它被类的所有对象所共享,因此被称为类变量。

	(2)类加载的时候,就被分配空间

	(3)它既可以通过对象名.变量名方式访问,也可以通过类名.变量名的方式访问。
	
	(4)存储空间:位于方法区
	实例成员变量:
		(1)实例变量是属于对象的属性,只有对象被实例化(new对象)之后才能分配内存空间
		
		(2)通过对象名.变量名访问
		
		(3)实例化对象的时候才会分配空间
	
		(4)存储空间:保存在堆中

5.&和&&的区别
&如果左边的条件为假 还会继续执行判断 右边的条件 , &&如果左边的条件为假,则不会判断右边的条件‘
&&比&的效率更高

6.冒泡排序的实现
比较相邻的前后两个数据,如果前面的数据大于后面的数据就将两个数据交换
这样对数组的第0个数据到第N-1 个数据进行一次遍历,最大的数据会到数组的最后一位
N=N-1 如果 N 不等于0 则重复上面的步骤

7.面向对象的三大特征
封装:将 具体实现 和属性私有化 对外提供 get set 方法 ,外部访问只能通过get,set方法
继承:继承是一种对象与对象之间的关系,子类继承父类的属性和方法 ,子类可以添加新的属性和方法 ,并且子类可以修改父类的属性和方法
优点:提高代码的复用性 缺点: 类与类之间的依赖性高

多态: 同一个动作作用于不同的对象 产生姐结果不同  父类的引用指向子类的对象
优点:降低了程序的耦合度    提高了程序的可拓展性

8.什么是多态
相同的动作 作用于不同的对象 产生的结果不同
(多态就是一个对象的多种表现形式)

形成条件:
	继承:存在子类和父类的关系
	重写
	上转型

9.什么是继承
继承是一种类与类之间的关系,子类继承父类的属性和方法,子类可以添加新的属性和方法,也可以修改父类的属性和方法
(子类拥有父类的行为和属性)
11.继承的好处
提高代码的复用率

12.类与对象的关系
对象是类的实例化,类是对象的模板

13.方法重载和方法重写的区别
方法重载是在同一个类中 方法的 方法名必须相同 , 形参列表不相同
方法重写 发生在子类和父类之间
方法的返回值类型 ,方法名,形参列表 必须相同

14.this 关键字 和super 关键字的区别
(1)代表的事物不一致。
super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
this关键字代表的是所属函数的调用者对象。
(2)使用前提不一致。
super关键字必须要有继承关系才能使用。
this关键字不需要存在继承关系也可使用
this 关键字指向的是本类的方法和对象
super 指向父类

15.java的内存结构
栈:存放局部变量(线程创建的时候创建)
堆:存放所有new出来的对象(堆空间是所有线程共享的,虚拟机启动的时候建立)
方法区:被虚拟机加载的类信息、常量,静态常量等 是共享的
程序计数器:当前线程所执行程序的字节码的行号指示器,通过它可以获取下一条需要执行的字节码指令
本地方法栈:we
垃圾收集器:没有任何内存指向的堆内存空间,会被GC回收
16.抽象类和接口的区别
(2)抽象类有构造方法 接口没有构造方法
(3)一个类 只能继承一个 抽象类,而可以实现多个接口
(4)接口中只能有 public 修饰符 抽象类中 可以拥有除 private 之外的访问修饰符
(5)接口中的变量只有 static final 抽象类可以有其他变量
(6)抽象类运行速度 比 接口快

17.接口的优点
(1)提高了 程序的可拓展性
(2)解决了java 单继承的问题
(3)降低了类与类之间的依赖关系

18.hashcode()和equals()的区别和联系
(1)equals:方法是用来判断两个对象是否相同,相同就返回true,不相同就返回false
(2)hashcode: hashCode()方法返回一个int数值

equals 返回值为true时,hashcode值一定相同,
hashcode 值相同两个对象不一定相等;

19.equals()和==的区别
==:(1)比较基本数据类型时: 比较他们之间的值是否相等
(2)比较引用数据类型时: 比较的是他们在堆内存地址是否相等
equaks :
(1) 用来比较两个对象的内容是否相等

20.StringBuffer和StringBuilder区别 : StringBuffer 和 StringBuilder 类型的字符串都是可变的
StringBuffer 比 Stringuilder 更安全 但是速度慢
StringBuilder 比 StringBuffer 速度更快 但是不安全

21.创建对象的几种方式
(1)new Object
(2)反射
(3)Object 的clone()方法
(4)通过反序列化创建对象 : 必须实现Seriailizable接口

22.什么是拆箱和装箱
拆箱: 向下转型 包装器类型转化为基本类型的数据
装箱: 向上转型 从基本类型转化为包装器类型的过程

23.List 和 set 接口的区别
List : 长度可变 有序 的容器 允许元素重复 特点:类似数组 删除插入效率低,检索效率高
Set : 无序容器 不允许元素重复 特点: 检索效率低 ,删除插入效率高

24.ArrayList 和 LinkedList的区别

ArrayList 通过数组形式来管理对象的    是可改变大小的数组   			特点: 插入删除 效率低 检索效率高   
LinkedList是通过链表 的方式 			双向链接串列				特点: 插入删除 效率高  检索效率低

25.HashSet 和LinkedHashSet的区别

Hashset :      存储的元素是无序的,即迭代输出的元素顺序和插入的顺序不同
				
LinkedHashSet: 时HashSet的一个子类,通过链表的形式来维护元素的顺序,输入的元素顺序和输入的顺序相同

26.Map接口的主要实现类 map是键值对 集合接口
(1)HashMap : HashMap 是无序的 是按照 key的hashcode来实现的 值允许一条记录的key为null 允许多条记录的value 为null 非同步
(2)LinkedHashMap : LinkedHashMap 同样是无序 的但是保存了插入时的顺序 遍历的时候 会按照插入的顺序输出
(3)Hashtable : 与hashmap 类似 但是 key 与 value 都不允许为空 并且支持线程同步
(4)TreeMap : 能够把保存的记录根据key排序默认是升序的

27.hashMap和hashtale的区别
(1)hashMap可以允许一个key 为null,允许多个value为null, 不支持线程同步
(2)hashtable key和value都不能为null, 并且是支持线程的同步的

28.list , map, set的底层实现原理
ArrayList:底层使用数组实现
LinkedList :底层结构基于双向链表

Hashset:底层数据结构哈希表
LinkedHashSet:是HashSet的一个子类,使用双向链表维护元素顺序
TreeSet:底层结构是二叉树,默认从下到大排序



.Map存放的数据是键值对(k-v)数据
   key:Map中的键 不能重复底层实现是用Set
   value:Map中的值 可以重复底层实现是采用List

29.遍历集合的几种方式
(1)转数组遍历
(2)迭代器迭代
(3)增强for循环遍历
(4)list集合因为有索引所以可以通过 普通for循环进行 遍历

30.泛型的好处
(1)编译的时候检查类型安全
(2)所有的强制类型转换都是自动的和隐形的,提高代码的重用率

31.接口的默认方法
(1)默认方法的定义:在返回值类型使用default修饰,一个接口中可以有多个默认方法
(2)接口中既可以定义抽象方法,又可以定义默认方法,默认方法不是抽象方法
(3)子类实现接口的时候,可以直接调用接口中的默认方法即继承了接口中的默认方法
(4)接口中同时可以定义静态方法,静态方法通过接口名调用

32.什么是函数式编程
一切皆函数
(1)将处理问题的粒度从类 变为函数
(2)可以将函数作为参数,传给另外一个函数

优点:
	(1)更好的满足系统对重用性,和扩展性的支持
	(2)简化代码操作,函数运行的结果只依赖于输入的参数

33.关于lambda表达式的理解
(1)新的语法形式,简化看开发的编码操作,由编译器转化为常规的代码
(2)Lambda可以理解为函数式编程的体现方式
(3)Lambda表达式允许通过表达式代替功能接口,类似于匿名方法

34.什么是编译时异常和运行时异常
(1)编译时异常:是除了runtimeException类及其子类之外的异常,必须显示处理,不然程序会发生错误,无法通过编译
当函数中有异常抛出,该函数必须声明,调用者也必须处理

(2)运行时异常:都是runtimeException类及其子类异常,无需显示处理,也可以通过编译异常时一同处理
	当函数中有异常抛出,不一定要声明,函数调用这也不一定要处理

35.处理异常的方式
(1)try catch 自己处理异常
(2)throws 交给别人处理,把异常对象交给调用者处理,最终交给JVM处理->中断处理
(3)throw 关键字: 可以在指定的方法中抛出指定的异常
throw 关键字必须写在方法内部
throw 后面new的对象必须是exception或exception子类对象
throw 关键字异常如果抛出的是runtimeException或者runtimeException子类的对象
可以不处理默认交给JVM处理,如果是编译时异常,就必须处理要么throws要么try catch

36.throw 和 throws 的区别
throw: (1)throw 代表的是一个动作 抛出了一个异常 即执行throw 则一定是抛出了某种异常
(2)throw 只能抛出一个异常
(3)throw 用在方法实现中

throws:(1)throws 代表的是一种状态, 可能有异常抛出
		(2)throws 可以抛出多个异常	
		(3)throws 用在方法声明中

37.finally的作用
(1)finally在try catch之后 无论 有没有执行 catch中的语句都不会影响 finally中语句的执行
(2)唯有在执行finallu 之前执行了 退出 finally才会不执行
(3)作用:用于资源关闭

38.进程和线程的区别
(1)进程:
(1)进程是资源分配和调用的独立单元
(2)进程有自己独立的地址空间,每启动一个进程系统都会为其分配一块地址空间。
(3)CPU切换一个线程比切换一个进程开销小
(4)创建一个线程比创建一个进程开销小
(5)线程占用的资源,比进程小很多
(6)进程之间的通信以通信的方式进行
(7)多进程生命力更强,一个进程死掉不会对另一个进程没有影响

(2)线程:
	(1)线程是CPU调度的基本单元
	(2)线程没有独立的地址空间,它使用相同的地址空间共享数据
	(3)线程之间的通信更方便,同一个进程下,线程共享全局变量,静态变量等数据
	(4)多线程不容易维护,一个线程死掉,整个进程就死掉了

39.什么是并行和并发
并发:交替执行不同的任务
并行:同时执行不同的任务 相当于多个处理器处理同一个任务

40.如何解决线程不安全
线程安全问题:当多个线程共享一个全局变量时,对其进行读写操作时,可能会受到其他线程的影响

解决方法:(1)同步代码块(隐式锁)
		 (2)同步方法(隐式锁)
		 (3)同步锁Lock   :是一个显式锁需要通过 lock()上锁,通过unlock解锁

二.尽量局部变量,更少的使用全局变量

41.线程的两种调度方式
(1)协同式调度
特点:线程自己 的工作执行完毕之后会通知系统,切换到下一个线程
线程的执行时间是由自己掌控的
优点:实现简单没有线程同步问题
缺点: 如果一个线程编写有问题一直不通知系统,会造成线程堵塞

(2)抢占式调度
	特点:线程将由系统来分配执行时间,线程的切换不由线程自身决定 
		可能任务还没有执行完,cup会强制其暂停,让其他线程占据cpu使用权
	
	优点:不会出现因为一个线程发生线程阻塞

42.线程的生命周期
(1)新建状态:线程被创建尚未启动
(2)就绪状态:掉调用线程的 start(),线程立即进入就绪状态,等待cpu的调用此时未被cpu调用只处于就绪状态
(3)运行时状态:当cpu开始调用处于 就绪状态的线程,该线程进入运行时状态,并且只有处于就绪状态下的线程
才能被cpu调用进入运行时状态

(4)阻塞状态:处于运行时状态的线程,出于某种原因放弃了对cpu的使用权,停止执行,此时进入阻塞状态
	只有该线程再次进入就绪状态才可以被,cpu调用进入运行时状态.
	
	阻塞状态的分类:	 等待阻塞    执行了某个对象的wait()方法  JVM会把该线程放在该线程的等待池中
					 同步阻塞	 当线程试图获取某个对象的同步锁时,该对象的同步锁已经被其他线程占用   JVM会将其放入该对象锁池中
					 其他阻塞状态 		sleep() join()  发出I/O请求
(5)死亡状态:线程执行完毕或者 因异常退出了 run(),该线程生命周期结束

43.创建多线程的方式
(1)继承Thread 类
(2)实现runnable接口创建线程 适合多个线程处理同一份资源
(3)callable和FutrueTask 创建线程 callable适合多个线程处理同一份资源
(4)使用线程池

runnable和callable的区别:
	(1)runnable接口定义的是run方法,callable接口定义的是call方法
	(2)run方法没有返回值 ,call方法有返回值
	(3)run方法无法抛出异常,call方法可以抛出checked exception

44.Thread 中的start()和run()的区别
(1)start 的作用是启动一个新的线程并调用相应的run方法,start()不可重复调用
(2)run和普通的成员方法一样,可以重复调用,调用run方法在当前线程中执行,不会启动新的线程

45.什么是死锁
死锁是线程执行过程中由于争夺资源或者彼此通信发生的线程阻塞,若无外力作用他们永远无法推进下去
例如 线程a要获取同步锁a,和同步锁b,线程b要获取同步锁b,a
而当线程a获取了同步锁a时线程b也获取了同步锁b,此时两个线程都获取不到下一个同步锁线程不会继续推进,发生死锁

死锁发生的原因:
	(1)互斥使用:当一个线程占用一个资源时,其他线程不能使用
	(2)不可抢占:资源请求者不能强行从资源占用者 处抢夺资源,资源只能由资源占用者主动释放
	(3)请求和保持:当一个线程在请求一个线程时同时也保留着对原资源的占有
	(4)循环等待
	
避免死锁发生的方法
	(1)加锁顺序,线程按照一定的顺序加锁
	(2)加锁时限,当一个线程请求资源超过一定的时间,放弃对资源的请求并且释放已占有的资源
	(3)避免一个线程获取多个锁
	(4)避免一个线程在锁内占用多个资源的情况
	(5)对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则会出现解锁失败.

46.I/O流的分类
(1)按流向分: 输入流和输出流
(2)按处理数据的单位划分:
字节流:处理数据的单位是字节 处理音频,图像文本
字符流:处理数据的单位是字符 适用于处理文本
(3)按功能分:
节点流:节点流是直接从一个源读写数据的流
处理流:对节点流封装基础上的一种流

47.字节流和字符流的区别
(1)字节流在操作的时候本身不会用到缓冲区,字符流操作时用到了缓冲区,通过缓冲区操作文件

48.为什么使用buffered
可以提高效率
先缓存可以减少IO的读写次数,而IO操作是低效的

49.java中序列化和反序列化
定义:
序列化:把对象转换为字节序列,存储到磁盘当中或者,进行网络传输的过程叫序列化
反序列化:把磁盘或网络节点上字节序列,转换为对象的过程称为反序列化

	实现:必须实现Serializable 接口
	
	作用:正常创建的对象都会存在于,JVM的堆内存当中,当JVM停止运行之后,这些对象就随之消失
	而对象的序列化可以将对象转换为字节数组,可以将字节数组反序列化为对象,实现了对象的持久化保存

50.什么是反射 反射就是把java 类中的各个成分映射成一个个java对象
赋予jvm,动态编译的能力.
在运行状态下,可以获取任意一个类的属性和方法,对于一个对象可以任意调用其属性和方法,这种动态获取
类的属性,和调用对象方法的功能,称为java的反射机制

优点:通过反射可以实现动态编译的能力,提高服务器的性能
	使用反射可以增加程序的灵活性

51.创建class类的几种方式
(1)forName(“全类名”)
(2).class属性
(3)通过运行时类的getclass()
(4)通过类加载器ClassLoader

52.java的设计模式有哪些
(1)单例模式 : 懒汉式 饿汉式
(2)工厂模式 : 简单工厂 工厂方法 抽象工厂
(3)代理模式: 静态代理 动态代理

53.懒汉式和饿汉式的区别
饿汉式:当类装载时创建类的实例 是线程安全的
懒汉式:使用对象的时候才会产生实例化对象 是线程不安全的

54.什么是动态代理
代理模式:为其他对象提供一种代理用以控制对这个对象的访问

代理模式的好处:在某些情况下 客户不想或者不能直接引用一个对象,而代理模式可以在客户端和对象之间起到一个中介的作用

静态代理: 若代理类在运行前就已经存在,这种代理方式被称为静态代理

动态代理:代理类在程序运行时创建的代理方式称为动态代理
		 也就是说代理类不是在代码中定义的,而是在程序运行的过程中,根据在代码中的指示动态生成的。

55.TCP和UDP的区别
(1).基于连接与无连接
(2).TCP要求系统资源较多,UDP较少;
(3).UDP程序结构较简单
(4).流模式(TCP)与数据报模式(UDP);
(5).TCP保证数据正确性,UDP可能丢包
(6).TCP保证数据顺序,UDP不保证

56.tcp和http的区别
(1)http对应于应用层

(2)Tcp协议对应于传输层

(3)http协议是在Tcp协议之上建立的,http在发起请求时通过tcp协议建立起连接服务器的通道,请求结束后,立即断开tcp连接

(4)Http是无状态的短连接,而TCP是有状态的长连接

57.静态方法和实例方法有什么不同
(1)静态方法属于整个类所有,因此调用它不需要实例化,可以直接调用(类.静态方法())。实例方法必须先实例化,创建一个对象,才能进行调用(对象.实例方法())。
(2)静态方法只能访问静态成员,不能访问实例成员;而实例方法可以访问静态成员和实例成员。
(3)在程序运行期间,静态方法是一直存放在内存中,因此调用速度快,但是却占用内存。实例方法是使用完成后由回收机制自动进行回收,下次再使用必须再实例化

58.java垃圾回收的目的是什么,什么时候进行垃圾回收
(1)目的:垃圾回收是对内存中没有引用和超过作用于的对象时进行回收,目的是识别并丢弃不再使用的对象来释放和重用资源
(2)进行垃圾回收的时间:
当对象失去引用后,系统会在合适的时间回收他所占的内存
回收时间即出发GC的时间。
在新生代的Eden区满了会触发新生代GC(MiMor GC),经过多次触发新生代GC存活下来的对象就会升级到老年代,
升级到老年代的对象所需要的内存大于老年代剩余内存,则会触发老年代GC(Full GC)。
当程序调用System.gc()时也会触发Full GC。

59.值传递的类型和区别
(1)基本数据类型 传递的是值的副本
(2)引用数据类型 传递的是地址

60.自动类型转化和强制类型转化
自动类型转化:容量小的数据类型可以自动转成容量大的数据类型
强制类型转化:容量大的数据类型可以自动转成容量小的数据类型,存在精度损失;

61.声明String 类型 ,和 new 一个String类型的区别
(1)声明:存放在常量池
(2)new :存储在堆中

62.三层架构
1.数据库访问层(dao):操作数据库,对数据表进行增删改查
2.业务逻辑层(service):传递数据,对原始数据进行加工处理
3.视图层(View):和用户打交道

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值