Java基础面试(三)
1.Java一个类当中如果没有构造函数,编译器会自动生成一个缺省的构造函数;
如果这个类有其他的构造函数,编译器则不会提供缺省构造参数。
2.SpringMVC与Struct2.0的区别
a.Struct是类级别上的拦截,一个类对应request的上下文;SpringMVC是方法级别上的拦截,一个方法
对应request的上下文;
b.基于第一个原因,SpringMVC各方法的request和response不共享,各方法是独立的;而Struct方法共享所有
Action变量;
c.SpringMVC的入口是Serlvet,而Struct的入口是Filter(拦截器);
d.SpringMVC的配置是基于AOP,而Struct的配置是基于interceptor机制,所以Spring MVC配置更加简单,
与Spring能够完美融合。
3.SpringMVC与SpringBoot的区别
答:Spring MVC 是基于Spring的一个 MVC 响应请求式WEB框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包, 实现了自动配置,降低了项目搭建的复杂度。
4.连接数据库
// 第一步:同DriverManager加载驱动获取Connection
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("数据库连接失败!");
se.printStackTrace() ;
}
PreparedStatement ps=null;
ResultSet rs=null;
//第二步 给预编译PreparedStatement对象绑定sql语句
ps=con.prepareStatement("select * from t_emp");
//第三步:执行sql语句,并放入结果即ResultSet对象中
rs=ps.executeQuery();
Statement 和 PreparedStatement之间的关系和区别.
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高
5.接口中的属性为什么要用final
答;接口是一种规范,是抽象的,如果内部的参数可以被修改,那没规范就被破坏了,会影响整个系统
安全和稳定性。
接口内的属性都是static、public、final
接口内方法都是:public 、abstract
6.关于继承
1.子类只能调用(继承)父类 public或者protected的变量或者方法 可以用private来标明特有的方法或者属性(不会被子类隐藏或者覆盖)
2.同名变量 子类或隐藏父类变量 同名方法 子类会覆盖父类方法(即子类的优先级大于父类)
3.子类不能继承父类的构造器,但是可以通过super调用
4.使用子类进行向上转型时,变量不会进行动态绑定(子类覆盖隐藏父类),只有方法会发生动态绑定(除了static 和final)。
5.当继承有参数的构造方法是 子类也同时要生产含有相同参数的构造方法 super(参数)
6.继承抽象父类中方法可以是抽象的,也可以不是抽象的。子类只会对抽象的方法进行重写。
7.关于内部类
在Java中
(1)类的静态方法不能直接调用动态方法。
(2)类的静态方法不能初始化内部类(包括该类的内部类,和其他文件中的内部类)。
(3)类的静态方法可以初始化其他类文件中的类。
(4)类的静态方法可以初始化静态类(包括静态内部类)。
8.String s=new String(“xyz”);创建了几个字符串对象?
答:一个或者两个对象,一个是静态存储区的“xyz”,一个是new创建在堆上的对象(当堆已存在“xyz”,JVM调优机制将起作用)。
9.什么是多态?如何实现多态?
答:多态是指不同类对象多同一消息做出响应。
主要方式:1.继承抽象类2.实现接口3.虚方法
主要特征:a.发生重写或者重载
b.发生属性或者方法的动态绑定
c.向上转型
引用对象(如:抽象类、接口)指向具体实例对象
10.如何理解面向对象?
答:
a.这是一种编程思想,能够帮助我们把复杂的问题简单化;
b.实现角色的转变,从执行者变成了指挥者。
面向对象的3种特征:
1.封装:隐藏类的属性和方法,对外提供公共的访问接口;
2.继承:是 联结类的层次模式,提高代码的重用,是多态的前提。
3.多态:多态是指不同类对象多同一消息做出响应。提高程序的可拓展性。
11.重用的方式
答:继承和组合。
组合: 新类中嵌入某个对象(已经实现接口的类或者已经继承的子类) 更加灵活
12.序列化和反序列化
答: 把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。
用途:文件的copy、网络数据的传输。
集合部分:
1.Collection接口 的实现类
答:Collection接口有3个子接口:List、Set、Queue
a.List(有序、可重复):的实现类有ArrayList、Vector、LinkList
ArrayList、Vector底层是通过数组实现的,LinkList是通过双向链表实现的。Vector支持线程同步。
b.Set(无序、不可重复)实现类有 HashSet(基于哈希表,可以为null)和TreeSet(基于二叉树,不可为null)
c. Queue:实现类有 Deque:底层是是数组,有2个标志位指向数组的头与尾实现双端队列。
补充:Map接口没有显示继承类。java.lang,Object.
HashMap是无序的,但是它的子接口类LinkHashMap是有序的。
2.HashMap的key是否可以重复?
答:key的“重复”表现在toString()上,但是本质上它们的hashcode是不一样的,即引用地址不一样。
所以Key不可以是重复的。
3. 请问 ArrayList、HashSet、HashMap 是线程安全的吗?如果不是我想要线程安全的集合怎么办?
答:都不是线程安全的,集合中只有Vector和hashtable是线程安全。
可以通过调用Collections工具类提供API来实现线程同步
4. ArrayList 内部用什么实现的?
答:内部是有Object[] 实现的。
5.集合的种类?
答: 普通集合通常性能最高,但是不保证多线程的安全 性和并发的可靠性。
线程安全集合仅仅是给集合添加了 synchronized 同步锁,严重牺牲了性能,而且对并发的效率就 更低了,
并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率。
ConcurrentHashMap、ConcurrentLinkedQueue。
6.集合的实现类
答:List集合有3个实现接口;
List :Vecoter、ArrayList、LinkList
Map:HashMap、LinkHashMap
Set:HashSet、TreeSet、LinkHashSet
HashMap和HashTable的区别:
1.HashMap 对象的 key、value 值均可为 null。 HahTable 对象的 key、value 值均不可为 null。。
2.HashTalle是线程安全的,而HashMap不是线程安全的。
线程部分
1…线程的周期 与方法
答:新建、就绪、运行、死亡、阻塞
void start() 开启线程的方法
void run() 创建该类的子类时必须实现的方法
static void sleep(long t) 释放CPU的执行权,不释放锁
static void sleep(long millis,int nanos)
final void wait()释放CPU的执行权,释放锁
final void notify()
static void yied()可以对当前线程进行临时暂停(让线程将资源释放出来)
public final void join()//让线程加入执行,执行某一线程join方法的线程会被冻结,等待某一线程执行结束,该线程才会恢复到可运行状态
2.sychronized与锁的区别
3.乐观锁与悲观锁 (上锁的的位置不同)
悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放. sychronized提供的是悲观锁
乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作.
注:悲观锁 适合写入频繁场景,
乐观锁 适合读取频繁场景。
如何进一步 确保乐观锁事务原子性:
a.借助C语言的ASC方式
b.加锁:加入悲观锁