Java面试的问题
2020.09.08
1.synchronized怎么使用?一定能保证线程同步吗?为什么不能保证还使用?
答: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了。两者的区别主要体现在同步锁上面。对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象);
2.for循环中可以删除元素吗?为什么?
第一种方式,普通for循环,由于ArrayList底层使用数组方式实现,当删除其中某一元素时,其余数组下标会前移,导致继续进行删除时会略过下一元素,最终的结果也会异常
第二种方式,增强型for循环,会抛出ConcurrentModificationException的错误,即并发修改异常
在for循环中删除元素最好使用迭代器的方式
3.HashMap和HashTable的区别?
底层都是数组+链表实现
Hashtable:
1.无论是key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个Hashtable,效率低
2.初始size为11,扩容:newsize=oldsize*2+1
Hashmap:
1.可以存储null键和null值,线程不安全
2.初始size为16,扩容:newsize =oldsize*2,size一定为2的n次幂
注:ArrayList初始化为0,第一次add的时候为10.(JDK8)
4.抽象类和接口的区别以及使用场景?
转自https://blog.csdn.net/lamyuqingcsdn/article/details/50501871
-
interface需要实现,要用implements,而abstract class需要继承,要用extends。
-
一个类可以实现多个interface,但一个类只能继承一个abstract class。
-
interface强调特定功能的实现,而abstract class强调所属关系。
-
尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现:
这个选择有两点含义:
- Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
- abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
- abstract class是interface与Class的中介。
- interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。
abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。
interface的应用场合
- 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
- 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
- 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
- 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。
abstract class的应用场合
一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
- 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
- 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
- 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
5.static使用方法,实例对象可以调用静态方法吗?
可以,但是不能使用this调用。
4.手写重写比较两个对象相等
重写equals和hashcode方法(对象保存在散列表中时需要重写hashcode方法)
5.final使用
6.怎么循环遍历map的value值
map.values();
7.HTTP请求和HTTPS请求区别?
导入证书,查看证书
8.spring有几种拦截模式?
前拦 后拦 环绕 异常
20200917
1.如何保证系统接口安全
1. 请求合法性校验,考虑采用token方式保证接口不被其他人访问。
2. 数据校验,白名单方式验证数据确保不出现异常数据和注入攻击
3. 数据加密,对数据进行加密保证其他人无法非法监听或截取。
4. 错误处理,对系统返回结果编制返回码,避免堆栈信息泄露。
5.对接口访问频率设置阈值(redis+guava、漏桶算法、令牌桶算法、滑动窗口算法。)
2.怎么保证线程安全?
-
原子性:提供互斥访问,同一时刻只 能有一个线程对数据进行操作(atomic,synchronized)
-
可见性:一个线程对主内存的修改可以及时被其他线程看到( synchronized,volatile)
-
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序, 该观察结果一般杂乱无序,(happens-before原则)。
3.Java中有几种创建对象的方式
new对象、反射机制(Class.forName,.getClass,.class),clone,反序列化
4.Java中有哪几种引用方式:
强引用:创建一个对象并把对象赋给一个引用变量
弱引用:垃圾回收器回收
软引用:垃圾回收器不回收
虚引用:都可能被回收
5.Spring中用到了哪些设计模式?
单例模式
工厂模式
代理模式
观察者模式
装饰者模式
适配器模式
6.Java中error的捕获?
catch Throwable,就可以catch到error了。
7.怎么解决哈希冲突?
1.开放定址法:(线性探测在散列、二次探测在散列,伪随机探测在散列)
2.再哈希法
3.链地址法(hashmap这样做)
4.建立一个公共溢出区
8.数据结构二叉树、排序算法
微信赞赏
![](https://images.cnblogs.com/cnblogs_com/ljf-Sky/1807277/o_200716012544%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20200716092510.jpg)
支付宝赞赏
![](https://images.cnblogs.com/cnblogs_com/ljf-Sky/1807277/o_200716012531%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20200716092459.jpg)