Java每日一练:挑战你的编程技能

题目

选自牛客网

1.定义有

StringBuffer s1=new StringBuffer(10);s1.append(“1234”),则s1.length()和s1.capacity()分别是多少?
A.4 10
B.4 4
C.10 10
D.10 4

正确答案是A
即s1.length()为4,s1.capacity()为10。

在Java中,StringBuffer是一个可变字符串类,它允许在字符串的末尾添加或删除字符,而不会产生新的字符串对象,这与不可变的String类形成对比。StringBuffer的构造函数可以接受一个参数,表示初始容量。在这个例子中,s1的初始容量被设置为10。

StringBuffer对象s1被初始化并使用append方法添加了字符串"1234"后,s1的长度变为4,因为"1234"包含4个字符。但是,s1的容量仍然是10,因为容量是指StringBuffer能够存储的最大字符数,而这个值在初始化时被设定为10,并且在没有调用ensureCapacity或类似方法改变容量的情况下,不会因为添加内容而自动改变。

因此,s1.length()返回4,s1.capacity()返回10。


2.下面有关SPRING的事务传播特性,说法错误的是?

A.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B.PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D.PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

正确答案是B,即PROPAGATION_REQUIRED并不是说如果当前没有事务,就抛出异常,而是如果当前没有事务,它会创建一个新的事务。

在Spring的事务管理中,PROPAGATION_REQUIRED是最常用的事务传播行为。它的行为可以总结如下:

  • 如果当前存在一个事务,那么方法会在这个事务中运行。
  • 如果当前没有事务,那么会创建一个新的事务,并且这个方法会在新事务中运行。

这意味着PROPAGATION_REQUIRED不会因为没有现有事务而抛出异常,相反,它会根据情况自动创建一个事务。这是Spring事务管理中最常见的需求,即确保方法在事务上下文中运行,无论调用栈中是否存在事务。

其他选项的描述是正确的:

  • PROPAGATION_SUPPORTS:如果当前存在事务,那么方法会在这个事务中运行;如果当前没有事务,那么方法会以非事务方式运行。
  • PROPAGATION_REQUIRES_NEW:总是创建一个新的事务,并挂起当前事务(如果存在)。
  • PROPAGATION_NESTED:在现有事务中创建一个嵌套事务,如果当前存在事务,它会创建一个保存点,允许嵌套事务独立提交或回滚,而不影响外层事务的状态。

因此,选项B中的描述是不准确的,正确的描述应该是PROPAGATION_REQUIRED支持当前事务,如果当前没有事务,它会创建一个新的事务。


3.java运行时内存分为“线程共享”和“线程私有”两部分,以下哪些属于“线程共享”部分

A.程序计算器
B.方法区
C.java虚拟机栈
D.java堆

正确答案是BD,即方法区和Java堆属于“线程共享”部分。

在Java运行时内存模型中,内存可以大致分为“线程共享”和“线程私有”两部分。线程共享部分是指在多个线程间共享的内存区域,而线程私有部分则只对单个线程可见。

  • Java堆(Java Heap):这是所有线程共享的内存区域。在堆中,对象实例和数组被分配和存储。它是垃圾收集器的主要工作区域。

  • 方法区(Method Area):也称为非堆(Non-Heap),同样被所有的线程共享。方法区存储类信息、常量、静态变量、即时编译器编译后的代码等数据。在JDK
    8及更高版本中,方法区被永久代(PermGen space)所取代,但概念上仍然存在。

而线程私有部分包括:

  • 程序计数器(Program Counter Register):每个线程都有一个独立的程序计数器,用于指示当前线程所执行的字节码指令的地址。

  • 虚拟机栈(Java Virtual Machine Stack):每个线程拥有一个独立的虚拟机栈,用于存储方法执行时的局部变量、操作数栈、动态链接、方法出口等信息。

因此,根据上述描述,选项B(方法区)和D(Java堆)属于“线程共享”部分,而选项A(程序计数器)和C(Java虚拟机栈)属于“线程私有”部分。

4.volatile关键字的说法错误的是

A.能保证线程安全
B.volatile关键字用在多线程同步中,可保证读取的可见性
C.JVM保证从主内存加载到线程工作内存的值是最新的
D.volatile能禁止进行指令重排序

正确答案是A,即volatile关键字并不能保证线程安全。

volatile关键字在Java中用于实现变量的可见性和禁止指令重排序,但并不保证线程安全。下面对每个选项进行详细解释:

A.能保证线程安全:这个说法是错误的。volatile关键字可以确保一个线程对变量的修改对其他线程是立即可见的,但它并不提供原子性或互斥性。这意味着volatile变量的读取和写入是原子性的,但是基于volatile变量的复合操作(如i++)在多线程环境下可能仍然会产生竞争条件和不一致的结果,因此不能保证线程安全。

5.下面哪个选项正确创建socket连接?

A.Socket s = new Socket(8080);
B.Socket s = new Socket(“192.168.1.1”,8080)
C.SocketServer s = new Socket(8080);
D.Socket s = new SocketServer(“192.168.1.1”,8080)

正确答案:B
在Java中,创建一个客户端Socket连接需要使用java.net.Socket类。正确的创建方式需要指定服务器的IP地址(或域名)以及端口号。因此,正确的选项是:

Socket s = new Socket("192.168.1.1", 8080);

这个语句创建了一个指向IP地址192.168.1.1且端口为8080的Socket连接。

选项分析:

  • A: new Socket(8080) 是不正确的,因为它缺少了服务器的地址信息,并且构造函数需要一个字符串类型的主机名或者IP地址和一个整数类型的端口号。
  • B: new Socket("192.168.1.1", 8080) 正确地指定了IP地址和端口号,这是正确的选项。
  • C: SocketServer 不是一个有效的Java类名;Java中用于监听并接受连接请求的是ServerSocket类。
  • D: SocketServer 同样不是一个有效的类名,并且这里混淆了客户端和服务端的角色。正确的服务端Socket创建方式应该是使用ServerSocket类。

因此,正确答案是 B

总结

在这里插入图片描述

记住,成功往往青睐那些敢于尝试、不畏失败、持续努力的人。少年,你的时间和机会都还很多,不要害怕犯错,因为每一次失败都是通往成功的宝贵经验。保持热情,坚定信念,勇敢地追求你的梦想,你的人生将因你的努力而精彩!

所以,少年,不要犹豫,往前冲吧,你的未来充满无限可能!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布说在见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值