Java高频面试题复盘系列之小问题集合篇2

Java高频面试题复盘系列之小问题集合篇2

排序有哪些? 原理是什么?

	1 冒泡排序
		1 原理: 相邻元素比较, 后面的比前面的小, 就交换位置, 把最大的元素冒泡出来(即排到最后)
		2 时间复杂度:n的平方。原地修改数组
		3 但是性能会比较差
	2 快速排序
	3 选择排序
		1 原理:
			1 先选择出最小的元素, 记录其索引位置, 然后和第一个索引位置的元素交换位置
			2 然后选择出第2小的元素, 和第二个索引位置的元素交换
			3 ...
		2 时间复杂度:n的平方。原地修改数组
	4 插入排序
		1 原理
			1 把所有元素分为两组,已排序的和未排序的
			2 找到未排序组中的第一个元素,向已经排序的组中进行插入, 与已排序的数据进行比较, 将元素插入到合适的位置
			3 倒序遍历已经排序的元素, 
		2 时间复杂度:n的平方。原地修改数组
		3 简单直观且稳定的排序算法
	5 希尔排序(插入排序的改良版)
	6 归并排序

什么是堆栈?什么是内存溢出?有垃圾回收机制为什么还会出现内存溢出的情况?

	1 堆与栈是两个相对的概念:堆指先进先出(first in first out),栈指先进后出(first in last out)
	2 这里的堆栈就是栈
		1 堆是一个树状数据结构
		2 而栈是一个链表, 栈是先进后出的, 有入栈和出栈的操作, 只在栈的一端进行操作
		3 在java中堆一般用来存储对象和数组,栈一般用来存储方法和基本类型
			 1 栈的存取速度比堆快。栈中的数据是可以共享的
	3 内存溢出
		1 应用系统中存在无法回收的内存
		2 或使用的内存过多
		3 最终使得程序运行要用到的内存大于虚拟机能提供的最大内存
	4 有垃圾回收机制为什么还会出现内存溢出的情况
		1 垃圾回收机制只能回收没有引用的对象,也就是说只能回收没有“指针”的对象,对于非引用类对象,垃圾回收机制就不能起作用
		2 比如说,如果打开过多的数据库连接,那么这些不能被垃圾回收机制所处理。由于一般情况下很少有人打开过多的数据库连接,所以很少有人注意到这一点。
		3 还有一种可能就是死循环也会出现内存泄漏,但是不是所有的死循环都会出现内存泄漏现象。对ArrayList操作的时候才有可能出现,

内存模型的理解?

	1 java内存模型(Java Memory Model,JMM)
		1 就是一种符合内存模型规范的,
		2 屏蔽了各种硬件和操作系统访问差异的
		3 保证了java程序在各种平台下对内存的访问都能保证效果一致的机制和规范
		4 作用: 为了保证并发编程中可以满足原子性、可见性以及有序性
	2 Java内存模型所有的变量都存储在主内存,
		1 每条线程有自己的工作内存,线程的工作内存保存了该线程中用到的变量的主内存副本拷贝
		2 线程对变量所有的操作都必须在工作内存中进行,不能直接读写主内存
		3 不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步
	3 JMM是一种规范
		1 目的是解决由于多线程通过共享内存进行通信时,存在
			1 本地内存数据不一致
			2 编译器会对代码指令重排序
			3 处理器会对代码乱序执行等带来的问题
		2 目的就是保证并发编程场景中的原子性、可见性和有序性。
	4 Java内存模型的实现
		1 java提供了一系列和并发处理相关的关键字,比如volatile、synchronized、final、concurrent包等
			synchronized保证了原子性可见性和有序性
			volatile保证了可见性和有序性,但是不能保证原子性。volatile禁止指令重排序
			final保证了可见性
	5 JVM内存空间分为五部分,分别是:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器
		1 方法区主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小是可以动态扩展
		2 堆主要存放的是数组、类的实例对象、字符串常量池等
		3 Java虚拟机栈是描述JAVA方法运行过程的内存模型,Java虚拟机栈会为每一个即将执行的方法创建一个叫做“栈帧”的区域,该区域用来存储该方法运行时需要的一些信息
			1 Java虚拟机栈是运行Java方法的区域
		4 本地方法栈是运行本地方法的内存模型
		5 程序计数器是一个比较小的内存空间,用来记录当前线程正在执行的那一条字节码指令的地址
			1 如果当前线程正在执行的是本地方法,那么此时程序计数器为空
			2 程序计数器有两个作用,
				1、字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,比如我们常见的顺序、循环、选择、异常处理等
				2、在多线程的情况下,程序计数器用来记录当前线程执行的位置,当线程切换回来的时候仍然可以知道该线程上次执行到了哪里

java的基本类型是什么, int占几个字节?byte占几个字节?

	1 byte(1), short(2), int(4), long(8), float(4), double(8), boolean(1), char(2)
	2 char
		1 char在Java中占用2字节, Java编译器默认使用Unicode编码,因此2字节可以表示所有字符
		2 如果使用UTF-8编码, 则char存储字符占用的字节数是不定的, 1到3个字节

final, finally, finalize关键字的区别?volaile关键字的了解?

	1 Final是一个修饰符
	2 Finally, 是try...catch...finally
	3 finalize(), object类中的一个方法, 是GC (garbage collector垃圾回收)运行机制的一部分
		1 当gc判断一个对象没有其他的引用(不存在该对象的引用), 调用该方法回收对象的资源
	4 任何被volatile修饰过的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于volaile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的
		1 volatile解决共享变量的可见性,有序性(volatile修改的变量禁止代码重排), 不能解决原子性
		2 解决可见性, 每个线程都有自己的工作空间, java内存模型把所有的变量存储在主内存
			1 单个线程使用时, 会将变量复制一份到自己的工作空间, 执行完成后再同步到主内存
			2 而volatile关键字修饰变量时, 该变量只存在于主内存, 单个线程使用时不会复制变量副本, 而是直接操作主内存的变量

在一个list中存放的String类型的字符串, 如何实现把其中所有带"王"的字符串从list中去除?

	1 遍历list集合判断后赋给另一个list集合
	2 用赋给set集合再返回给list集合
	3 解决方法
		1 方法一: 普通for倒着遍历list集合, 并删除重复数据
		2 方法二: 普通for正序遍历list集合, 每删除一个元素后, 加入循环变量i的值-1操作
		3 方法三: 迭代器iterator遍历
			Iterator it = list.iterator();
				while(it.hasNext()){
					String x = it.next();
					if(x.equals(“del”)){
						it.remove();// 注意这里使用的是迭代器的remove()方法, 不能使用list的remove()
				}
			}
	4 注意: 使用增强for遍历集合并删除数据, 会出现 ConcurrentModificationException //这是一个并发修改异常报错
		1 调用list.remove()方法导致modCount和expectedModCount的值不一致而报异常 

String a=“123”, String b=“123”, a+=b; 共产生了几个对象

	1 共产生了2个对象: "123", "123123"
	2 这两个对象都是常量池中的对象, 而不是new出来的对象

如何序列化和反序列化?序列化的目的?

	0 序列化需要实现Serializable接口
	1 如何序列化和反序列化
		1 ObjectOutputStream代表对象输出流:
			1 它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
		2 ObjectInputStream代表对象输入流:
			1 它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
	2 序列化的目的
		1 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
		2 当你想用套接字在网络上传送对象的时候;
		3 当你想通过RMI传输对象的时候
	3 序列化的意义
		1 将对象或者异常等写入文件,通过文件传输信息
		2 将对象或者异常通过网络进行传输
		3 把内存中的对象状态保存到一个文件中或者数据库中时
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值