Java中常见问题面试

本文探讨了Java编程中ArrayList按定义有序存放、序列化版本号的作用、hashCode方法的应用以及银行等额本息还款计算。此外,还涉及字符串的十六进制转换和全排列问题,以及构造器、接口与抽象类的区别。通过实例代码展示了相关概念和算法的实现。
摘要由CSDN通过智能技术生成

Java中常见问题面试

ArrayList如何实现插入数据按定义的方式有序存放

编程思路:实现一个类对ArrayList进行包装,当程序试图向ArrayList中放入数据时,程序先检查该元素与ArrayList集合中其他元素的大小,然后将该元素插入到指定未至

class MyBean implements Comparable
{
    public int compareTo(Object obj)
    {
        if(! obj instanceof MyBean)
            throw new ClassCastException();
        MyBean other=(MyBean)obj;
        return age>other.age?1:age==other.age?0:-1;
    }
}
class MyTest
{
    prvate ArrayList datas=new ArrayLisr();
    
    public void add(Object obj)
    {
        for(int i=0;i<datas.size();i++){
            if(obj.compareTo(datas.get(i)!=1)){
                datas.add(i.obj);
            }
        }
    }
}

序列化接口的版本号(id)有什么用?

反序列化Java对象时必须提供该对像的class文件,现在的问题是随着项目的升级,系统的class文件也会升级,Java如何保证两个class文件的兼容性?
Java序列化机制允许为序列化类提供一个private static final long类型的sericalVerionUID值,该Field值用于标识该java类的序列化版本,也就是如果一个类升级后,只要它的serialVersionUID值保持不变,序列化机制也会把它们当成同一个序列化版本

通常建议程序员为序列化类指定serialVersionUID指定值!如果程序员没有为序列化类的serialVersionUID的值;如果程序员主动为序列化类的serialVersionUID分配值,则可以控制只有对该类的修改影响序列化机制才会修改serialVersionUID的值

hasCode()方法的作用?

hashCode()方法与equals()方法相似,都是来自java.lang.Object类的方法,都允许用户定义的子类重写这两个方法

一般磊说,equals()这个方法是给用户调用的,如果你想根据自己的业务规则来判断两个对象下是否相等,你可以重写equals()方法。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,两个对象是不是相等

而hashCode()方法通常是给其他的类来调用的,比如我们要把两个对象放入HashSet时,由于HashSet要求两个对象不能相等,而HashSet判断两个对象是否相等的标准是通过equals()比较返回false、或两个对象的hashCode()方法返回值不相等——只要满足任意一个条件都会认为两个对象不相等。

从这个角度来看,我们可以把hashCode()方法的返回值当成这个对象的”标识符“,如果两个对象的hashCode()相等,即可认为这两个对象是相等的。因此当我们重写一个类equals()方法时,也应该重写它的hashCode()方法,而且这两个方法判断两个对象相等的标准是一样的

编写一个函数将一个十六进制的字符串参数转换成整数返回

String str="13abf";
int len=str.length();
int sum=0;
for(int i=0;i<len;i++)
{
    char c=str.charAt(len-1-i);
    int n=Character.digit(c.16);
    sum+=n*(1<<(4*i));
}
System.out.println(sum);

其实,也可以用Integer.parseInt(ste.16),但面试官很可能是想考我们的编码基本功

银行还款问题

银行贷款的还款方式中最常用的是一种叫"等额本息",还款法,即借款人在预定还款期限内的每一期(月)归还的金额(产生的利+部分本金)都是相等的,现在一笔总额为T元的N年期住房贷款,年利率为R,要求算出梅贻琦的还款的本金和利息总额,请写出解决思路和任意一种编程语言实现的主要代码

思路:既然是按月还款,那就是将N年按月来计算,即要还N*12个月,这样就可以求出每个月要归还的本金。由于每月要还得那部分都本金所欠得时间不同,所以,它们所产生得利息是不同得,该部分本金的利息为:部分本额×所欠月数×月利率。应该是这样一个算法,如果利息还计利息,如果月还款不按年利率来算,老百姓算不明白的。

int monthMoney=T/N/12;
float monthRate=R/12;
int totalMonth=N*12;
float totalRate=0;
for(int i=1;i<=totalMonth;i++)
{
    totalRate+=monthMoney*monthRate*i;
}
int result=monthMoney+totalRate/N/12;

任意数字序列”123456“之类,输出它们所有的排列组合

String str="fkjavx";
char[]arr=str.toCharArray();
String[]result={" "};
for(int i=0;iL<arr.lenth;i++)
{
    String[]tmp=new String[result.lenger*(arr.length-i)];
    int counter=0;
    for(int j=0;j<result.lengeth;j++)
    {
        for(int k=0;k<arr.length;k++)
        {
            System.out.println(j+"----"+result[j]);
            if(!result[j].comtains(arr[k]+" ")){
                tmp[counter++]=result[j]+arr[k];
            }
}
}
result=tmp;
    System.out.println(java.util.Arrays.toString(result));
}
System.out.println(java.util.Arrays.toString(result));

构造器Constructor是否可被override?

构造器Constructor不能继承,因此不能重写(Override),但可以被重载(Oberload)

接口是否可以继承接口?抽象是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类也可以继承具体类。抽象类中可以有静态的main方法。

只要记住《疯狂Java讲义》中的归纳:抽象类的特征是有得有失,得到的功能是抽象类可以拥有抽象方法(当然也可以没有):失去的功能的是抽象类不能创建实例了。至于其他的,抽象类与普通类在语法上大致也是一样的

写clone()方法时,通常都有一行代码,是什么?

clone()有默认行为:super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

abstract class和interface有什么区别?

含有abract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstact class,abstract clss类中的方法不必是抽象的。abstract class类型。

接口(interface)可以说成抽象类的一种特例,接口中的所有方法都必须是抽象的。接口的方法定义默认为Public abstract类型,接口中的成员变量类型默认为public static final

需要说明的是,Java8增强后的接口可以定义默认方法(使用default修饰的方法)和类方法(使用static修饰的方法),接口中的默认和类方法都不在抽象方法,都需要提供方法体。Java9则允许接口中定义pivate方法,private方法可以使用拥有方法体。

下面比较一下两者的语法区别:

  1. 抽象类可以有构造器,接口中不能有构造器
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
  3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法,Java 8增强的接口可拥有默认方法和类方法,接口中的默认方法和类方法都不再是抽象方法,都需要提供方法体。Java9则接口中定义private方法,private方法可以拥有方法体
  4. 抽象类的抽象方法的访问类型可以是public,protected和默认访问权限。但接口中的方法只能是public的,如果普通实例方法则必须是抽象方法,如果是默认方法则必须使用default修饰;如果是类方法则必须使用static修饰
  5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
  6. 一个类可以实现多个接口,但只能继承一个抽象类

下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,接口体现的是一种规范。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板模式是抽象类的一个典型应用,假设项目中需要使用大量的DAO组件,这些DAO组件通常都是具有增、删

、改、查等基本方法,因此我们就可以定义一个抽象的DAO基类,然后让其他的DAO组件来继承这个DAO基类,把这个DAO基类当成模板使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值