题目
选自牛客网
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。
总结
记住,成功往往青睐那些敢于尝试、不畏失败、持续努力的人。少年,你的时间和机会都还很多,不要害怕犯错,因为每一次失败都是通往成功的宝贵经验。保持热情,坚定信念,勇敢地追求你的梦想,你的人生将因你的努力而精彩!
所以,少年,不要犹豫,往前冲吧,你的未来充满无限可能!