Java基础中的面试题(一),你能接几招(附答案(不带答案的面试题都是耍流氓))

 

  1. Java中的数据类型有几种?

    Java中的数据类型分为基本数据类型和引用数据类型两大类,基本数据类型中分为八种,分别是byte,short,int ,long,float,double,boolean ,char。 引用数据类型的定义是除了基本数据类型以外的所有类型,主要包括,类,接口, 数组, 枚举,注解等。

  2. java中的基本数据类型的长度范围?

    byte(1字节) , short(2字节) ,int(4字节), long(8字节),float(4字节) , double(8字节), boolean(1字节), char(2字节)

  3. 给出下列程序的输出结果:

    System.out.println(3+4); //7, 没什么可解释的

    System.out.println(3+'4');// 55, char值参与运算使用ascii进行运算,'4'的ascii 是52

    System.out.println('3'+'4');//103,51+52

    System.out.println(3+"4");//34,字符串参与运行,就是拼接

  4. 面向对象的特征

    封装, 继承 , 多态, 抽象

  5. 抽象类和接口的区别

    1. 抽象类中既可以定义常量有可以定义变量,接口中定义的变量默认为常量(默认都是用pubilc static final 修饰)

    2. 抽象类中既可以定义抽象方法,也可以定义非抽象方法;接口中只能定义抽象方法(默认用public abstract修饰,jdk8以后接口可以定义非抽象方法,但是必须用default或 static修饰)

    3. 一个类最多是能继承一个抽象类,但是可以实现多个接口

    4. 抽象类是对事物根源的抽象,接口侧重对功能的扩展

    5. 接口不能实现接口,只能继承接口,并且可以多继承

  6. switch中支持的数据类型

    switch中可以使用byte,short,char,int 或者对应的包装类和枚举类型。jdk7以后开始支持String类型,不支持long类型

  7. float f = 18.5; double d = 12.3; 这两种写法正确么?

    小数的默认类型是double, 所以像18.5 和 12.3其实都是double类型的, 把double类型赋值给float 是有问题的,因为有可能装不下。 所以第一种写法错误,第二种写法正确。简单来说,就是定义float类型的小数结尾必须加f. 正确写法: float f = 18.5f;

  8. 方法重载和方法重写的区别

    方法的重载(overload): 说的是一个类中的事。 一个类中可以存在多个名字相同的方法,但是必须保证参数的类型或个数不同,这几个方法叫做重载的方法,与返回值无关。

    方法的重写(override): 说的是父类和子类中的事,子类中出现了和父类中一模一样的方法,就是重写的方法,可以在子类的方法上加 @Override注解验证。 关于重写有一些特殊情况需要注意:

    私有和静态方法不能重写。 子类重写父类中的方法访问权限不能更低。子类抛出的异常不能比父类大。

  9. equals 和 == 的区别

    equals 是 Object类中的方法,所以代表所有的对象中都可以调用这个方法。如果没有重写equals方法,那么调用的时候相当于都是在调用父类Object中的equals方法, Object类中的equals就是使用 == 实现的。==在连接基本数据类型的时候,比较的是值。 连接引用数据对象的时候比较的是地址值。

  10. 数组初始化的两种方式:

    静态初始化: int[] arr = new int[10];

    动态初始化: int[] arr = new int[]{1,2,3,4,5}; 可简写为: int[] arr = {1,2,3,4,5};

  11. Object类中有哪些方法?介绍一下equals和 hashCode() 方法的区别及注意事项

    Object类中有 hashCode(), equals(Object), toString(), clone(),wait(), notify(), notifyAll() 等方法。

    hashCode:可以看做是当前对象的一个地址值经过计算后得到的值,所以我们可以根据两个对象的hashCode值是否相等来判断二者是不是同一个对象。native方法,底层使用c语言实现。

    equals: 判断对象是不是同一个对象。默认的equals是== 也就是比较地址值。我们可以重写equals方法。

    两个方法都可以用来比较对象是否相同。但是由于hashCode 底层是用c语言实现的,所以速度较快,但他的缺点是由于使用算法生成的,可能在某些极端的情况之下出现两个不同的对象经过算法后得到的hashCode值相同。所以一般我们比较的时候,一般先比较hashCode是否相等,如果hashCode不相等,说明肯定不是同一个对象,如果hashCode相等,也不能代表是同一个对象,因为上面说了存在一些极端情况,所以在使用equals比较。像hashSet, HashMap中都是使用这样的比较方式,也是业界公认的比较方式。这也是为什么我们在重写hashCode的时候也要重写equals, 因为大家都这么用,我们必须要保证他们两者返回结果的一致性。否则就会出问题。

  12. HashMap的实现原理:

    HashMap底层是使用hash表(数组+链表) 的形式进行存储。 当一个键值对存储到HashMap中的时候,会先根据key通过hash算法计算出一个值,这个值就是代表存储到数组中的那个位置,如果多个key得到的值相同,代表这几个数据要存储到同一个数组的位置上,这种情况叫做哈希冲突,此时会以链表的形式将hash冲突的元素连接起来。 hashMap有个负载因子,默认是0.75, 当hashMap中存储的元素对数超过数组程度*负载因子时,会触发自动扩容。jdk1.8以后,当链表长度超过8会自动转为红黑树,当红黑树的个数小于6会转为链表。 当key值完全相同时(通过hashCode,equals比较), value会覆盖。

  13. 实现多线程的方式

    1. 继承Thread类,重写run方法,调用start()

      new Thead(()->{}).start();

    2. 实现Runnable接口,重写run方法,创建Thread对象,传入Runnable, 调动start()

      new Thread(new Runnable()-{}).start();

    3. 使用线程池,传入Runnable:

  14. 获取Class对象的几种方式:

    1. 类名.class: Class clazz = Person.class;

    2. 对象名.getClass(); Class clazz = person.getClass();

    3. Class.forName(全类名); Class clazz = Class.forName("com.test.Person");// 有异常需要处理

 

更多面试及技术资料,请关注公众号 java_breeze 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章