JavaSE Java基础部分 笔试考点汇总 持续更新-------

1 篇文章 0 订阅
1 篇文章 0 订阅

文章内容输出来源:拉勾教育大数据训练营;

1. Java基础语法笔试考点

考点1.

byte x = 23 ; 正确
int x = 23 ; 
byte y = x ; 错误.不兼容的类型:从int转换到byte可能会有损失

解释:
23默认是int类型,把23赋给byte类型不报错是因为23是字面值常量且它没有超出byte范围;
但把int类型的变量赋给byte的变量会报错。高类型到低类型需要强制类型转换。

考点2.

System.out.println(0.1 + 0.2); // 结果为0.30000...04

结论:浮点数运算可能会有误差
解决:实现精确运算要借助 java.math.BigDecimal 类型

考点3.

byte b1 = 10;
b1 = b1 + 2;  // 错误:不兼容的数据类型:从int转换到byte可能会有损失

解释:b1是byte类型,和int类型的字面值常量相加时提升为int类型,所以 b1+2 的最后结果是int类型,赋值给b1时需要强制类型转换。

byte b1 = 10;
b1 = b1 + (byte)2; //  // 错误:不兼容的数据类型:从int转换到byte可能会有损失 

解释:byte + byte 相加结果还是int类型,这是因为编译器在相加时会进行编译优化,把byte都提升为int,以防超出byte表示范围。

byte b1 = 10;
b1 = (byte)(b1 + 2);   // 正确

解释:强制类型转换,将相加结果从int类型结果转化为byte类型。

byte b1 = 10;
b1 += 2; // 正确

解释:这种赋值运算符等价于等价于 b1 = (byte)(b1 + 2) ; ,所以也正确。

考点4.

  • 表示1-100g之间的所有重量,最少用几个砝码?

    考察二进制的权重的概念 1 2 4 8 16 32 64 共7个砝码即可。

考点5.

  • 如何用最有效率的方法计算2乘以8?

    用左移运算符,2 << 3 等价于 2 *2^3

考点6.

  • 在不借助第三个变量的情况下,如何实现两个整数变量数值的交换?

    eg:int ia= 3;ib = 5;交换后:ia = 5;ib = 3;

    方法1:

    ia = ia ^ ib;
    ib = ib ^ ia;
    ia = ia ^ ib;
    

    原理:两数异或的结果保存了两个数上每一个二进制位不同或相同的信息。

    方法2:

    ia = ia + ib;
    ib = ia - ib;
    ia = ia - ib;
    

2. Java面向对象笔试考点

考点1.

  • 父类和子类中都分别存在静态代码块、构造块、构造方法,那么在创建子类对象的时候这个6个的执行顺序是?

    先执行父类的静态代码块,再执行子类的静态代码块;
    然后执行父类的构造块,再执行父类的构造方法体;
    最后执行子类的构造块,再执行子类的构造方法体。

考点2.

  • abstract关键字不能和哪些关键字共同修饰一个方法或者一个类?
  1. private 和 abstract不能共同修饰一个方法;
    因为私有方法和构造方法子类都不能继承,不能继承的话就不能重写实现,而普通类继承抽象类必须重写实现抽象方法。
  2. final 和 abstract不能共同修饰一个方法;
    因为final修饰的方法不能被重写,而普通类继承抽象类必须重写实现抽象方法。
  3. static 和 abstract不能共同修饰一个方法;
    因为抽象类不能new对象,所以抽象方法是不能被调用的,加了static后,抽象方法会属于类层级而可以被调用,而抽象方法调用是没有意义的。
  4. final 和 abstract不能共同修饰一个类;
    抽象类存在的意义就在于继承,而加了final表示该类不能被继承。

考点3.

  • 接口和抽象类的主要区别?
  1. 定义抽象类的关键字是abstract,而定义接口的关键字是interface;
  2. 继承抽象类的关键字是extends,而实现接口的关键字是implements;
  3. 继承抽象类只支持单继承,而实现接口支持多实现;
  4. 抽象类中可以有构造方法,而接口中不可以有;
  5. 抽象类中可以有成员变量,而接口中只可以有常量;
  6. 抽象类中可以有成员方法,而接口中只可以有抽象方法;
  7. 抽象类中增加方法时子类可以不用重写,而接口中增加方法时实现类需要重写(Java8以前的版本);
  8. 从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
  9. 从Java9开始,接口中又允许出现私有方法,这是为了决绝Java8新特性的方法中冗余问题而产生的,这种私有方法仅仅是为了在当前接口的内部使用,用来简化多个非抽象方法中的共同部分,仅仅为了在非抽象方法中可以调用;同样地,多个静态方法中存在重复部分也可以写一个私有的静态方法进行简化

考点4.

  • 构造器能否被重写?为什么?

    不能。构造方法就不能继承,所以不能被重写。

考点5.

  • 重载和重写的区别?参数列表相同但返回值类型不同能重载吗?

    重载:
    方法名相同,参数列表不同,与返回值无关。父子类之间的方法也可以构成重载。
    重写:
    父子类之间,在子类中重写和父类一样的方法来覆盖从父类中继承下来的版本,以实现新的需求。
    要求返回值类型、方法名、参数列表完全相同;从Java5开始,允许重写方法中的返回值类型可以是原方法返回值类型的子类型。

考点6.

  • 使用final关键字修饰一个引用变量时,请问是引用不能变还是引用的对象不能变?

    引用不能变,即不能改变指向,但指向的内容可以改变。

考点7.

  • 简述复制引用和复制对象的区别.

    复制引用,在栈区申请内存空间,复制一个地址;
    复制对象,在堆区申请内存空间,复制引用指向的具体内容。


3. Java中一些常用类的笔试考点

考点1.

Integer i = 127;
Integer j = 127;
Integer i1 = new Integer(127);
Integer j1 = new Integer(127);
System.out.println(i == j); // true
System.out.println(i == j); // false

Integer x = 128;
Integer y = 128;
Integer x1 = new Integer(128);
Integer y1 = new Integer(128);
System.out.println(x == y); // false
System.out.println(x1 == y1); // false

分析:

首先,i1、j1、x1、y1 是通过new的方式创建了一个Integer包装类对象,必然地址不同结果为false;

i、j、x、y 都是通过自动装箱技术把一个int类型的值赋给一个Integer包装类。而在Integer的内部提供了自动装箱池技术,将-128到127之间的整数已经装箱完毕,当程序中使用该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率。所以值为127时结果为true,128时结果就为false。

考点2.

  • 请问下面的两行代码分别会创建几个对象?分别存放在什么地方?
String str1 = "hello";
String str2 = new String("world");

分析:

第一行会创建 1个对象,存放在常量池中;
第二行会闯将 2个对象,一个在常量池中,一个堆区。

考点3.

  • 给出打印结果,并说明为什么?
String str1 = "abcd";
String str2 = "ab" + "cd";
System.out.println(str1 == str2);    
String str3 = "ab";
String str4 = str3 + "cd";
System.out.println(str3 == str4);

结果:true 、 false

原因:str1 == str2 是因为常量优化机制的存在,str4 = str3 + “cd” 中由于str3是变量 ,所以它没有优化结果为false。

考点4.

  • StringBuilder类的对象本身可以修改,那为什么成员方法还有返回值呢?即源码中的return this是为了什么?

    返回自身为了可以连续调用,如 str.reverse().append(“a”).insert(0,“3”);

考点5.

  • 如何实现StringBuilder类型和String类型之间的转换?

    String str = strB.toString();StringBuilder到String
    StringBuilder strB = new StringBuilder( str );String到StringBuilder

考点6.

  • Calendar类是个抽象类对象不能创建对象,那么getInstance为什么可以获取Calendar类型的引用呢?

    由源码可知,返回的并不是Calendar类的对象,而是Calendar类的子类GregorianCalendar的对象。这是多态的一种使用场合,通过方法的返回值类型形成多态,即方法真正的返回值类型是方法声明的返回值类型的子类。

考点7.

  • Collection集合中add方法和addAll方法的区别、contains©和containsAll©的区别?

    前者是把集合c整体当作一个元素放在当前集合中,后者是把集合c中的所有元素一个个放入当前集合中。

考点8.

  • 为什么要求重写euqals方法后要重写hashCode方法呢?

    两个元素调用equals方法相等时证明这两个元素相同,重写hashCode()方法保证它们的哈希码值还是相同的,(即保证equals和hashCode方法具有关联性/一致性),哈希码值相同的话由同一个哈希算法生成的索引位置就相同,此时判断是否有相同元素只需与该索引位置的元素比较即可,从而在避免重复元素出现的功能上提高判断效率。

考点9.

  • 下面代码的输出结果是什么?
String str1 = "abc";
String str2 = new String("abc");
str2.intern();  // intern方法是获取对应字符串对应的常量池中的引用
System.out,println(str1 == str2);

结果:false

改为str2 = str2.intern(); 的话结果为true。

考点10.

  • String是线程安全的吗?

    是。String是不可变类,所以是线程安全的。
    所有不可变类都是线程安全的,线程安全的类不一定是不可变类,如StringBuffer是可变类,靠锁实现线程安全。

考点11.

  • 为什么在使用HashMap的时候总是使用String类作为key的类型?

    主要因为String类不可改变,内部哈希码值都会缓存记录下来,以后直接用不需要计算,效率高。因为本来存储value的时候就是根据key的哈希码值来一一对应存放。

考点12.

  • Collection 和 Collections 有什么区别?

    Collection是集合的顶层类;
    Collections是一个工具类。

考点13.

  • HashMap在Java7和Java8中有哪些主要的不同之处?

    Java7底层只是链表
    Java8底层是链表和红黑树,红黑也是用来解决哈希冲突的
    7是插入到前面,8是插入到后面

考点14.

  • 调用下述方法时,返回值为几?
public static int test() {
    try{
        int[] arr = new int[5];
        System.out.println(arr[5]);
        return 0;
    } catch (ArrayIndexOfBoundsException e) {
        e.printStackTrace();
        return 1;
    } finally {
        return 2;
    }
}

返回值为2。
因为return要结束方法,finally的作用就是在程序结束前执行,所以finally方法先于return 1执行,结果在finally中直接return2结束了方法。

public static int test() {
	int x = 1;
    try{
        return ++x;
    } catch (Exception e) {
    
    } finally {
        ++x;
    }
    return x;
}

返回值是2。
注意return ++x; 返回的是 ++x 这个表达式的值,而不是x的值。
执行流程是 先执行try中的 ++x,再执行finally中的 ++x,此时x的值为3,然后再执行try中的return语句返回++x这个表达式的值为2,此时该方法已经结束,return x并没有执行。

考点15.

  • InputStream类中的read()和read(byte[ ] data)分别有什么作用?各自返回的数据是什么值?

    前者是读取单个字节,后者是读满整个字节数组。
    前者读到末尾返回-1,未读到结尾返回读到的单个字节内容;
    后者读到末尾返回-1,未读到末尾返回实际读取到的字节的个数。

  • 当文件中的内容恰好是-1时如何处理?

    read()方法的返回值类型是int类型,4个字节。假如有一个字节内容是-1的话,那它也是先转换成int类型再返回,那么它的最终返回值也就不可能是-1了。所以不用处理即可区分这个-1是返回的字节内容还是末尾标志。

考点16.

  • 简述synhronized关键字和volatile关键字的主要区别

    synchronized是锁定代码块的,volatile是同步变量的。
    synchronized有锁,会阻塞,具有原子性。


以上内容均来自拉勾大数据训练营JavaSE部分奇点老师所讲的课堂内容以及直播复习总结。老师的每个知识点都讲解的很清晰,JavaSE部分学完感觉吸收的还不错。下一个阶段继续加油!

本阶段学完我最大的感受就是拉勾的课程体系和学习模式非常好。课程内容是录播在线学习,同时每个模块会有一次直播。课程内容按阶段划分整体结构,每个阶段再细分模块。每个模块学习完后有练习作业,模块内容可以反复学习,每做完一个模块的作业联系导师批改然后解锁下一模块,和闯关一样很有趣。这样也可以很好的把握自己的学习节奏,非常不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值