Day1.JAVA练习总结——2020.03.01

今日练习情况:

  • 洛谷日常编程练习;

  • 牛客网——java知识总结

1.抽象类不能实例化

(C++以前有讲过的呀,忘记了,反思!)

A 是抽象父类或接口, B , C 派生自 A ,或实现 A ,现在 Java 源代码中有如下声明:
1. A  a0=new  A();
2. A  a1 =new  B();
3. A  a2=new  C();
问以下哪个说法是正确的?(A )
A.第1行不能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行、第2行和第3行的声明都是正确的

2.JAVA细节

以下说法中正确的有?
正确答案: A D   你的答案: C (错误)
A.StringBuilder是 线程不安全的
B.Java类可以同时用 abstract和final声明
C.HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
D.volatile关键字不保证对变量操作的原子性
2.1 StringBuilder:

StringBuilder是线程不安全的,而StringBuffer是线程安全的; StringBuilder和StringBuffer内部和String一样,都使用char[]数组存储字符串,区别在于String使用final修饰,不可变。StringBuilder和StringBuffer可变。这两个都继承了AbstractStringBuilder类,
StringBuffer适合多线程(同步),而StringBuilder被设计用来作为StringBuffer的简易替换,他适合单线程(单线程下速度比StringBuffer快)StringBuffer之所以线程安全是因为用了synchronized定义,其实就是加锁了,且内部所有的公有方法都加了锁。

2.2 abstract和final声明

java类中abstract和final声明绝对不能共存。
abstract的存在是为了让子类去实现它,即必须被修改;
而final的存在是不允许被修改,两者互斥,所以不能同时存在。

2.3 HashMap

借鉴文章
就本题而言,key为null,会直接去table[0]处检索,并不会返回null.

 public V get(Object key) {
     //如果key为null,则直接去table[0]处去检索即可。
        if (key == null)
            return getForNullKey();
        Entry<K,V> entry = getEntry(key);
        return null == entry ? null : entry.getValue();
 }
2.4 volatile关键字

volatile详细文章借鉴参考
原子操作:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

总结一下,一个被volatile声明的变量主要有以下两种特性保证保证线程安全。

  1. 可见性。
  2. 有序性。

因为Java里面的运算并非是原子操作,所以volatile并不能完全保证一个变量的线程安全。
但是在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:

  1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
  2. 变量不需要与其他状态变量共同参与不变约束。

3.截止JDK1.8版本,java并发框架支持锁包括哪些?

A. 读写锁
B. 自旋锁
C. X锁
D. 乐观锁
E. 排他锁
答案:ABD
1.自旋锁,自旋,jvm默认是10次,由jvm自己控制,for去争取锁
2.乐观锁,相信这里是安全的
不包含 排它锁(X锁),若事务T对数据对象A加上x锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A
(不是很了解呢~~)

4.下面有关java threadlocal说法正确的有?

A. ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递;
B. 线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收;
C. 在Thread类中有一个Map,用于存储每一个线程的变量的副本。
D. 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式;

答案:ABCD

感悟:
第一天做牛客上面的题,感觉很不友好 ~~主要还是自己太菜了
其实之前用java完成学校的大作业或者课设啥的都没涉及到这么复杂的问题,也没有系统的学过这类知识。所以比较尴尬。。。
昨天听了一个大佬的直播,决定养成每天写博客的习惯,记录自己的所学所想!奥利给!
希望顺利找到暑期实习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值