刚从华为公司面试出来的被问到的10道题拿出来分享

1.char型变量中能不能存储一个中文汉字 为什么?

char类型可以存储一个中文汉字 因为Java中使用的编码是Unicode(不选择任何特定的编码 之间使用字符在字符集中的编号 这是统一的唯一方法)一个char类型占2个字节(16比特)所以放一个中文是没问题的

2.抽象类 abstract class 和接口 interface有什么异同?

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法 而接口中不能定义构造器而且其中的方法全部都是抽象方法 抽象类中的成员可以是 private 默认 protected public的而接口中的成员全部都是public的,抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量,有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

3.Java中会存在内存泄漏吗?请简单描述

理论上Java因为有垃圾回收机制GC 不会存在内存泄漏问题 这也是Java被广泛适用于服务器编程的一个重要原因;然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄漏的发生,例如Hibernate的Sssion(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭close或清空flush 一级缓存就可能导致内存泄露

4.抽象的方法是否可同时是静态的 是否可同时是本地方法 是否可同时被synchronized修饰

都不能抽象方法需要子类重写 而静态的方法是无法被重写的 因此二者是矛盾的 本地方法是由本地代码 实现的方法 而抽象方法是没有实现的也是矛盾的 synchronized 和方法的实现细节有关 抽象方法不涉及实现细节 因此也是互相矛盾的

5.阐述静态变量和实例变量的区别?

静态变量是被static修饰符修饰的也称为类变量 它属于类 不属于类的任何一个对象 一个类不管创建多少个对象 静态变量在内存中有且仅有一个拷贝 实例变量必须依存于某一个实例 需要先创建对象然后通过对象才能访问到他静态变量可以实现让多个对象共享内存

6.是否可以从一个静态static 方法内部发出对非静态方法的调用?

不可以 静态方法只能访问静态成员 因为非静态方法的调用要先创建对象 在调用静态方法时可能对象并没有被初始化

7.日期和时间

如何取得年月日 小时分钟秒

如何取得从1970年1月1日0时0分0秒到现在的毫秒数

如何取得某月的最后一天?

如何格式化日期?

问题1. 创建 java.util.Calendar实例,调用其get()方法传入不同的参数即可获得参数所对应的值.Java 8中可以使用java.time.LocalDateTime来获取,代码如下所示。

public class DateTimeTest{

  public static void main(String[] args){

    Calendar cal=Calendar.getInstance();

        System.out.println(cal.get(Calendar.YEAR));
        System.out.println(cal.get(Calendar.MONTH));    // 0 - 11
        System.out.println(cal.get(Calendar.DATE));
        System.out.println(cal.get(Calendar.HOUR_OF_DAY));
        System.out.println(cal.get(Calendar.MINUTE));
        System.out.println(cal.get(Calendar.SECOND));

 

      // Java 8
        LocalDateTime dt = LocalDateTime.now();
        System.out.println(dt.getYear());
        System.out.println(dt.getMonthValue());     // 1 - 12
        System.out.println(dt.getDayOfMonth());
        System.out.println(dt.getHour());
        System.out.println(dt.getMinute());
        System.out.println(dt.getSecond());

}

}

问题 2:以下方法均可获得该毫秒数

Calendar.getInstance().getTimeInMilis();

System.currentTimeMillis();

Clock.systemDefaultZone().nukkus();//Java 8

问题3:代码如下所示

Calendar time = Calendar.getInstance();
time.getActualMaximum(Calendar.DAY_OF_MONTH);

问 题4:利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;

class DateFormatTest {

    public static void main(String[] args) {
        SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");
        Date date1 = new Date();
        System.out.println(oldFormatter.format(date1));

        // Java 8
        DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        LocalDate date2 = LocalDate.now();
        System.out.println(date2.format(newFormatter));
    }
}

  补充:Java的时间日期API一直以来都是被诟病的东西,为了解决这一问题,Java 8中引入了新的时间日期API,其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等类,这些的 类的设计都使用了不变模式,因此是线程安全的设计。

 

 

你可能感兴趣的:(面试题)