题目
选自牛客网
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。
总结

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



















