以面试的心态来提升自我

一、JavaSE基础

1.Java面向对象

面向对象有哪些特性以及如何理解?

  1. 封装 只对外提供接口,隐藏细节
  2. 继承 让系统或者功能有一定的延续性
  3. 多态 编译时的多态和运行时的多态
    运行时的多态表现为:A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的。
    还有一种是:方法重写(override)
    编译时的多态表现为:方法重载(overload)
    如果是四大特性,则加上“抽象
    抽象是将一类对象的共同特征总结起来构造类的过程,包括数据抽象和行为抽象两方面。
    2.为什么要用clone?
    new一个对象的过程和clone一个对象的过程区别?

    Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别 https://www.cnblogs.com/yunger/p/5793632.html

    3.&&与&的区别

    &&表示为:逻辑,短路运算符;
    为何为称之为短路,因为如果&&左边的表达式值为false,右边的表达式就会被直接短路掉,不会进行运算

4.在Java中,如何跳槽当前的多重嵌套循环?
  • 标记
  • break
    例如:

    /**
     * 使用标记方式
     */
    public static void method1(){
        System.out.println("***********method1***********");
        ok:
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                if (i==5&&j==3) {
                    System.out.println("跳出:i="+i+",j="+j);
                    break ok;
                }
            }
            System.out.println("外层i="+i);
        }
    }
    
    /**
     * 使用break或者countinue
     */
    public static void method2(){
        System.out.println("***********method2***********");
        boolean flag = false;
        for (int i = 1; i < 10&&!flag; i++) {
            for (int j = 1; j < 10; j++) {
                if (i==5&&j==3) {
                    flag = true;
                    System.out.println("跳出:i="+i+",j="+j);
                    break;
                }
            }
            System.out.println("外层i="+i);
        }
    }
    
    /**
     * 这种是不会跳出外层循环,之后继续往下走
     */
    public static void method3(){
        System.out.println("***********method3***********");
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                if (i==5&&j==3) {
                    System.out.println("跳出:i="+i+",j="+j);
                    break;
                }
            }
            System.out.println("外层i="+i);
        }
    }
    
    public static void main(String[] args) {
        method1();
        method2();
        method3();
    }

    结果如下:
    以面试的心态来提升自我

5.当一个对象被当作参数传递到一个方法后,此方法可改变该对象的属性,并返回变化后的结果,属于值传递还是引用传递?

值传递,Java中只支持参数的值传递

6.重写(@override)和重载(@overload)的区别?

重载:

//顺序不同
    public void method(int a,String b){

    }
    //类型不同
    public void method(String a,int b) {

    }
    //个数不同
    public void method(float a){

    }

区别如下:

  • 方法名一致,参数列表中参数的顺序、类型、个数不同
  • 与方法的返回值无关----也就是说:返回类型不一样,也不能称为重载
  • 可以抛出不同的异常,也可以有不同的修饰符
    重写的规则
    1. 参数、返回类型一致
    2. 不能被重写的:构造方法、final、static
    3. 访问权限不能小于
    4. 不能抛出非强制异常
为什么不能根据返回类型区分重载?

因为在调用时,在不指定返回类型时,编译器是不知道要调用哪个函数的。
例如:

float  a(int a,int b)

void a(int a,int b)
7.char变量能不能存储一个汉字,为什么?

可以,在Java中,编码格式为Unicode,char类型占2个字节。

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

相同之处:

  • 不能被实例化
  • 可以作为引用类型(即作为参数传递)
  • 如果一个类继承了某个抽象类或者实现了某个接口,都需要对其中的方法进行实现,否则该类仍被需要声明为抽象类
    例如:

    
    public interface A {
    int method1();
    
    String method2();
    }

//需要声明该类为抽象类
public abstract class C implements A{

@Override
public int method1() {
    return 0;
}

//可省略该方法,因为未实现
@Override
public abstract String method2();

//错误

A a = new A();
//错误
B b = new B();

}


-----

不同之处:
 ##### 抽象类:
```java
public abstract class B {

    //1.抽象类中可以定义构造器
    public B(){

    }
    //2.可以有抽象方法
    abstract int method1();

    //3.可以有具体方法
    int method2(){
        return 0;
    }
    //4.可以定义成员变量
    int a;
    //5.抽象类中可以有静态方法
    static int method3(){
        return 0;
    }
    //6.有抽象方法的类必须为抽象类,而抽象类中未必有抽象方法
    //7.一个类只能继承一个抽象类
}

而接口:

  • 接口中不能定义构造器
  • 方法中全部都是抽象方法
  • 修饰符可以是private、默认、protected、public
  • 接口中的成员变量都是为常量
  • 接口中不能有静态方法
  • 一个类可以实现多个接口
9.Java的异常处理机制?

在Java中,对异常进行了分类,所有的类继承于Throwable这个类,下面的Exception和Error两个类继承,Error异常一般表现为:内存溢出、磁盘读写、jvm堆栈信息错误等,而Exception异常表示为可被处理的异常,又被分为检查异常和运行时异常。

10.finalize 什么作用

Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的方法,如果覆盖此方法,则可以在垃圾收集时的其他资源回收,例如:关闭文件等。

11.switch目前可以作用在什么类型上面?

java5之前:byte、short、char、int
java5之后:增加枚举(enum)
java7之后:增加String

12.Java中“+”和StringBuilder/StringBuffer哪个效率更高?为什么?示例:String s = "abc" + "ddd"。

依据情况而定,从反编译的代码中看到有很明显的区别,对于此问题,性能基本一致,但是如果对于循环操作的话,在反编译的过程中,会看到“+”被反编译了10次,创建了10次对象,造成了资源浪费

13.String s1 = "Java";String s2 = "Ja"+"va";s1==s2 ?那s1==s2.intern()

根据上个问题中,Java中的“+”在编译时会被翻译成StringBuilder,此时s2为一个对象,s1为字符串,为false
String对象的intern()方法会得到字符串对象在常量池对于的版本引用,此时会返回true

14.如何得到日期的年月日?

java8

LocalDateTime dt = LocalDateTime.now();
        //年
        System.out.println(dt.getYear());
        //月 1-12
        System.out.println(dt.getMonthValue());
        //日
        System.out.println(dt.getDayOfMonth());
        //时
        System.out.println(dt.getHour());
        //分
        System.out.println(dt.getMinute());
        //秒
        System.out.println(dt.getSecond());
15.如何得到1970年1月1日0时0分0秒到现在的毫秒数?
//第一种
        Calendar.getInstance().getTimeInMillis();
        //第二种
        System.currentTimeMillis();
        //第三种:java8
        Clock.systemDefaultZone().millis();
16.获取当月的第一天和最后一天?
SimpleDateFormat  format = new SimpleDateFormat("yyyy-mm-dd");
        //获取当月第一天
        Calendar c1 = Calendar.getInstance();
        c1.add(Calendar.MONTH, 0);
        //设置为1号
        c1.set(Calendar.DAY_OF_MONTH, 1);
        String first = format.format(c1.getTime());

        //获取当月最后一天
        Calendar c2 = Calendar.getInstance();
        c2.set(Calendar.DAY_OF_MONTH, c2.getActualMaximum(Calendar.DAY_OF_MONTH));
        String last = format.format(c2.getTime());
        System.out.println("该月第一天:"+first+",最后一天:"+last);

        //Java8
        LocalDate today = LocalDate.now();
        //第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth(), 1);

        LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println("该月第一天:"+firstDay+",最后一天:"+lastDay);
17.如何格式化日期?
//第一种
        SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy/mm/dd");
        Date date1 = new Date();
        System.out.println(oldFormat.format(date1));

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

在Java8中,引用了新的时间日期API,LocalDate、LocalTime、LocalDateTime、Clock、Instant等,使用了不变模式,是线程安全的。

18.获得昨日的当前时刻?
Calendar c1 = Calendar.getInstance();
        c1.add(Calendar.DATE, 1);
        System.out.println(c1.getTime());

        //java8
        LocalDateTime today = LocalDateTime.now();
        LocalDateTime yest = today.minusDays(1);
        System.out.println(yest);
19.Java 8的日期特性?
  • 不变性 在的API中所有的类都是不可变的,线程为安全的
  • 清晰 所有的方法都被明确定义用以实现相同的行为
  • 可扩展性 基于IOS-8601日历系统上的
  • 关注点分离 新的API将时间、日期、时间戳等分离开来
  • 使用操作 所有的类都实现了一系列的方法 来完成:加、减、格式化等
20.Java 8 日期/时间常用API

以面试的心态来提升自我

以面试的心态来提升自我

21.总结日期

以面试的心态来提升自我

二、Java的数据类型

1.int和Integer有什么区别,为什么?

int是基本数据类型,Integer是对象,是为了可以让int当作对象来处理,java5时引用的自动装箱拆箱使得可以互换。
例如:

Integer a = new Integer(3);
        Integer b = 3;
        int c = 3;
        //false b会自动装箱成Integer类型
        System.out.println(a == b);
        //true 因为:a自动拆箱成int类型再和c比较
        System.out.println(a == c);

但也不是所有的都会相等。
例如:

Integer f1 = 100,f2=100,f3=150,f4=150;
        //true 
        System.out.println(f1==f2);
        //false 因为-128-127的数值不会new Integer对象,而是引用
        System.out.println(f3==f4);
2.数据类型的转换

以面试的心态来提升自我

三、Java中的IO

1.字节流和字符流

以面试的心态来提升自我

以面试的心态来提升自我

2.字节流和字符流的区别?
  • 字节流读取一个字节处理一个字节,字符流读取到一个或多个字节时,先去查指定的编码表,将查到的字符返回
  • 字节流可以处理所有类型的数据,如mp3,图片等;字符流只能处理字符
  • 字节流操作byte,字符流操作Unicode字符串

四、Java的集合

1.怎么对HashMap<Integer,User>进行排序?

思路:

  • 取得entrySet
  • 转换为list
  • 循环list,放入linkedHashMap
//针对hashMap进行排序
    public static HashMap<Integer, B> sortHashMap(HashMap<Integer, B> map){
        //1.拿到map的键值对集合
        Set<Entry<Integer, B>> entryset = map.entrySet();
        //2.将set转换为list集合,为了使用工具类的排序方法
        List<Entry<Integer, B>> list = new ArrayList<>(entryset);
        //3.使用Collections集合类对list进行排序,排序规则可以使用匿名类实现
        Collections.sort(list,new Comparator<Entry<Integer, B>>() {

            @Override
            public int compare(Entry<Integer, B> o1, Entry<Integer, B> o2) {
                //按照age倒叙排序
                return o2.getValue().getAge()-o1.getValue().getAge();
            }

        });
        //4.创建一个有序的LinkedHashMap
        LinkedHashMap<Integer, B> linkedHashMap = new LinkedHashMap<>();
        //5.将list数据存放到linked中
        for (Entry<Integer, B> entry : list) {
            linkedHashMap.put(entry.getKey(), entry.getValue());
        }
        return linkedHashMap;

    }
2.集合中哪些是线程安全的,如果不是怎么办?
  • Vector、HashTable为线程安全的
  • Collections工具类提供了相关的API,可以转换为线程安全的
3.List子类的三个特点

以面试的心态来提升自我

4.List、Map、Set的区别

以面试的心态来提升自我

转载于:https://blog.51cto.com/mazongfei/2106959

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值