1年java工作经验面试前的准备

一、1年java工作经验面试时的自我介绍:

面试官您好,我叫秀儿,我目前有一年的java后台开发经验,熟练使用SpringBoot,Mybatis等框架,了解java的一些底层原理集合,多线程,,以及sql调优等,并有着丰富的数据开发经验,离开上一家公司的原因是因为我想在技术上得到更多的锻炼。⽣活中我是⼀个积极乐观的⼈,⼀般会通过运动打球的⽅式来放松。我⼀直都⾮常想加⼊贵公司,我觉得贵公司的⽂化
和技术氛围我都⾮常喜欢,期待能与您共事!

二、技术方面:

面向对象和面向过程:
面向过程:
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象:
面向对象的方法主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象(万物皆对象)。  
三大特性:
封装,继承,多态:

封装:
	封装把⼀个对象的属性私有化,同时提供⼀些可以被外界访问的属性的⽅法,如果属性不想被外界访问,我们⼤可不必提供⽅法给外界访问。但是如果⼀个类没有提供给外界访问的⽅法,那么
这个类也没有什么意义了。
继承:
	继承是使⽤已存在的类的定义作为基础建⽴新类的技术,新类的定义可以增加新的数据或新的功
能,也可以⽤⽗类的功能,但不能选择性地继承⽗类。通过使⽤继承我们能够⾮常⽅便地复⽤以
前的代码。
多态:
	1,要有继承
	2,重写
	3,父类引用指向子类的对象
	理解:
	一、我开了一家宠物店,这一天来了一个哈士奇,你灵机一动开业大酬宾哈士奇洗澡三折,你让店员把这个消息传播出去了,不一会来了金毛,柴犬,泰迪,结果店员一律不让进,你很生气,损失了顾客,但是店员确实是执行了你的指令。这时候多态的作用就体现了,定义一个动物洗澡的方法,只要是动物都能执行只需要继承动物这个类就可以。
	二、你让店员给宠物喂食,但是品种那么多,每个品种都有自己的喜好,假设有一万只动物,那么你就要写10000个方法,这样代码冗余繁多,多态就能很好的解决这种,让这么多种类的宠物都继承宠物这个父类,然后重写eat()方法就可以了,这样你就直接写一个方法调用父类的eat()方法,实际上就是执行子类的方法。
String StringBuffer 和 StringBuilder 的区别是什么?(引出final等和线程安全)
String 为什么是不可变的?

因为底层使用final修饰的
 区别就是StringBuffer 线程安全,因为在其append和insert,indexOf等方法都加了同步锁或者对调⽤的⽅法加了同步锁,而StringBuilder 线程不安全效率更高
 单线程大量数据考虑StringBuilder 
 多线程看需求偏向于StringBuffer
final finally 和 finalize的区别(引出垃圾回收)
1、final,意思就是啥啥都不可变,且被final修饰的变量必须被初始化(注意)
用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)
2、finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。
3、finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
线程:
1.实现多线程多几种方式:(4种)
详细参见:[添加链接描述](https://blog.csdn.net/PassionAnytime/article/details/126143524)
	4种方式:
	 	1.创建 MyThread 类,让其继承 Thread 类并重写 run() 方法。
	 	2.创建 MyRunnable 类实现 Runnable 接口,
	 		创建 MyRunnable 类的实例对象 myRunnable 。
			把实例对象 myRunnable 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程
		3.创建 MyCallable 类实现 Callable 接口。
			创建 MyCallable 类的实例对象 myCallable。
			把实例对象 myCallable 作为参数来创建 FutureTask 类的实例对象 futureTask。
			把实例对象 futureTask 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程。
		4.线程池
2.线程的生命周期:
详细参见:[线程生命周期](https://blog.csdn.net/LinYiMu1203/article/details/125586008)
	新建:没有调用start()方法之前
	就绪:调用start()之后但没有等待cpu时间片分配
	执行:抢夺到cpu资源了,开始执行run方法
	阻塞:因为某种原因放弃了cpu了使用权,直到转为就绪状态才有机会转为运行状态,具体体现为
	1、 **等待阻塞:**运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
	2、 **同步阻塞:**运行的线程在获取对象的同步锁(synchronized)时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
	3、 **其他阻塞:**运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)。
	死亡:程会以以下三种方式之一结束,结束后就处于死亡状态:
	1、 run()或call()方法执行完成,线程正常结束。
	2.、线程抛出一个未捕获的Exception或Error。
	3.、直接调用该线程的stop()方法来结束该线程,该方法容易导致死锁,通常不推荐使用。
2.怎么保证线程安全:
加锁:
	1.什么是锁:多个线程抢夺同一个资源
	2.加锁有几种形式他们的区别是什么:()
	3.预留..................................
java基础
在⼀个静态⽅法内调⽤⼀个⾮静态成员为什么是⾮法的?
因为静态方法不通过类(对象)调用,因此不能其他非静态变量,也不可以访问非静态变量
接口和抽象类区别:
理解:接口就是呗抽象类还抽象的类。
1.接口中不能有实现,而抽象类可以,(但是从java8开始接口开始有默认的实现)
2.接口中只能有static和final,而抽象类中则不一定
3.一个类可以实现多个接口,而一个类只能实现一个抽象类
4.接口的默认修饰符是public而抽象类除了private什么都可
5.接口是一种模板设计,而抽象类是对行为的抽象
6.JDK8以后接口可以定义静态方法,通过类名.方法名调用,实现类和实现不可以调用,一个类如果实现了两个以上的接口,接口都有默认的实现方法,则必须重写默认的实现方法
成员变量和局部变量
1,成员变量属于类,局部变量属于方法,他们都能被final修饰,但是public , private , static不能修饰局部变量
2,.成员变量随着对象的调用而存在,局部方法随着方法的调用而自动消失
3,成员方法没有赋予初始值,会默认赋初始值,比如int是0,String是null 而局部变量没有
构造⽅法有哪些特性?
1. 名字与类名相同。
2. 没有返回值,但不能⽤ void 声明构造函数。
3. ⽣成类的对象时⾃动执⾏,⽆需调⽤。
== 与 equals(重要)—(引出基本数据类型和引用数据类型)
== : 它的作⽤是判断两个对象的地址是不是相等。即,判断两个对象是不是同⼀个对象(基本数据
类型==⽐的是值,引⽤数据类型==⽐的是内存地址)。
equals():
	情况 1:类没有覆盖 equals() ⽅法。则通过 equals() ⽐该类的两个对象时,等价于通过
					“==”⽐这两个对象。
	情况 2:类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来⽐两个对象的内容是
	否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
java中有几种基本数据类型

八种基本数据类型

~String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是⽐的对象的内存地
址,⽽ String 的 equals ⽅法⽐的是对象的值。
~当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相
同的对象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。
简述线程、程序、进程的基本概念。以及他们之间关系是什么?

从小到大
线程—进程—程序

异常;

异常

那种情况下finally不会执行
1. 在 try 或 finally 块中⽤了 System.exit(int) 退出程序。但是,如果 System.exit(int) 在异常
语句之后, finally 还是会被执⾏
2. 程序所在的线程死亡。
3. 关闭 CPU。
序列化和反序列化

前:直将java转化成一连串字节保存在磁盘中
后:将保存在java磁盘中的字节码转化成为java对象

IO流

预留…

集合:
1.经典:ArrayList与LinkedList有什么区别?
1)ArrayList是以数组实现的集合,linkedList是以双向链表实现的集合(1.6以前为循环列表,1.7取消了循环)
2)ArrayList扩容机制是默认的数组初始化长度为10,随后以复制老的数组,以2倍大小开辟新的数组扩容,如果有大量数据的话推荐使用
3)当调用get'() 方法时ArrayList 的时间复杂度为 “O (1)”、而 LinkedList 时间复杂度为 “O (n)”(n 为集合的长度)
   当插入元素的时候复杂度相反。
2.List的扩容机制:
1)当new出来一个ArrayList时,分配的空间容量为0,只有当add添加的时候,默认值才为10,并以原来的1.5倍进行扩容  
例:10->15->22
2) 当出现小数时舍弃
3)当指定new ArrayList(4)长度时,new出来的时候就数组容量就已经是4了
集合以及map框架图

详细可参见https://blog.csdn.net/qq_45687780/article/details/124406490
详细可参见https://blog.csdn.net/qq_45687780/article/details/124406490
在这里插入图片描述
带Tree的都是有序的,多数用来排序,
hashMap线程不安全,Hashtable线程安全,
HashMap允许保存的数据为空,Hashtable不可以
注意点:key值重复会覆盖

HashMap 扩容:
初始化容量扩充为16

当保存内容的容量扩充超过了与阈值*0.75=12时,就会进行容量的扩充。

在进行扩充的时候HashMap采用的成倍的扩充模式即:每一次扩充两倍(源码用的左移运算符1<<)
HashMap 和 HashSet区别
实现了 Map 接⼝-------------实现 Set 接⼝
存储键值对-------------------- 仅存储对象(实际上储存的就是hashMap的键)
调⽤ put() 向 map 中---------添加元素 调⽤ add() ⽅法向 Set 中添加元素
HashMap 使⽤键(Key)计算hashcode------------
											HashSet 使⽤成员对象来计算 hashcode 值,对于两个对象来说
											hashcode 可能相同,所以 equals() ⽅法⽤来判断对象的相等性
总结:hashSet底层就是hashMap

注:以上为本人观点,欢迎指正,后续更新多线程和map深层次内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值