一、学习本章你将学习到连接到的新方法:
1、HashSet中的成员变量:map、hash
private transient HashMap map;
2、HashSet中的无参构造方法
3、HashMap中put()方法详解
4、put()方法中putval的作用以及Hash()方法的作用
5、putval方法中resize()方法的作用与返回值
6、putval()方法中构造节点的方法newCode()方法
7、putVal()方法中第二个if针对三种情形的处理方式
二、详解add的底层代码
1、创建HashSet集合时 :
public HashSet() {
map = new HashMap<>();
}
上面提到,执行创建对象,相当于调用无参构造方法HashSet,之后创建一个HashMap对象为map(HashSet中的成员变量)赋值;
2、使用HashSet中的add方法 :
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
可以看出,返回值是boolean型,并且执行了map中的put()方法,其中传入的e即是集合中的泛型,而PRESENT则是一个常量,下面分析put方法:
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
一、put方法返回的是putVal方法的返回值,可以看到其中的形参中 调用了hash方法,下面详解hash()方法的作用:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
该方法的返回值由key.hashCode()方法返回值的不同 决定的,既可以这样理解:只要key.hashCode()不同,返回值就不相同:(思考:hashCode()方法的作用?)
下面引入toString()方法:可以返回一个引用型对象的地址(默认条件下可以不写):注意:String类型的变量已将改写该方法,所以输出的是字符串
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
此时,我们理解到hashCode就是地址的十进制表达方式,而我们正常看到的地址是Integer.toHexString(hashCode())方法为我们转换成了十六进制的数:
public class Test {
public static void main(String[] args) {
Test test=new Test();
System.out.println(test.toString());
System.out.println(Integer.toHexString(test.hashCode()));
}
}
执行结果如下:moon.Test@52e922 52e922
注:对于正常的String方法,其中已经改写了hashCode方法,此时结论是:只要是对象中的字符串相同,那么hashCode的返回值相同:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
证明如下:
public class Test {
public static void main(String[] args) {
String str="Tom";
String str2=new String("Tom");
System.out.println(str==str2);
System.out.println(str.hashCode());
System.out.println(str2.hashCode());
}
}
执行结果为:false 84274 84274
执行结果说明:hashCode结果相同,而地址不同
二、putVal方法:
先看一下的底层代码分析:
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node[] tab; Node p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Node e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
第一个if()处:
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
1、resize()方法: 第一次赋值时为成员变量:table 和局部变量 tab赋予相同的地址(这两个属性为一个节点(Node)的集合)
final Node[] resize() {
Node[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
}
else if (oldThr > 0) // initial capacity was placed in threshold
newCap = oldThr;
else { // zero initial threshold signifies using defaults
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
if (newThr == 0) {
float ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
(int)ft : Integer.MAX_VALUE);
}
threshold = newThr;
@SuppressWarnings({"rawtypes","unchecked"})
Node[] newTab = (Node[])new Node[newCap];
table = newTab;
if (oldTab != null) {
for (int j = 0; j < oldCap; ++j) {
Node e;
if ((e = oldTab[j]) != null) {
oldTab[j] = null;
if (e.next == null)
newTab[e.hash & (newCap - 1)] = e;
else if (e instanceof TreeNode)
((TreeNode)e).split(this, newTab, j, oldCap);
else { // preserve order
Node loHead = null, loTail = null;
Node hiHead = null, hiTail = null;
Node next;
do {
next = e.next;
if ((e.hash & oldCap) == 0) {
if (loTail == null)
loHead = e;
else
loTail.next = e;
loTail = e;
}
else {
if (hiTail == null)
hiHead = e;
else
hiTail.next = e;
hiTail = e;
}
} while ((e = next) != null);
if (loTail != null) {
loTail.next = null;
newTab[j] = loHead;
}
if (hiTail != null) {
hiTail.next = null;
newTab[j + oldCap] = hiHead;
}
}
}
}
}
return newTab;
}
我们在代码中找到这几行分析:
newCap = DEFAULT_INITIAL_CAPACITY;
Node[] newTab = (Node[])new Node[newCap];
table = newTab
return newTab;
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
可以看出resize的作用就是把table 和局部变量 tab赋予相同的地址(这两个属性为一个节点(Node)的集合),并且第一次确定数组的长度:n=16;
第二个if()语句:
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
括号中判断这次输入的数据是否是已经存在过:我们知道,通过hash的值根据hashCode()返回值不同而不同,这也就是说,每添加一个新的地址key,就会执行if()语句后面的方法,再到最后执行:
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
这样就在成功添加了一个数据:并且在put方法中输出true
此时不成立的条件下,会自动将相同上一次输出的集合元素赋值给p这个变量,所以此处的p实则找到与本次hash相同的变量
下面探究当数据的hash相同时,else执行的操作:
else {
Node e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
}
下面分为三种情况讨论:
一、当直接添加字符串:
public class Test {
public static void main(String[] args) {
HashSet set =new HashSet<>();
set.add("Tom");
set.add("Tom");
}
}
此时由于直接添加字符串,添加的key地址相同,hash也相同,即else后面if(表达式为真),此时执行将p赋值给e,然后执行下一步:、
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
此时的两个if()均为真;所以用新的key替代旧的key,且返回非null ,put()返回false;
二、当Stringl类采用对象赋值时;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet set =new HashSet<>();
set.add("Tom");
String name =new String("Tom");
System.out.println(set.add(name));
}
}
上面提到过,String类已经修改过hashCode()方法了,所以此时的hash还是 相同的,此时我们直接进行这一段代码的比较:
else {
Node e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
}
前后的Hash虽然相同,但是——地址不相同:在进行两者equals的对比;由于String中的equals也经过重写,所以此时也是:true,之后又是最后的覆盖内容:
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
此时为false;
三、输出的是非String类新建对象时
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet set =new HashSet<>();
set.add(new Test());
set.add(new Test());
}
}
此时由于地址不同,会存在直接录入;
三、在创建项目时:
此时可以将hashCode( ) 与equals ( )进行重写方法,使项目变得简单,这也是我们学习底层代码的原因:
public class Student {
public String id;
public String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student student =(Student)obj;
return this.id.equals(student.id);
}
return false;
}
}
如图所示:执行顺序,有可能存在泛型过大而导致不同对象ID重复并且录入的现象:
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet set =new HashSet<>();
Student student=new Student("100", null);
Dog dog=new Dog();
dog.id="100";
set.add(dog);
set.add(student);
}
}
此时执行代码:
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
此时由于Student类中的改写,会出现以下情况:在判断第if时输出的是false,之后执行到下面的for循环中,将集合中的每个元素进行遍历,当出现先集合中出现空位时,将这个新值添加进去;
本节的内容到此结束:谢谢
你可能感兴趣的:(java)
一分钟快速搭建 Spring Boot 项目
沉默王二
Java进阶之路 Java程序员进阶之路 java spring boot spring
大家好,我是二哥呀!学Java,自然少不了SpringBoot的学习!作为一名Java技术博主,已经被催了N多次SpringBoot的教程了,再不更新真有点鸽的不成样子——鸽上加鸽。因此我打算在接下来一段时间里间歇性地输出一些SpringBoot方面的文章,包括一些非常入门级的教程和一些非常优质的SpringBoot项目推荐,已经身经百战的starter们忽略就好。《Java程序员进阶之路》在Gi
Kubernetes 网络模型架构详解:组件通信、网络入口与出口
码农阿豪@新空间
包罗万象 kubernetes 网络 架构
个人名片作者简介:java领域优质创作者个人主页:码农阿豪工作室:新空间代码工作室(提供各种软件服务)个人邮箱:[2435024119@qq.com]个人微信:15279484656个人导航网站:www.forff.top座右铭:总有人要赢。为什么不能是我呢?专栏导航:码农阿豪系列专栏导航面试专栏:收集了java相关高频面试题,面试实战总结️Spring5系列专栏:整理了Spring5重要知识点与
redis分布式锁setnx
xiaogg3678
redis 分布式 数据库
packagecom.realize;importredis.clients.jedis.Jedis;importjava.util.UUID;importredis.clients.jedis.params.SetParams;publicclassDistributedLock{privateJedisjedis;privateStringlockKey;privateStringlockVa
Dockerfile 安装echarts插件给java提供服务
xiaogg3678
echarts java 前端
java调用echarts插件,生成图片保存到磁盘然后插入到pptx中报表。Dockerfile文件内容:#基础镜像,如果本地仓库没有,会从远程仓库拉取openjdk:8FROMdocker.io/centos:centos7#暴露端口EXPOSE9311#避免centos日志输出中文乱码ENVLANGen_US.utf8#容器中创建工作目录WORKDIR /usr/local/plugin#容器
vue3之拆若依--记实现后台管理首页(左侧菜单栏、头部信息区域...)
小白小白从不日白
Vue3 vue.js 前端 javascript
效果图前期准备启动若依在本地启动若依后台,跑在自己本地:这里对于如何下载若依相关的前后端代码请参考若依官网:RuoYi若依官方网站|后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源
一致性哈希HashRing
留白1108
哈希算法 算法 一致性哈希
一致性哈希HashRing一致性哈希算法是一种高效的分布式存储和负载均衡技术,广泛应用于分布式系统中,如缓存集群、分布式数据库等。它通过将数据和节点映射到一个环形的哈希空间,实现了数据的均匀分布和节点的动态扩展。本文将详细介绍一致性哈希算法的原理,并通过一个完整的Java实现来展示其应用。一、一致性哈希算法原理一致性哈希算法的核心思想是将数据和节点映射到一个环形的哈希空间中。具体步骤如下:1.哈希
基于一致性哈希的分布式Top-K
留白1108
哈希算法 分布式 算法 TopK
基于一致性哈希的分布式Top-K在分布式系统中,数据的高效存储和快速查询是一个常见的挑战。一致性哈希(ConsistentHashing)是一种常用于分布式存储和负载均衡的技术,而Top-K查询则是数据分析中的经典问题。本文将通过一个Java实现的案例,展示如何结合一致性哈希和多线程技术,高效地完成分布式环境下的Top-K计算。实现思路一致性哈希分片:将数据通过一致性哈希算法分配到不同节点。局部T
ElasticSearch学习笔记 --- 调研笔记知识点
杨鑫newlfe
大数据挖掘与大数据应用案例 搜索引擎
笔记总结知识点:1.安装ElasticSearch。2.ELasticSearch是使用Java开发并使用Lucene作为核心来实现所有索引和搜索的功能3.使用是通过简单的restfulAPI来使用。4.安装Marvel(ES的管理和监控)5.特点:分布式的实时文件存储,每个字段都被索引并可被搜索分布式的实时分析搜引擎可以扩展到上百台服务器,处理PB级机构化或非结构化数据6.集群是一组具有相同cl
sql注入基础原理(SQL injection)
????27282
优秀文章 秀秀 sql 数据库 服务器 python java
sql注入基础原理文章目录sql注入基础原理Sql注入简介案例表产生sql注入的写法python相关java相关php相关sql注入相关技术B:基于布尔的盲注特征案例总结E:基于错误案例总结U:基于联合查询案例总结S:堆叠查询案例T:基于时间的盲注案例总结稀奇古怪的字典mysql基础->https://blog.csdn.net/qq_52549196/article/details/122530
《Head First 设计模式》例子的C++实现(2 观察者模式)
liyuanbhu
数据结构与算法 编程杂项 设计模式
最近在学习设计模式,用的是《HeadFirst设计模式》这本书。感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式。唯一有点不方便的地方是这本书的例子全都是用的Java来实现的。而我主要是用C++。所以就动手将书上的代码用C++来实现了一遍。观察者模式首先是三个接口的代码://observer.h#ifndefOBSERVER_H#defineOBSERVER_HclassObserv
如何理解idea中的facet?
王摇摆
IDEA Spring intellij-idea java ide
在IntelliJIDEA中,Facet(模块特性)是一种用于为项目模块添加特定功能和配置的概念。它允许您向项目模块添加额外的特性,以支持不同类型的开发,例如Java、Web、Android等。Facet可以理解为一种插件或扩展,它为特定类型的模块提供了额外的功能和配置选项。通过Facet,您可以为模块启用特定的框架、技术或库,并为其提供相关的设置和工具支持。一些常见的Facet类型包括:Java
Java网络编程
serendipity_hky
JavaSE java 网络 开发语言
网络编程文章目录网络编程1.网络编程概述1.1软件架构1.2网络基础2.网络通信要素2.1如何实现网络中主机互相通信2.2通信要素1:IP地址2.3通信要素2:端口号2.4通信要素3:网络通信协议2.5InetAddress的使用3.传输层协议:TCP和UDP3.1TCP协议与UDP协议4.URL编程1.网络编程概述Java提供网络类库,可以实现网络连接。Java实现的跨平台的网络库,程序员面对的
JavaScript数据类型转换
難釋懷
javascript 开发语言
在JavaScript编程中,由于其动态类型特性,经常需要在不同的数据类型之间进行转换。正确地执行类型转换不仅能够避免潜在的错误,还能提高代码的灵活性和可维护性。本文将探讨JavaScript中的常见数据类型转换方法,并提供一些实用的例子来帮助你更好地理解和应用这些技术。一、隐式类型转换JavaScript在某些情况下会自动进行类型转换,这种转换被称为隐式类型转换或强制类型转换。虽然方便,但有时也
IDEA学习篇——Intellij IDEA 导入 eclipse web 项目详细操作
2401_86640450
intellij-idea 学习 eclipse
第六步:点击当前页面的Libraries→上面绿色加号→Java(根据你的需要,我这个项目是以架包的形式)。第七步:选择你项目中所用的架包的目录点击OK第八步:操作完成上一步之后点击Facet→Web,点击右边的加号把文件选中此项目中web.xml点击OK,第二个红框也把remove掉,改成WebRoot点击OK。之后点击apply,最后点击CreateArtifact。第九步:点击Artifac
idea中的WebFacet到底是啥?
cccccchd
intellij-idea java ide
文章目录问题:实践:Facet概念WebFacet问题:刷面经,博客输出,加深理解,20253.5,希望毕业前可以找到工作。实践:Facet概念IDEA中一个项目可以支持多个模块开发,比如Java,Spring,Web开发等等。为了支持这些模块开发,IDEA引入Facet概念。Facet:一种只模块化的配置方式,表示支持该模块的配置JavaFacet:支持JAVA开发SpringFacet:支持S
前 30+ 个 Spring Boot 面试问题及答案
李憨憨--
spring boot 面试 后端
前30+个SpringBoot面试问题及答案这篇文章将向你展示一组精心策划的经常被问到的SpringBoot面试问题,以帮助你在面试中取得好成绩。欢迎来到我们详尽的SpringBoot面试问题指南!SpringBoot在Java生态系统中越来越受欢迎,因为它易于使用,并且提高了开发Java应用程序的生产力。这篇文章将向你展示一组精心策划的经常被问到的SpringBoot面试问题,以帮助你在面试中取
Java基础回顾 Day4
小斌的Debug日记
Java基础回顾 java 开发语言
多线程相关runnable接口实现,解决单继承的问题,因为继承Thread类就不能继承其他类了Callable接口的特点是满足线程需要返回值和抛出异常的情况在创建线程后的任何时候都可以重新设置,线程已经创建,可以使用Thread.setPriority()方法在任何时候改变线程的优先级。线程的优先级在Java中的有效范围是1到10,其中5是默认的优先级。notify是唤醒所在对象waitpool中
Spring Boot面试问答
愤怒的代码
Java面试问答 spring boot 面试 后端
1.SpringBoot基础知识问题1:什么是SpringBoot?它与Spring框架有何不同?回答:SpringBoot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,SpringBoot提供了以下优势:自动配置:根据项目依赖自动配置Spring应用,减少繁琐的XML或Java配置。起步依赖(Starters):通过一组预定义的
Jenkins + Docker 一键自动化部署 Java Spring Boot 应用最精简流程
财高八斗者
Java Java程序员 jenkins docker java
本文章实现最简单全面的Jenkins+Docker+SpringBoot一键自动部署项目。步骤齐全,少走坑路。环境:CentOS7+Git(Gitee)实现步骤:在Docker安装Jenkins,配置Jenkins基本信息,利用Dockerfile和Shell脚本实现项目自动拉取打包并运行。一、安装Docker安装社区版本DockerCE1.确保yum包更新到最新yumupdate2.卸载旧版本(
Java 中数据脱敏的实现
Code额
Java java 数据脱敏
数据脱敏首先,要思考一个问题,SpringBoot查询到的一条数据是一个Java对象,为什么返回给前端时候,前端拿到的却是JSON格式的数据呢?是因为SpringBoot默认采用了Jackson作为序列化器,而Jackson序列化框架会自动把Java对象转换成JSON格式的数据,然后返回。通过这个思路,就可以得到一个方案,就是在JSON序列化这个层面,去解决这个问题,从而对数据进行脱敏。1.自定义
ruby 学习笔记method
luckybright
脚本语言 ruby class java object 脚本
RubyMethodsClassmethod(类方法,相当于java里的静态方法)ruby的classMethod是属于类本身的方法。定义classmethod的方法与普通的实例方法不同的地方就是要在类方法的名称前加上类的名字,并用点号隔开类名和方法名。调用类方法时也需要在方法名前加类名,并用点号隔开。例:classMyClassdefMyClass.classMethodPrint"hellof
jenkins+maven+docker java项目编译、打包、构建镜像、上传私有仓库、web容器部署
大敌
docker 自动化运维 jenkins docker 运维
本环境非常简单,主要实现如下流程功能员工通过eclipse提交java代码———gitlab更新代码————jenkins通过maven编译打包————生成war包————制作docker镜像并上传到私有仓库————web服务器下载镜像————运行容器对外服务部分说明:jenkins服务器上已经安装了maven,并已配置。jenkins服务器上安装docker服务。(打包镜像,并上传至私有仓库)提
千亿级高并发短链系统架构设计与Java实战:从原理到代码的完整方案
小诸葛IT课堂
系统架构
一、短链系统的核心挑战场景需求:每天生成1亿+短链单日访问量峰值100亿+平均响应时间maxWorkerId||workerId<0){thrownewIllegalArgumentExcepti
js判断字符在不在数组里面的5种方式
~二向箔~
js基础踩坑手册 javascript 前端 性能优化
在JavaScript中,想要判断一个字符是否存在于数组中。1.使用Array.prototype.includesincludes方法返回一个布尔值,表示数组是否包含指定的元素。constarray=['a','b','c','d'];constchar='b';if(array.includes(char)){console.log(`${char}存在于数组中`);}else{console
ecmascript6_ECMAScript 2015(ES6)概述
cumian8165
字符串 javascript java python js ViewUI
ecmascript6ES6isthenewerstandardization/versionofJavascript,whichwasreleasedin2015.ItisimportanttolearnES6,becauseithasmanynewfeaturesthathelpdeveloperswriteandunderstandJavaScriptmoreeasily.ModernFra
ECMAScript 扩展运算符与剩余参数:现代 JavaScript 的利器
布兰妮甜
JavaScript - 行为 javascript ecmascript 扩展运算符 剩余参数 前端
Hi,我是布兰妮甜!在现代JavaScript开发中,ECMAScript6(ES6)引入了许多强大的语法特性,其中扩展运算符(SpreadOperator)和剩余参数(RestParameters)是两个非常实用的功能。它们不仅简化了代码的编写,还提高了代码的可读性和灵活性。本文将深入探讨这两个特性的用法及其在实际开发中的应用。文章目录一、扩展运算符(SpreadOperator)二、剩余参数(
深入了解单元测试框架:JUnit 5、Mockito和 AssertJ
li.wz
SpringBoot JavaSE 软件质量 java spring spring boot junit
好的,我会将这篇文章扩充一倍,并详细描述mockStatic等内容。深入了解单元测试框架:JUnit5、Mockito和AssertJ在现代软件开发中,单元测试是确保代码质量和稳定性的重要手段。本文将详细介绍如何使用JUnit5进行单元测试,并结合Mockito进行Mock操作,以及使用AssertJ进行断言。1.JUnit5简介JUnit5是Java平台上最流行的单元测试框架之一。它由三个子项目
Android中的AsyncTask。
Java资深爱好者
android
AsyncTask是Android框架中的一个工具类,用于在后台线程中执行耗时操作,并在操作完成后更新UI界面。它简化了多线程编程中的很多复杂性,尤其是在需要与UI线程交互的场景中。然而,需要注意的是,从Android11(API级别30)开始,AsyncTask已被标记为过时(deprecated),Google推荐使用Kotlin的协程(Coroutines)或者Java的并发工具类(如Exe
确保代码质量和系统的可持续发展能力
徐福记c
运维 运维
为确保代码质量和系统的可持续发展能力,从规范代码、审查质量、保障可维护性及配置自动化流程四方面着手,为系统的长远发展打下坚实基础。一、确保代码质量及可维护性的方案规范代码编写:要求开发人员遵循行业认可的编码规范,如阿里巴巴Java开发手册等,使代码结构清晰、变量命名准确、注释详细,便于后续维护人员快速理解。审查代码质量:利用GitLabCICD集成SonarQube工具扫描代码,设置质量门禁,对严
HTML5响应式网页模板:构建跨平台网站的完整解决方案
朱昆 iamkun
本文还有配套的精品资源,点击获取简介:本资源包含一套完整的HTML5源码,用于创建适用于手机和电脑的跨平台网站,特别适合需要提供一致用户体验的开发者。资源特点包括:HTML5的新特性、响应式设计、前端页面基础框架、多种页面布局的网站模板。HTML5简化了开发过程并增强了网页交互性,响应式设计使得网站能在不同设备上自适应,而前端技术如CSS和JavaScript则负责页面的样式和动态功能。此外,还涵
java工厂模式
3213213333332132
java 抽象工厂
工厂模式有
1、工厂方法
2、抽象工厂方法。
下面我的实现是抽象工厂方法,
给所有具体的产品类定一个通用的接口。
package 工厂模式;
/**
* 航天飞行接口
*
* @Description
* @author FuJianyong
* 2015-7-14下午02:42:05
*/
public interface SpaceF
nginx频率限制+python测试
ronin47
nginx 频率 python
部分内容参考:http://www.abc3210.com/2013/web_04/82.shtml
首先说一下遇到这个问题是因为网站被攻击,阿里云报警,想到要限制一下访问频率,而不是限制ip(限制ip的方案稍后给出)。nginx连接资源被吃空返回状态码是502,添加本方案限制后返回599,与正常状态码区别开。步骤如下:
java线程和线程池的使用
dyy_gusi
ThreadPool thread Runnable timer
java线程和线程池
一、创建多线程的方式
java多线程很常见,如何使用多线程,如何创建线程,java中有两种方式,第一种是让自己的类实现Runnable接口,第二种是让自己的类继承Thread类。其实Thread类自己也是实现了Runnable接口。具体使用实例如下:
1、通过实现Runnable接口方式 1 2
Linux
171815164
linux
ubuntu kernel
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.2-unstable/
安卓sdk代理
mirrors.neusoft.edu.cn 80
输入法和jdk
sudo apt-get install fcitx
su
Tomcat JDBC Connection Pool
g21121
Connection
Tomcat7 抛弃了以往的DBCP 采用了新的Tomcat Jdbc Pool 作为数据库连接组件,事实上DBCP已经被Hibernate 所抛弃,因为他存在很多问题,诸如:更新缓慢,bug较多,编译问题,代码复杂等等。
Tomcat Jdbc P
敲代码的一点想法
永夜-极光
java 随笔 感想
入门学习java编程已经半年了,一路敲代码下来,现在也才1w+行代码量,也就菜鸟水准吧,但是在整个学习过程中,我一直在想,为什么很多培训老师,网上的文章都是要我们背一些代码?比如学习Arraylist的时候,教师就让我们先参考源代码写一遍,然
jvm指令集
程序员是怎么炼成的
jvm 指令集
转自:http://blog.csdn.net/hudashi/article/details/7062675#comments
将值推送至栈顶时 const ldc push load指令
const系列
该系列命令主要负责把简单的数值类型送到栈顶。(从常量池或者局部变量push到栈顶时均使用)
0x02 &nbs
Oracle字符集的查看查询和Oracle字符集的设置修改
aijuans
oracle
本文主要讨论以下几个部分:如何查看查询oracle字符集、 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题。
一、什么是Oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货
png在Ie6下透明度处理方法
antonyup_2006
css 浏览器 Firebug IE
由于之前到深圳现场支撑上线,当时为了解决个控件下载,我机器上的IE8老报个错,不得以把ie8卸载掉,换个Ie6,问题解决了,今天出差回来,用ie6登入另一个正在开发的系统,遇到了Png图片的问题,当然升级到ie8(ie8自带的开发人员工具调试前端页面JS之类的还是比较方便的,和FireBug一样,呵呵),这个问题就解决了,但稍微做了下这个问题的处理。
我们知道PNG是图像文件存储格式,查询资
表查询常用命令高级查询方法(二)
百合不是茶
oracle 分页查询 分组查询 联合查询
----------------------------------------------------分组查询 group by having --平均工资和最高工资 select avg(sal)平均工资,max(sal) from emp ; --每个部门的平均工资和最高工资
uploadify3.1版本参数使用详解
bijian1013
JavaScript uploadify3.1
使用:
绑定的界面元素<input id='gallery'type='file'/>$("#gallery").uploadify({设置参数,参数如下});
设置的属性:
id: jQuery(this).attr('id'),//绑定的input的ID
langFile: 'http://ww
精通Oracle10编程SQL(17)使用ORACLE系统包
bijian1013
oracle 数据库 plsql
/*
*使用ORACLE系统包
*/
--1.DBMS_OUTPUT
--ENABLE:用于激活过程PUT,PUT_LINE,NEW_LINE,GET_LINE和GET_LINES的调用
--语法:DBMS_OUTPUT.enable(buffer_size in integer default 20000);
--DISABLE:用于禁止对过程PUT,PUT_LINE,NEW
【JVM一】JVM垃圾回收日志
bit1129
垃圾回收
将JVM垃圾回收的日志记录下来,对于分析垃圾回收的运行状态,进而调整内存分配(年轻代,老年代,永久代的内存分配)等是很有意义的。JVM与垃圾回收日志相关的参数包括:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc
-XX:+PrintGC
通
Toast使用
白糖_
toast
Android中的Toast是一种简易的消息提示框,toast提示框不能被用户点击,toast会根据用户设置的显示时间后自动消失。
创建Toast
两个方法创建Toast
makeText(Context context, int resId, int duration)
参数:context是toast显示在
angular.identity
boyitech
AngularJS AngularJS API
angular.identiy 描述: 返回它第一参数的函数. 此函数多用于函数是编程. 使用方法: angular.identity(value); 参数详解: Param Type Details value
*
to be returned. 返回值: 传入的value 实例代码:
<!DOCTYPE HTML>
java-两整数相除,求循环节
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class CircleDigitsInDivision {
/**
* 题目:求循环节,若整除则返回NULL,否则返回char*指向循环节。先写思路。函数原型:char*get_circle_digits(unsigned k,unsigned j)
Java 日期 周 年
Chen.H
java C++ c C#
/**
* java日期操作(月末、周末等的日期操作)
*
* @author
*
*/
public class DateUtil {
/** */
/**
* 取得某天相加(减)後的那一天
*
* @param date
* @param num
*
[高考与专业]欢迎广大高中毕业生加入自动控制与计算机应用专业
comsci
计算机
不知道现在的高校还设置这个宽口径专业没有,自动控制与计算机应用专业,我就是这个专业毕业的,这个专业的课程非常多,既要学习自动控制方面的课程,也要学习计算机专业的课程,对数学也要求比较高.....如果有这个专业,欢迎大家报考...毕业出来之后,就业的途径非常广.....
以后
分层查询(Hierarchical Queries)
daizj
oracle 递归查询 层次查询
Hierarchical Queries
If a table contains hierarchical data, then you can select rows in a hierarchical order using the hierarchical query clause:
hierarchical_query_clause::=
start with condi
数据迁移
daysinsun
数据迁移
最近公司在重构一个医疗系统,原来的系统是两个.Net系统,现需要重构到java中。数据库分别为SQL Server和Mysql,现需要将数据库统一为Hana数据库,发现了几个问题,但最后通过努力都解决了。
1、原本通过Hana的数据迁移工具把数据是可以迁移过去的,在MySQl里面的字段为TEXT类型的到Hana里面就存储不了了,最后不得不更改为clob。
2、在数据插入的时候有些字段特别长
C语言学习二进制的表示示例
dcj3sjt126com
c basic
进制的表示示例
# include <stdio.h>
int main(void)
{
int i = 0x32C;
printf("i = %d\n", i);
/*
printf的用法
%d表示以十进制输出
%x或%X表示以十六进制的输出
%o表示以八进制输出
*/
return 0;
}
NsTimer 和 UITableViewCell 之间的控制
dcj3sjt126com
ios
情况是这样的:
一个UITableView, 每个Cell的内容是我自定义的 viewA viewA上面有很多的动画, 我需要添加NSTimer来做动画, 由于TableView的复用机制, 我添加的动画会不断开启, 没有停止, 动画会执行越来越多.
解决办法:
在配置cell的时候开始动画, 然后在cell结束显示的时候停止动画
查找cell结束显示的代理
MySql中case when then 的使用
fanxiaolong
casewhenthenend
select "主键", "项目编号", "项目名称","项目创建时间", "项目状态","部门名称","创建人"
union
(select
pp.id as "主键",
pp.project_number as &
Ehcache(01)——简介、基本操作
234390216
cache ehcache 简介 CacheManager crud
Ehcache简介
目录
1 CacheManager
1.1 构造方法构建
1.2 静态方法构建
2 Cache
2.1&
最容易懂的javascript闭包学习入门
jackyrong
JavaScript
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊
提升网站转化率的四步优化方案
php教程分享
数据结构 PHP 数据挖掘 Google 活动
网站开发完成后,我们在进行网站优化最关键的问题就是如何提高整体的转化率,这也是营销策略里最最重要的方面之一,并且也是网站综合运营实例的结果。文中分享了四大优化策略:调查、研究、优化、评估,这四大策略可以很好地帮助用户设计出高效的优化方案。
PHP开发的网站优化一个网站最关键和棘手的是,如何提高整体的转化率,这是任何营销策略里最重要的方面之一,而提升网站转化率是网站综合运营实力的结果。今天,我就分
web开发里什么是HTML5的WebSocket?
naruto1990
Web html5 浏览器 socket
当前火起来的HTML5语言里面,很多学者们都还没有完全了解这语言的效果情况,我最喜欢的Web开发技术就是正迅速变得流行的 WebSocket API。WebSocket 提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看6个HTML5教程介绍里 的 WebSocket API:它可用于客户端、服
Socket初步编程——简单实现群聊
Everyday都不同
socket 网络编程 初步认识
初次接触到socket网络编程,也参考了网络上众前辈的文章。尝试自己也写了一下,记录下过程吧:
服务端:(接收客户端消息并把它们打印出来)
public class SocketServer {
private List<Socket> socketList = new ArrayList<Socket>();
public s
面试:Hashtable与HashMap的区别(结合线程)
toknowme
昨天去了某钱公司面试,面试过程中被问道
Hashtable与HashMap的区别?当时就是回答了一点,Hashtable是线程安全的,HashMap是线程不安全的,说白了,就是Hashtable是的同步的,HashMap不是同步的,需要额外的处理一下。
今天就动手写了一个例子,直接看代码吧
package com.learn.lesson001;
import java
MVC设计模式的总结
xp9802
设计模式 mvc 框架 IOC
随着Web应用的商业逻辑包含逐渐复杂的公式分析计算、决策支持等,使客户机越
来越不堪重负,因此将系统的商业分离出来。单独形成一部分,这样三层结构产生了。
其中‘层’是逻辑上的划分。
三层体系结构是将整个系统划分为如图2.1所示的结构[3]
(1)表现层(Presentation layer):包含表示代码、用户交互GUI、数据验证。
该层用于向客户端用户提供GUI交互,它允许用户