java面试问题解析

1、为什么string类是final的?
性能和安全。final的有助于共享,提高性能。不希望被继承。
2、java中的队列有哪些,区别?
阻塞队列和普通队列,阻塞队列相对于普通队列来说,当队列为空时,从队列中获取元素的操作会被阻塞,当队列是满的时,向队列中插入元素的操作会被阻塞。
3、Class.forName和classloader的区别?
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象
4、Java中是如何区分重载方法的?
参数类型和顺序来进行区分的。
5、testLong没有问题,因为传递的参数50是int型的,而接收方参数是long型的,小范围可以自动转型为大范围的数据类型;
testFloat不会通过编译,因为传递的参数1.5是double类型的,而接收方参数是float类型的,大范围转型为小范围数据类型需要显式转换,即改为testFloat(1.5f)。
public static void testLong(long i) {
System.out.println(“test long”);
}

public static void testFloat(float i) {
System.out.println(“test float”);
}
public static void main(String[] args) {
testLong(50);
testFloat(1.5); //传参问题,double——>float
}
6、在定义了自定义构造器后,若要使用默认构造器,则需要显式指定默认构造器,否则A a = new A();不能编译通过。
public static class A {
A(int i) {
System.out.println(“A(int i)”);
}
}
public static void main(String[] args) {
A a = new A(); //没有可调用的无参构造方法
}
7、在一个构造器中调用其它构造器时,需要使用this关键字进行调用,如this();
在一个构造器中可调用仅一个其它构造器,并且调用其它构造器的语句需放在调用者(即发出调用行为的构造器)语句块的第一行。
public static class A {
A() {
System.out.println(“A()”);
}
A(int i) {
System.out.println(“A(int i)”);
}
A(int i, int j) {
A(); //在一个构造器中调用其它构造器时,需要使用this关键字进行调用,如this();
A(i); //在一个构造器中可调用仅一个其它构造器
System.out.println(“A(int i, int j)”);
}
}
8、对于i = i;这个语句而言,它并未改变实例变量i的值,且i的默认值为0,因此结果也为0,若需要改变实例变量i的值,需要改为this.i = i;
public static class A {
private int i;
private String j;
int getI() {
return i;
}
String getJ() {
return j;
}
A(int i) {
i = i;
}
A(String j) {
this.j = j;
}
}
public static void main(String[] args) {
System.out.println(new A(5).getI()); //0
System.out.println(new A(“hello”).getJ()); //hello
}
9、在一个类中,声明了若干个static方法和非static方法,请谈谈声明的static方法是否能访问声明的非static方法,说明理由?
static方法不能访问非static方法,因为static方法是属于这个类本身的一个方法,在编译期间就已经确定了;而非static方法是属于这个类的对象的方法,需要在实例化之后才能访问到。若在static方法中访问非static方法,将不能通过编译。
10、static关键字为何不能修饰局部变量?
static关键字修饰的变量或方法是属于类的,在编译时就已经确定了;而普通变量或方法是属于该由类生成的对象,需要在实例化后才能确定。因此,若static关键字修饰了方法的局部变量,一方面方法需要在实例化之后才能确定,另一方面static修饰的变量需要在编译时确定,这就会导致矛盾。
11、finalize()有何用途?什么情况下需要调用这个函数?
在需要释放内存的地方调用finalize(),则在下一轮垃圾回收时会回收占用的内存,一般情况下不需要显式调用此函数。
垃圾回收器只能回收那些由new关键字创建的对象所占用的内存,那么有些不是通过这种方式(比如调用C++本地方法)所占用的内存如何回收呢?那么就需要使用finalize()了。由于C++中需要使用free()函数来释放内存,所以Java程序在调用C++时需要调用finalize()方法来释放内存。

12、ybatis插入一条数据,如何返回主键id
mySql中:“keyProperty”表示返回的id要保存到对象的那个属性中;“useGeneratedKeys”表示主键id为自增长模式;
useGeneratedKeys=“true”
keyProperty=“userId”

oracle中,代码如下:由于Oracle没有自增长一说法,只有序列这种模仿自增的形式,所以不能再使用“useGeneratedKeys”属性;
使用<selectKey>将ID获取并赋值到对象的属性中,insert插入操作时正常插入id;
<insert id="insert" parameterType="com.test.User">
   <selectKey resultType="INTEGER" order="BEFORE" keyProperty="userId">  
       SELECT SEQ_USER.NEXTVAL as userId from DUAL
   </selectKey> 
    insert into user (user_id, user_name, modified, state)
    values (#{userId,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR},  #{modified,jdbcType=TIMESTAMP}, #{state,jdbcType=INTEGER})
</insert>

insert元素属性详解:
parameterType ,入参的全限定类名或类型别名;
keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置;
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中;

useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。
MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,
可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了;

statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE;
flushCache ,取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存;
timeout ,默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常;
databaseId ,取值范围Oracle|mysql等,表示数据库厂家,元素内部可通过`<if test="_databaseId = 'oracle'">`来为特定数据库指定不同的sql语句;

13、spring中的注入方式和区别
@Autowired 与@Resource的区别
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、 @PostConstruct以及@PreDestroy。

	1、@Autowired按byType自动注入;
	默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false);
	如果我们想使用名称装配可以结合@Qualifier注解进行使用,如:@Autowired()@Qualifier("beanName");
	
	
	2、@Resource默认按 byName自动注入;
	@Resource有两个属性是比较重要的,分是name和type。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
	如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。
	
	
	@Resource装配顺序
	1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
	2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
	3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
	4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值