每日一题12-二进制的插入-查找组成一个偶数最接近的两个素数

本文探讨了Java中的重载与重写概念,HashMap的特性和工作原理,IO读写文件的File类使用,volatile关键字的作用,异常处理中的检查型异常,以及进制转换和位运算的应用。同时讲解了如何找到组成偶数最接近的两个素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【重载与重写】

以下方法,哪个不是对add方法的重载?
public class Test
{
public void add( int x,int y,int z){}
}
A public int add(int x,int y,float z){return 0;}
B public int add(int x,int y,int z){return 0;}
C public void add(int x,int y){}
D 以上都不是
【答案】:B
【解析】:
在这里插入图片描述

重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关。

重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写。重写(override):一般都是表示子类和父类之间的关系。
重写的主要特征:

  • 方法名必须相同,返回值类型必须相同
  • 参数列表必须相同
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  • 构造方法不能被重写

【HashMap】

在Java中,关于HashMap类的描述,以下错误的是
A HashMap使用键/值得形式保存数据
B HashMap 能够保证其中元素的顺序
C HashMap允许将null用作键
D HashMap允许将null用作值
【答案】:B
【解析】:HashMap的底层是由数组加链表实现的,对于每一个key值,都需要计算哈希值,然后通过哈希值来确定顺序,并不是按照加入顺序来存放的,因此可以认为是无序的,但不管是有序还是无序,它都一个自己的顺序。故B错。
Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的,这样会导致按照顺序读取的时候和存入的顺序是不一样的。
HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;
HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

【IO读写文件】

在Java中,( )类提供定位本地文件系统,对文件或目录及其属性进行基本操作
A FileInputStream
B FileReader
C FileWriter
D File
【答案】:D
【解析】: File是文件和目录路径名的抽象表示形式。
ABC的区分 见原文链接:https://blog.csdn.net/yhl_jxy/article/details/79272792

【volatile】

volatile关键字的说法错误的是
A 能保证线程安全
B volatile关键字用在多线程同步中,可保证读取的可见性
C JVM保证从主内存加载到线程工作内存的值是最新的
D volatile能禁止进行指令重排序
【答案】:A
【解析】:Java中的volatile关键字的功能
volatile是java中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。volatile关键字一般在多线程下使用,主要体现在以下几个方面:

  • 保证内存可见性【所有线程都能看到共享内存的最新状态】
    可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。工作内存是线程独享的,主内存是线程共享的。
  • 禁止指令重排序优化
    禁止指令重排序优化。大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile关键字就可以从语义上解决这个问题。
    -不保证原子性

【异常】

下列哪种异常是检查型异常,需要在编写程序时声明?
A NullPointerException
B ClassCastException
C FileNotFoundException
D IndexOutOfBoundsException
【答案】:C
【解析】:https://blog.csdn.net/weixin_43793613/article/details/120083762
六、【抽象类】
选项中哪一行代码可以添加 到题目中而不产生编译错误?
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
A public abstract void method(int a);
B constInt = constInt + 5;
C public int method();
D public abstract void anotherMethod() {}
【答案】:A
A:该方法是抽象方法,所以没有方法体,和题目中的method()方法构成了方法重载(方法名一致,参数不一致),所以是正确的,A正确
B:类体中只能定义变量和方法,不能有其他语句,所以B错误
C:选项中的方法和类中的方法重复,所以会发生编译异常,所以C错误
D:该项方法有abstract修饰,所以是抽象方法,由于抽象方法不能有方法体,所以D错误

【进制的换算,自增自减】

如下代码,执行test()函数后,屏幕打印结果为()
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + “”);
}
}
【答案】:-128 127
【解析】:byte范围是-128~127
++a是前置++,先运算+1后赋值,所以传的参数是128,又因为超过了byte范围,所以是-128
十进制 二进制
127 0111 1111
127 +1
-128 1000 0000

  • 注意:
    ++a是先运算后赋值,a++是先赋值后运算;
    若a=1;
    所以System.out.print(++a);//结果是2
    所以System.out.print(a++);//结果是1

【二进制的插入-位运算】

给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。

测试样例:
1024,19,2,6
返回:1100
【解析】:先读清题意,可以先将m左移j位,然后刚好对其到需要给n插入的 i~j 位置,此时,将m和n进行或运算|
n: 100 0000 0000(1024)
m: 000 0100 1100(19)
100 0100 1100

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        // write code here
        m = m<<j;//先把m 左移j位
        return m|n;
    }
}

【查找组成一个偶数最接近的两个素数】

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
本题含有多组样例输入。
输入描述:
输入一个偶数 20
输出描述:
输出两个素数 7 13
【解析】:本题首先需要判断素数,素数表示除过1和本身,不能被其它数整除。通过循环遍历来判断一个数是否为素数。最近的两个素数应该从最中间的位置开始向两边查找。

public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
        int  num = scan.nextInt();
        int n = num/2;
        for(int i=n;i>=1;i--){
            if(isframe(i)&&isframe(num-i)){
                System.out.println(i);
                System.out.println(num-i);
                break;
            }
           }
        }
    }
    public static boolean isframe(int num){
        for(int i = 2;i<num;i++){
            if(num%i==0){
                return false;
            }
        }
        return true;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值