Day1.JAVA练习总结——2020.03.01

本文总结了Java编程中的关键概念,包括抽象类与接口的使用、StringBuilder与StringBuffer的区别、HashMap的内部机制、volatile关键字的作用及限制、Java并发框架支持的锁类型以及ThreadLocal的运用。通过对这些知识点的深入解析,帮助读者理解Java的线程安全、并发控制和数据结构等核心领域。

今日练习情况:

  • 洛谷日常编程练习;

  • 牛客网——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完成学校的大作业或者课设啥的都没涉及到这么复杂的问题,也没有系统的学过这类知识。所以比较尴尬。。。
昨天听了一个大佬的直播,决定养成每天写博客的习惯,记录自己的所学所想!奥利给!
希望顺利找到暑期实习。

内容概要:本文详细介绍了一个基于Java和Vue的联邦学习隐私保护推荐系统的设计与实现。系统采用联邦学习架构,使用户数据在本地完成模型训练,仅上传加密后的模型参数梯度,通过中心服务器进行联邦平均聚合,从而实现数据隐私保护与协同建模的双重目标。项目涵盖完整的系统架构设计,包括本地模型训练、中心参数聚合、安全通信、前后端解耦、推荐算法插件化等模块,并结合差分隐私与同态加密等技术强化安全性。同时,系统通过Vue前端实现用户行为采集与个性化推荐展示,Java后端支撑高并发服务与日志处理,形成“本地训练—参数上传—全局聚合—模型下发—个性化微调”的完整闭环。文中还提供了关键模块的代码示例,如特征提取、模型聚合、加密上传等,增强了项目的可实施性与工程参考价值。 适合人群:具备一定Java和Vue开发基础,熟悉Spring Boot、RESTful API、分布式系统机器学习相关技术,从事推荐系统、隐私计算全栈开发方向的研发人员。 使用场景及目标:①学习联邦学习在推荐系统中的工程落地方法;②掌握隐私保护机制(如加密传输、差分隐私)与模型聚合技术的集成;③构建高安全、可扩展的分布式推荐系统原型;④实现前后端协同的个性化推荐闭环系统。 阅读建议:建议结合代码示例深入理解联邦学习流程,重点关注本地训练与全局聚合的协同逻辑,同时可基于项目架构进行算法替换与功能扩展,适用于科研验证与工业级系统原型开发。
源码来自:https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值