首页 > 试题广场 >

以下说法中正确的有?

[不定项选择题]
以下说法中正确的有?
  • StringBuilder是 线程不安全的
  • Java类可以同时用 abstract和final声明
  • HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
  • volatile关键字不保证对变量操作的原子性
A.StringBuilder线程不安全,StringBuffer线程安全。
B.同时用 abstract和final就会自相矛盾。
C.Hashmap中的value可以之null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。
D.volatile关键字有两个作用:
1.并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据
2.并发环境有序性:通过对volatile变量采取内存屏障(Memory barrier)的方式来防止编译重排序和CPU指令重排序,具体方式是通过在操作volatile变量的指令前后加入内存屏障,来实现happens-before关系,保证在多线程环境下的数据交互不会出现紊乱。
发表于 2020-05-03 11:02:57 回复(12)
abstract修饰的类是抽象类,是可以继承的,而final修饰的类表示不能再被继承,故肯定不能共同使用。故B错。
HashMap中提供的get(key)获取的是变量,无法判断是否存在key。所以C是错的
volatile关键字是一种轻量级的同步机制,只保证数据的可见性,而不保证数据的原子性。故D对
发表于 2019-09-28 15:31:40 回复(1)
由于HashMap的value允许为null值,所以C选项是错误的
发表于 2019-10-03 01:21:23 回复(5)
  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况


在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
发表于 2019-08-28 15:53:44 回复(3)

volatile不会保证原子性,D也正确

发表于 2019-08-21 08:30:43 回复(5)

String、StringBuffer、StringBuilder

  • String:不可变,线程安全;
  • StringBuffer:可变,线程安全;
  • StringBuilder:可变,线程不安全;

抽象类

抽象类不能声明为 final, 被声明为 final 的类无法被继承,很明显不符合抽象类的定义;

HashMap

get(key) 只是获取 key 对应的 value,无法判断是否 key 存在;

volatile

轻量级的同步机制,能保证数据的可见性,但不能保证数据的原子性;

发表于 2020-08-10 11:27:20 回复(1)
A.StringBuilder线程不安全,StringBuffer线程安全。 B.同时用 abstract和final就会自相矛盾。 C.Hashmap中的value可以为null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。 D.volatile关键字有两个作用: 1.并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据 2.并发环境有序性:通过对volatile变量采取内存屏障(Memory barrier)的方式来防止编译重排序和CPU指令重排序,具体方式是通过在操作volatile变量的指令前后加入内存屏障,来实现happens-before关系,保证在多线程环境下的数据交互不会出现紊乱。
发表于 2021-10-31 22:39:40 回复(1)
import java.util.*;

class HashMapDemo{
    public static void main(String[] args){
        Map<String,String> map=new HashMap<>();
        map.put("1",null);
        System.out.println(map.get("1"));
        System.out.println(map.get("2"));
    }
}
答案:
因为HashMap可以使用null作为value,所以map.get(key)得到的null,有可能是value值为null,也有可能是key不存在
发表于 2020-03-20 15:33:29 回复(1)
final的类不能被重写和继承,而abstract的类是抽象类,本身没有实现,只能通过子类来实现,也就是说必须被继承。所以说它们是没法同时做修饰符的。
发表于 2019-09-15 10:22:35 回复(0)
D选项,应该也是对的,虽然秒选了A volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
发表于 2019-08-21 13:07:41 回复(0)
  • 选项A:StringBuffer和StringBuilder都是字符串缓冲类,但是StringBuffer是线程安全的,而StringBuilder是线程非安全的。即A正确。
  • 选项B:被abstract修饰的类是抽象类,是可以被继承的,但是被final修饰的类是最终类,是不能被继承的。二者互相矛盾,不能共同修饰同一个类,故B错误。
  • 选项C:HashMap的key和value都可以为null,故不能
    使用 get(key)==null可以 判断这个Hasmap是否包含这个key
  • 选项D:volatile关键字是一种轻量级的同步机制,能够保证数据的可见性,禁止指令重排,但是不保证原子性。故D正确。
发表于 2020-06-11 20:09:29 回复(0)
Hashmap中的value可以为null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。
发表于 2022-03-12 10:19:06 回复(0)
  • StringBuilder是线程不安全的
  • StringBuffer是线程安全的
发表于 2020-04-09 10:58:48 回复(0)
volatile关键字是一种轻量级的同步机制,只保证数据的可见性,而不保证数据的原子性
volatile关键词是一种轻量级的同步机制,只保证数据的可见性,而不保证数据的原子性
发表于 2022-08-16 16:55:20 回复(0)

关于volatile涉及到的并发编程知识:

原子性

即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性就像数据库里面的事务一样,他们是一个团队,同生共死。

可见性

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。Java提供了volatile关键字来保证可见性。另外,通过synchronized和Lock也能够保证可见性。

有序性

即程序执行的顺序按照代码的先后顺序执行。

编辑于 2020-06-08 22:34:32 回复(0)
A、D都对啊
发表于 2019-08-23 17:47:49 回复(0)
volatile不能保证原子性,D正确
发表于 2019-08-22 22:43:27 回复(0)
`LinkedList` 和` ArrayList `都是不同步的,线程不安全;

`Vector` 和` Stack` 都是同步的,线程安全;

`Set`是线程不安全的;

`Hashtable`的方法是同步的,线程安全;

`Properties`实现了`Map`接口,是线程安全的 ;

`HashMap`的方法不是同步的,线程不安全;

`StringBuffer`是线程安全的,相当于一个线程安全的`StringBuilder  ` ;

`StringBuilder`是线程不安全的
编辑于 2024-02-29 09:03:21 回复(0)
转+补充
String,StringBuffer,StringBuilder三者之间的区别?
在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
更细节比较,文章链接:Java String、StringBuffer 和 StringBuilder 的区别 | 菜鸟教程 (runoob.com)
Hashmap
首先Hashmap是key不可重复,value是可以重复的,都允许使用null值
get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。

是线程不安全的

volatile关键字(并发编程应用)
Java的volatile关键字就是
设计用来解决变量可见性问题。 将counter变量声明为volatile,则在写入counter变量时,也会同时将变量值写入到主存中。 同样的,在读取counter变量值时,也会直接从主存中读取。 将一个变量声明为volatile,可以保证变量写入时对其他线程的可见。
发表于 2023-05-07 13:00:25 回复(0)
A.StringBuilder线程不安全,StringBuffer线程安全 B.abstract修饰抽象类可以被继承而final修饰的对象不能被继承 C.HashMap中value的值可以为Null,get(key)==null,有两种情况,一是key中存的值为Null,二是不存在这个key D.volatile 关键字是一种轻量级的同步机制,只保证数据的可见性,而不保证数据的原子性
发表于 2022-10-12 19:55:57 回复(0)