java面试题目
4.HashMap,HashTable,ConcurrentHashMap的区别。
HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,初始size为11
HashMap底层数组+链表实现,可以存储null键和null值,线程不安全,初始size为*16*
- ConcurrentHashMap底层采用分段的数组+链表实现,线程安全
5.极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的
HashTable使用一把锁处理并发问题,当有多个线程访问时,需要多个线程竞争一把锁,导致阻塞
ConcurrentHashMap则使用分段,相当于把一个HashMap分成多个,然后每个部分分配一把锁,这样就可以支持多线程访问
6.HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么
多线程put时可能会导致get无限循环,具体表现为CPU使用率100%;
原因:在向HashMap put元素时,会检查HashMap的容量是否足够,如果不足,则会新建一个比原来容量大两倍的Hash表,然后把数组从老的Hash表中迁移到新的Hash表中,迁移的过程就是一个rehash()的过程,多个线程同时操作就有可能会形成循环链表,所以在使用get()时,就会出现Infinite Loop的情况
7.java中四种修饰符的限制范围。
8.Object类中的方法
clone方法:保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
getClass方法:final方法,获得运行时类型。
toString方法:该方法用得比较多,一般子类都有覆盖。
finalize方法:该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用
equals方法:该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法
hashCode方法:
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)true。可以推出obj1.hash-Code()obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
wait方法:
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(longtimeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
notify方法:该方法唤醒在该对象上等待的某个线程。
notifyAll方法:该方法唤醒在该对象上等待的所有线程。
9.接口和抽象类的区别,注意JDK8的接口可以有实现。
Java 8新特性–接口默认方法
默认方法是在接口中的方法签名前加上 default 关键字的实现方法。
11.java序列化的方式
Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口
Serializable:一个对象想要被序列化,那么它的类就要实现 此接口,这个对象的所有属性(包括private属性、包括其引用的对象)都可以被序列化和反序列化来保存、传递。
Externalizable:他是Serializable接口的子类,有时我们不希望序列化那么多,可以使用这个接口,这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性;
12.传值和传引用的区别,Java是怎么样的,有没有传值引用。
1、传值:传值就是指将一个值传递到方法的内部。例如int a = 5,那么也就是给int型变量a赋值,值为5.如果一个方法,将这个变量传进方法的内部,则进行的就是传值。在java中,有8种基本数据类型,它们分别为:int、long、float、double、char、boolean、short、byte.这8种基本的数据类型作为参数进行传递是,都是进行的传值。·除此之外,还有一种特殊的情况,String。本身String是一个引用类型,很多人认为在向方法中传递String类型参数时,是进行传引用。其实在这里,String可以看做为一个包装类,因为String其本身就是通过字符数组实现的,那么它在实现参数传递的时候,也就是以char型数据的方式进行的,也就是进行传值。
2、传引用:java中的引用可以初步的理解为地址。也是在new了一个对象后,该对象是存在JVM的Heap区,也就是堆。那么必然有一个地址要指向这个对象的在JVM中的位置,那么,指向这个对象的这个地址就可以简单的理解为“引用”。
13.一个ArrayList在循环过程中删除,会不会出问题,为什么。
14.@transactional注解在什么情况下会失效,为什么。
1,一般在service里加@Transactional注解,不建议在接口上添加,加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。
2,@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。
3,默认情况下此注解会对unchecked异常进行回滚,对checked异常不回滚。
那什么是unchecked,什么是checked呢?
通俗的说,编译器能检测到的是checked,检测不到的就是unchecked。
派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常。
继承自Exception得异常统称为checked异常,如IOException、TimeoutException等。
4、只读事务:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只读标志只在事务启动时应用,否则即使配置也会被忽略。
启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。
15.线程池的参数有哪些,在线程池创建一个线程的过程。
16.说一下volitile是怎么保证多线程操作共享变量的一个可见性的(面试有被问到)
volitile它能保证可见性和禁止指令重排序,但是它不能保证线程安全。
volitile是通过内存屏障来保证可见性的。
- 写屏障(Store Barrier):在 volatile 变量的写操作之后插入写屏障,确保所有之前的写操作都同步到主内存中,从而使得其他线程在读取该变量时能够获取到最新的值。
- 读屏障(Load Barrier):在 volatile 变量的读操作之前插入读屏障,确保所有之前的写操作都已完成,从而读取到的是最新的值。
通过这种方式,volatile 变量在多线程环境下的读写操作能够保持较高的可见性,但需要注意的是,volatile 并不保证操作的原子性。
17.可以考Spring中使用了哪些设计模式
单例模式
对象的创建都是单例模式
工厂模式
beanfactory创建对象用的是工厂模式
模版方法
jdbcTemplate
代理模式
spring的AOP
还有很多,但是暂时不懂,能说出来的就是这些
18.dubbo的组件有哪些,各有什么作用。
Provider:提供者
Consumer:消费者
registry:注册中心(相当于中介)
monitor:监控中心(dubbo自己的监控项目,直接解压在tomcat下就能启动了,可以查看消费者,生产者)-----------
https://blog.csdn.net/qq_24853627/article/details/79380707
container:服务容器
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
19.zookeeper的负载均衡算法有哪些。
一般来说负载均衡设备都会默认支持多种负载均衡分发策略,例如:
Ø 轮询(RoundRobin)将请求顺序循环地发到每个服务器。当其中某个服务器发生故障,AX就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
Ø 比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 优先权(Priority):给所有服务器分组,给每个组定义优先权,将用户的请求分配给优先级最高的服务器组(在同一组内,采用预先设定的轮询或比率算法,分配用户的请求);当最高优先级中所有服务器或者指定数量的服务器出现故障,AX将把请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
Ø 最少连接数(LeastConnection):AX会记录当前每台服务器或者服务端口上的连接数,新的连接将传递给连接数最少的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 最快响应时间(Fast Reponse time):新的连接传递给那些响应最快的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
以上为通用的负载均衡算法,还有一些算法根据不同的需求也可能会用到,例如:
Ø 哈希算法( hash): 将客户端的源地址,端口进行哈希运算,根据运算的结果转发给一台服务器进行处理,当其中某个服务器发生故障,就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 基于策略的负载均衡:针对不同的数据流设置导向规则,用户可自行编辑流量分配策略,利用这些策略对通过的数据流实施导向控制。
Ø 基于数据包的内容分发:例如判断HTTP的URL,如果URL中带有.jpg的扩展名,就把数据包转发到指定的服务器。
20.dubbo是如何利用接口进行通信的
Dubbo的整个远程通信层由exchange,transport, serialize
exchange,信息交换层,封装请求响应模式,同步转异步,以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel, HeaderExchangeHandler,ExchangeClient, ExchangeServer
transport,网络传输层,抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel, Transporter, Client, Server,Codec
serialize,数据序列化层,可复用的一些工具,扩展接口为Serialization, ObjectInput, ObjectOutput,ThreadPool
21.JDK8的新特性,流的概念及优势,为什么有这种优势
*lambada表达式*******
package com.bjsxt.dp.jdk;
import java.text.Collator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collector;
//这是在jdk8之前对集合进行排序
public class Jdk8Before {
public static void main(String[] args) {
List<String> asList = Arrays.asList("d","c","a","f","g","k");
/* Collections.sort(asList,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return Collator.getInstance().compare(o1, o2);
}
});*/
//使用lambda表达式对集合进行遍历
Collections.sort(asList,(String o1,String o2)->{
return Collator.getInstance().compare(o1, o2);
});
System.out.println(asList);
}
}
最后的运行结果:[a, c, d, f, g, k]
22.json的解析
json的格式:
{} 对象 {“key”:"value","k1":"v1"}
[] 数组 [{},{}]
json示例:描述一个学生
{"name":"张三",“age”:18,"gender":1}
写json和获取json:注意json就是一种javascript类型的语言
上面是存储一个对象,下面是存储两个对象
描述班级的信息:
其中双引号是可以省略的,但是不建议省略
var json={“classname”:"三年一班",“students”:[{"name":"lilei","age":18,"sex":true},{"name":"hanmeimei","age":17,"sex":true}]}
alert(json.students[1].name);
从上面的案例中可以看出:json就是一个对象。能够直接点出来他的属性,最后拿到他的值。
json的解析:
服务器给浏览器使用ajax返回数据xml的,html的,json的
使用jquery的方式遍历数组的方式:使用的是each(function(){})
json数据格式的优点:轻量级交互语言 结构简单 易于解析
同学面试题目:
编写java方法,通过反射的机制,调用String 类型的toUpperCase方法将小写字符串转换成大写的字符串。
中科软今天的电话面试题目:
有一个数组,其中可能保存这相同的数字,请你编程实现统计其中的每个数字一共出现了多少次? (这个一定要记住!!!)
通常我们看到的考试页面,其中会设计到几个数据库,请说出你的设计?
这是网上的答案:
https://jingyan.baidu.com/article/afd8f4de86ddef34e286e9a2.html (怎样安全的度过试用期)