(1)首先通过optparse模块,通过选项向脚本传递所需的参数: 添加-f 选项,让脚本扫描指定文件内的IP地址。 添加-i 选项,让脚本扫描指定的IP地址所在的整个网段。 该部分代码如下: ?...第六、七行,通过options.filename和options.address的方式调用参数值。 (2)判断用户是否传参 判断filename和address参数是否同时为空: ?...如果同时为空则打印报错信息,报错后通过sys.exit()函数直接退出程序。 (3)通过 -f 文件名传参 代码如下: ? 首先通过if判断filename变量是否为空。...如果不为空则通过os.path.exists()判断文件是否真实存在 文件不存在则报错,并通过sys.exit()直接退出程序。 若文件存在,则通过open函数,以只读方法打开该文件。...首先通过if判断address变量是否为空。 如果不为空则先读取IP地址的前缀。 通过for-in语句,在前缀后面拼接上数字1-254,组成IP地址。
向字典中添加元素(set) set方法接收两个参数:key & value 判断参数的有效性,key & value不为null | undefined时向字典中添加元素,否则直接返回false 参数有效时...清空字典(clear),直接将字典对象初始化为空对象即可 将字典中的数据转为字符串 (toString) toString方法不接收任何参数 如果字典为空,则直接返回空字符串。...向哈希表中添加元素(put) 跟字典的实现一样,同样也是接收两个参数,判断其是否有效 以key为参数,调用hashCode函数(我们自己来实现)计算其hash值 将得到的哈希值作为key存进哈希表中,其值与字典的保持一致...对象 添加成功,返回true 重写get方法 (需要从链表中获取元素) 计算key的hash值,用一个变量(position)存起来 获取position位置存储的链表结构元素 如果链表不为空,从链表头部开始遍历...如果其不为null并且其key与目标key不相等,index就自增 遍历技术后,如果index位置的元素不为null且index位置元素的key等于目标参数的key,则删除table中index位置的元素
第三步,如果参数集合为空,则设置元素数组为空,即将EMPTY_ELEMENTDATA赋给elementData; 第四步,如果参数集合不为空,接下来判断是否成功将参数集合转化为Object类型的数组,如果转化成...第三,如果需要对现有的元素数组进行扩容,则调用grow(minCapacity)方法,参数minCapacity表示集合为了确保添加元素成功的最小容量。...indexOf(Object o)方法的作用是从头开始查找与指定元素相等的元素,如果找到,则返回找到的元素在元素数组中的下标,如果没有找到返回-1。...这也解释了为什么要把情况分为需要查找的对象是否为空两种情况讨论,不然的话空对象调用equals方法则会产生空指针异常。...如果所引致合法,则调用elementData(int index)方法获取值。在elementData(int index)方法中返回元素数组中指定下标的元素,并且对其进行了向下转型。
(1)首先通过optparse模块,通过选项向脚本传递所需的参数: 添加-f 选项,让脚本扫描指定文件内的IP地址。 添加-i 选项,让脚本扫描指定的IP地址所在的整个网段。 相关代码如下: ?...第六、七行,通过options.filename和options.address的方式调用参数值。 (2)判断用户是否传参 判断filename和address参数是否同时为空: ?...如果同时为空则打印报错信息,报错后通过sys.exit()函数直接退出程序。 (3)通过 -f 文件名传参 代码如下: ? 首先通过if判断filename变量是否为空。...如果不为空则通过os.path.exists()判断文件是否真实存在 文件不存在则报错,并通过sys.exit()直接退出程序。 若文件存在,则通过open函数,以只读方法打开该文件。...首先通过if判断address变量是否为空。 如果不为空则先读取IP地址的前缀。 通过for-in语句,在前缀后面拼接上数字1-254,组成IP地址。
实现思路 链表是由指针将元素连接到一起,根据链表的特性,我们可以知道要实现一个链表必须必备以下方法: 链表尾部添加元素 声明一个结点变量,以添加的元素为参数,生成一个结点,将生成的结点赋值给接待你变量。...接下来我们来捋一下,上述需要重写函数的实现思路: 尾部插入元素(push) 创建双向链表辅助结点(node) 判断链表的头部是否为空,如果为空将链表头部和尾部都指向node 链表头部不为空时,将链表尾部结点中的...1则将当前链表末尾元素指向undefined 链表长度不为1,将链表头部中的prev指向undefined 参数有效性判断,要删除的位置参数必须大于等于0且小于等于当前链表的长度 声明链表元素辅助变量(...// 调用push方法 this.push(element); }else{ // 不为空...,仍没找到合适的位置则直接返回链表的末尾位置 重写插入元素函数(insert) 如果链表为空则直接调用往链表的0号位置插入元素 链表不为空,则调用getIndexNextSortedElement函数计算出正确的插入位置
msg */ public void enqueueMessage( Message msg ){ // 因为 该消息队列 可能会有多个线程 通过 Handler 向消息队列中添加消息...= null ){ mMessage = msg; }else{ /* 如果链表不为空...消息队列 MessageQueue 中取出消息 , 也是 取出链表表头 的操作 , 取出该链表的表头 , 然后 将表头设置成链表的第二个元素 ; 消息同步 : 如果当前链表为空 , 此时会 调用 wait...msg */ public void enqueueMessage( Message msg ){ // 因为 该消息队列 可能会有多个线程 通过 Handler 向消息队列中添加消息...= null ){ mMessage = msg; }else{ /* 如果链表不为空
第一步判断root是否是null,如果为空我们直接返回空数组即可,如果不为空继续我们的代码运行 第二步声明了两个变量result用来承接最后的数组,并作为最后的结果返回。...deep用来表示当前节点的层级,方便我们向result对应数组中添加元素。 然后就到了我们的递归方法recursion,recursion的参数是当前节点。...判断result对应该层的数组元素是否存在,如果不存在直接等于[root],如果存在则选择push方式添加当前root。...添加完当前节点就需要判断,当前节点的左节点是否存在,如果存在将当前节点的左节点作为参数递归调用当前recursion函数,如果不存在则跳过 当前节点的右节点是否存在,如果存在将当前节点的右节点作为参数递归调用当前...recursion函数,如果不存在则跳过 当左节点右节点都不存在则深度减一并向上返回,或者节点的左节点右节点都已经遍历完毕也是同样深度减一并向上返回。
备注 如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。...如果未提供 initialValue,则reduce 方法会对从第二个元素开始的每个元素调用 callbackfn 函数。...回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。最后一次调用回调函数获得的返回值为 reduce 方法的返回值。 不为数组中缺少的元素调用该回调函数。...如果向 reduce 方法提供 initialValue,则在首次调用函数时,previousValue 为initialValue。 currentValue 当前数组元素的值。...如果向 reduce 方法提供 initialValue: previousValue 参数为 initialValue。 currentValue 参数是数组中的第一个元素的值。
如果不为空 给属性设置这个get方法 如果返回类型不为空 设置相应的返回类型 Method gm = getAttMap.get(name); if(...如果不为空 给属性设置这个set方法 如果返回类型不为空 设置相应的返回类型 Method sm = setAttMap.get(name); if(...//主要sm和gm中有一个不为 则像mbean中添加当前属性 if( sm!...> params[] = methods[j].getParameterTypes(); //如果方法以get开始并且参数个数为0,其返回类型是支持的返回类型 则获取其添加到attMap...0,根据方法名从specialMethods中获取,如果不为空则直接返回 反之将其添加到invokeAttMap //默认去掉preDeregister postDeregister
当队列为空时,向队列中获取元素,则返回null,否则返回元素。 一直阻塞:当阻塞队列满时,如果生产者向队列中插入元素,则队列会一直阻塞当前线程,直到队列可用或响应中断退出。...当阻塞队列为空时,如果消费者线程向阻塞队列中获取数据,则队列会一直阻塞当前线程,直到队列空闲或响应中断退出。...超时退出:当队列满时,如果生产线程向队列中添加元素,则队列会阻塞生产线程一段时间,超过指定的时间则退出返回false。...poll方法获取元素,如果不为空则直接返回,否则抛出NoSuchElementException异常。...方法获取元素,元素不为空则返回,否则抛出NoSuchElementException异常。
这个队列比较特别的时,采用一种预占模式,意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为...()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕; STOP:如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务...)方法进入线程退出程序 3、任务不为空,则进入循环,并加锁 4、判断是否为线程添加中断标识,以下两个条件满足其一则添加中断标识: 线程池状态>=STOP,即STOP或TERMINATED 一开始判断线程池状态...参数说明:无参数 执行流程: 将timedOut(上次获取任务是否超时)置为false(首次执行方法,无上次,自然为false),进入一个无限循环 如果线程池为Shutdown状态且任务队列为空(线程池...移除工作线程,成功则返回null,不成功则进入下轮循环。 尝试用poll() 或者 take()(具体用哪个取决于timed的值)获取任务,如果任务不为空,则返回该任务。
删除元素:remove() 当队列不为空的时候,调用该方法,返回被移除的元素;当队列为空的时候在调用该方法,会抛出异常。...来看看源码: 源码中调用了poll方法,当获取到的对象不为空的时候,返回获取到的对象;如果为空的话,就抛出:throw new NoSuchElementException();异常。...判断当前队列的队首元素:element() 该方法是获取队首元素的。当队列不为空的时候,返回队列中当前队首元素;如果队列为空的时候,调用该方法会抛异常的。...我们接着来看看: 添加元素:offer(e) 需要主要:这里的offer方法只有一个参数,这个和我们后面讲解的一组的区别 当队列未满的时候,向队列中添加元素,返回true;当队列已经满了,继续向队列中添加元素的话...Offer(e)添加元素代码演示及运行结果: 删除元素:poll() 注意:参数为空哦! 当队列不为空的时候,返回被移除的元素,当队列为空的时候,返回null.而不是抛出异常。
,该方法在endpoint不为空的时候,会注册一个定时任务,每隔vipSrvRefInterMillis时间执行一次refreshSrvIfNeed方法,同时立马调用了refreshSrvIfNeed方法...AbstractSelector参数,它会往请求的参数里头添加selector参数,目前label类型会添加ExpressionSelector,之后调用reqAPI方法请求/service/list接口...reqAPI方法首先将serversFromEndpoint赋值给snapshot,但是serverList不为空的情况下会重置snapshot为serverList,然后进行reqAPI请求 reqAPI...方法,该方法在endpoint不为空的时候,会注册一个定时任务,每隔vipSrvRefInterMillis时间执行一次refreshSrvIfNeed方法 refreshSrvIfNeed方法在serverList...及lastSrvRefTime getServiceList方法优先以serverList作为server端地址列表,如果它为空再以serversFromEndpoint为准,然后通过reqAPI方法请求的时候
if (StringUtils.isNotEmpty(configValue)) { return configValue; }: 如果参数值不为空,则直接返回参数值。...if (StringUtils.isEmpty(captchaEnabled)) { return true; }: 如果参数值为空,则返回true,表示开启验证码。...-1L : config.getConfigId(): 获取参数配置ID,如果为空则设置为-1。...如果角色对象perm不为空,则将其角色权限的roleKey字段按逗号分隔后转换为列表,并将列表中的权限添加到permsSet集合中。...StringUtils.isNotNull(role.getRoleId()):调用StringUtils类的isNotNull方法判断角色的ID是否不为空。
= null) { return obtainFromSupplier(instanceSupplier, beanName); } // 如果工厂方法不为空...Supplier 回调,则调用 obtainFromSupplier() 进行初始化 如果存在工厂方法,则使用工厂方法进行初始化 首先判断缓存,如果缓存中存在,即已经解析过了,则直接使用已经解析了的,...Object[] argsToUse = null; // 工厂方法的参数 // 如果指定了构造参数则直接使用 // 在调用 getBean 方法的时候指定了方法参数...确定工厂对象 首先获取工厂方法名,若工厂方法名不为空,则调用 beanFactory.getBean() 获取工厂对象,若为空,则可能为一个静态工厂,对于静态工厂则必须提供工厂类的全类名,同时设置 factoryBean...explicitArgs 参数 explicitArgs 参数是我们调用 getBean() 时传递景来,一般该参数,该参数就是用于初始化 bean 时所传递的参数,如果该参数不为空,则可以确定构造函数的参数就是它了
第二个参数为false,将线程池的有限线程数量的上限设置为maximumPoolSize,添加线程时根据maximumPoolSize来判断; * 如果判断workerCount大于0,则直接返回...* 这时,再次调用addWorker方法,但第二个参数传入为false,将线程池的有限线程数量的上限设置为maximumPoolSize; * 如果失败则拒绝该任务 */ else if...阻塞队列不为空 * * 首先考虑rs == SHUTDOWN的情况 * 这种情况下不会接受新提交的任务,所以在firstTask不为空的时候会返回false;...* 然后,如果firstTask为空,并且workQueue也为空,则返回false, * 因为队列中已经没有任务了,不需要再添加线程了 */ // Check if queue...在调用构造方法时,需要把任务传入,这里通过getThreadFactory().newThread(this);来新建一个线程,newThread方法传入的参数是this,因为Worker本身继承了Runnable
sessionId不为空,将其注入request的requestedSessionId属性 if (sessionID !...中对重定向处理会获取URL中是否存在,如果存在则直接添加, 代码如下: MessageBytes redirectPathMB = request.getMappingData().redirectPath...,调用getSession的API之后,首先是利用门面模式获取到真正的Connector/Request,而后其方法如下: /**返回与当前请求相关的session*/ @Override public...session并且可利用则直接返回,如果不可利用则将session置为空 * 不可利用是在request的recycle中设置为不可利用 */ if ((session !...false; /** * 找到当前主机下所有的web应用获取其会话管理器 * 从对应会话管理器中找若找到相应sessionId不为空
领取专属 10元无门槛券
手把手带您无忧上云