• 关于

    访问元素的属性

    的搜索结果

回答

:checked input:checked 选择所有选中的表单元素:disabled input:disabled 选择所有禁用的表单元素:empty p:empty 选择所有没有子元素的p元素:enabled input:enabled 选择所有启用的表单元素:first-of-type p:first-of-type 选择每个父元素是p元素的第一个p子元素:in-range input:in-range 选择元素指定范围内的值:invalid input:invalid 选择所有无效的元素:last-child p:last-child 选择所有p元素的最后一个子元素:last-of-type p:last-of-type 选择每个p元素是其母元素的最后一个p元素:not(selector) :not(p) 选择所有p以外的元素:nth-child(n) p:nth-child(2) 选择所有 p 元素的父元素的第二个子元素:nth-last-child(n) p:nth-last-child(2) 选择所有p元素倒数的第二个子元素:nth-last-of-type(n) p:nth-last-of-type(2) 选择所有p元素倒数的第二个为p的子元素:nth-of-type(n) p:nth-of-type(2) 选择所有p元素第二个为p的子元素:only-of-type p:only-of-type 选择所有仅有一个子元素为p的元素:only-child p:only-child 选择所有仅有一个子元素的p元素:optional input:optional 选择没有"required"的元素属性:out-of-range input:out-of-range 选择指定范围以外的值的元素属性:read-only input:read-only 选择只读属性的元素属性:read-write input:read-write 选择没有只读属性的元素属性:required input:required 选择有"required"属性指定的元素属性:root root 选择文档的根元素:target #news:target 选择当前活动#news元素(点击URL包含锚的名字):valid input:valid 选择所有有效值的属性:link a:link 选择所有未访问链接:visited a:visited 选择所有访问过的链接:active a:active 选择正在活动链接:hover a:hover 把鼠标放在链接上的状态:focus input:focus 选择元素输入后具有焦点:first-letter p:first-letter 选择每个 元素的第一个字母:first-line p:first-line 选择每个 元素的第一行:first-child p:first-child 选择器匹配属于任意元素的第一个子元素的 元素:before p:before 在每个 元素之前插入内容:after p:after 在每个 元素之后插入内容:lang(language) p:lang(it) 为 元素的lang属性选择一个开始值

tama_test 2019-12-02 00:58:29 0 浏览量 回答数 0

回答

JavaScript为属性访问定义了两种语法:expression.identifier // 表达式指定对象,标识符指定需要访问的属性的名称expression[expression] // 这种方法适用于对象和数组,[]内的表达式指定要访问的属性的名称或者代表要访问数组元素的索引.identifier的写法只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字。当属性名是通过运算得出的值而不是固定的值的时候,必须使用方括号写法。(摘自《JavaScript权威指南》4.4节-属性访问表达式)

杨冬芳 2019-12-02 02:39:06 0 浏览量 回答数 0

回答

accesskey:设置快捷键,提供快速访问元素如aaa在windows下的firefox中按alt + shift +一个可激活元素 class:为元素设置类标识,多个类名用间隔分开,CSS和javascript可通过class属性获取元素 contenteditable:指定元素内容是否可编辑 contextmenu:自定义鼠标右键弹出菜单内容 data- *:为元素增加自定义属性 目录:设置元素文本方向 draggable:设置元素是否可拖拽 dropzone:设置元素长度类型:复制,移动,链接 隐藏:表示一个元素是否与文档。样式上会导致元素不显示,但是不能用这个属性实现样式效果 id:元素id,文档内唯一 lang:元素内容的的语言 spellcheck:是否启动拼写和语法检查 style:行内css样式 tabindex:设置元素获取焦点,通过tab可以导航 标题:元素相关的建议信息 翻译:元素和子孙的内容是否需要本地化

茶什i 2019-12-02 03:16:13 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

简述重排的概念 浏览器下载完页面中的所有组件(HTML、JavaScript、CSS、图片)之后会解析生成两个内部数据结构(DOM 树和渲染树),DOM 树表示页面结构,渲染树表示 DOM 节点如何显示。重排是 DOM 元素的几何属性变化,DOM 树的结构变化,渲染树需要重新计算。 简述重绘的概念 重绘是一个元素外观的改变所触发的浏览器行为,例如改变 visibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。由于浏览器的流布局,对渲染树的计算通常只需要遍历一次就可以完成。但 table 及其内部元素除外,它可能需要多次计算才能确定好其在渲染树中节点的属性值,比同等元素要多花两倍时间,这就是我们尽量避免使用 table 布局页面的原因之一。 简述重绘和重排的关系 重绘不会引起重排,但重排一定会引起重绘,一个元素的重排通常会带来一系列的反应,甚至触发整个文档的重排和重绘,性能代价是高昂的。 什么情况下会触发重排? - 页面渲染初始化时;(这个无法避免) - 浏览器窗口改变尺寸; - 元素尺寸改变时; - 元素位置改变时; - 元素内容改变时; - 添加或删除可见的 DOM 元素时。 重排优化有如下五种方法 - 将多次改变样式属性的操作合并成一次操作,减少 DOM 访问。 - 如果要批量添加 DOM,可以先让元素脱离文档流,操作完后再带入文档流,这样只会触发一次重排。(fragment 元素的应用) - 将需要多次重排的元素,position 属性设为 absolute 或 fixed,这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。 - 由于 display 属性为 none 的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发两次重排。 - 在内存中多次操作节点,完成后再添加到文档中去。例如要异步获取表格数据,渲染到页面。可以先取得数据后在内存中构建整个表格的 html 片段,再一次性添加到文档中去,而不是循环添加每一行。

茶什i 2019-12-02 03:19:56 0 浏览量 回答数 0

回答

vue 通过使用双向数据绑定,来实现了 View 和 Model 的同步更新。vue 的双向数据绑定主要是通过使用数据劫持和发布订阅者模式来实现的。 首先我们通过 Object.defineProperty() 方法来对 Model 数据各个属性添加访问器属性,以此来实现数据的劫持,因此当 Model 中的数据发生变化的时候,我们可以通过配置的 setter 和 getter 方法来实现对 View 层数据更新的通知。 数据在 html 模板中一共有两种绑定情况,一种是使用 v-model 来对 value 值进行绑定,一种是作为文本绑定,在对模板引擎进行解析的过程中。 如果遇到元素节点,并且属性值包含 v-model 的话,我们就从 Model 中去获取 v-model 所对应的属性的值,并赋值给元素的 value 值。然后给这个元素设置一个监听事件,当 View 中元素的数据发生变化的时候触发该事件,通知 Model 中的对应的属性的值进行更新。 如果遇到了绑定的文本节点,我们使用 Model 中对应的属性的值来替换这个文本。对于文本节点的更新,我们使用了发布订阅者模式,属性作为一个主题,我们为这个节点设置一个订阅者对象,将这个订阅者对象加入这个属性主题的订阅者列表中。当 Model 层数据发生改变的时候,Model 作为发布者向主题发出通知,主题收到通知再向它的所有订阅者推送,订阅者收到通知后更改自己的数 据。

剑曼红尘 2020-04-06 21:09:13 0 浏览量 回答数 0

回答

标签定义超链接,用于从一张页面链接到另一张页面。 元素最重要的属性是 href 属性,它指示链接的目标。 在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接带有下划线而且是红色的

1668934001470375 2019-12-02 00:58:10 0 浏览量 回答数 0

回答

实现mvvm的双向绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。就必须要实现以下几点: 1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者 2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数 3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图 4、mvvm入口函数,整合以上三者 一共分四步, 每一步都有大堆解释和一大堆的代码, 然而我真的只是一个名副其实的理工科生, 看到了文中的发布者-订阅者模式, 于是乎我去网上各种百度, 个人理解就是getter函数里面执行的任务就是watcher订阅者, 而setter函数执行的任务就是发布者; 相信很多人看过了这个也是一知半解, 下面我来解释一波: ECMAScript中有两种属性: 数据属性和访问器属性, 数据属性一般用于存储数据数值, 访问器属性对应的是set/get操作, 不能直接存储数据值, 每种属性下面又都含有四个特性.下面介绍一下: 数据属性 1.[[Configurable]]: 表示能否通过delete将属性删除,能否把属性修改为访问器属性, 默认为false。当把属性Configurable设置为false后,该属性不能通过delete删除,并且也无法再将该属性的Configurable设置回true 2.[[Enumerable]]: 表示属性可否被枚举(即是否可以通过for in循环返回),默认false 3.[[Writable]]: 表示属性是否可写(即是否可以修改属性的值),默认false 4.[[Value]]: 该属性的数据值, 默认是undefined 访问器属性 1.[[Configurable]]: 表示能否通过delete将属性删除,能否把属性修改为数据属性, 默认为false。当把属性Configurable设置为false后,该属性不能通过delete删除,并且也无法再将该属性的Configurable设置回true 2.[[Enumerable]]: 表示属性可否被枚举(即是否可以通过for in循环返回),默认false 3.[[Get]]: 读取属性时调用的函数, 默认为undefined 4.[[Set]]: 写入属性时调用的函数, 默认是undefined 在修改属性的特性或者定义访问器属性的时候, 需要借助ECMAScript 5中的一个方法: Object.defineProperty(), 这个方法接收三个参数: 属性所在对象, 属性的名字, 描述符对象; 为对象定义多个属性的话, 就用函数的复数写法:Object.defineProperties(); 那么通过这个ES5的方法就可以直接很简单粗暴的说明双向绑定的原理:

景凌凯 2020-04-06 21:08:58 0 浏览量 回答数 0

回答

要访问array或object您如何使用两个不同的运算符。 数组 要访问数组元素,您必须使用,[]或者您不会看到太多,但也可以使用is {}。 echo $array[0]; echo $array{0}; //Both are equivalent and interchangeable 声明数组与访问数组元素之间的区别 定义数组和访问数组元素是两件事。所以不要把它们混在一起。 要定义一个数组,可以使用array()或对于PHP> = 5.4 []并分配/设置一个数组/元素。当您使用[]或{}如上所述访问数组元素时,将获得与设置元素相反的数组元素的值。 // 声明一个数组 $ arrayA = array( / 这里有一些东西 / ) ; $ arrayB = [ / 这里有一些东西 / ];//仅适用于PHP> = 5.4 // 访问数组元素 echo $ array [ 0 ] ; 回声$ array { 0 } ; 访问数组元素 要访问数组中的特定元素,可以使用内部的任何表达式,[]或者{}将其求值为要访问的键: $ array [ (任何表达式) ] 因此,请注意使用什么表达式作为键,以及如何通过PHP对其进行解释: echo $ array [ 0 ]; //键是一个整数;它访问0的元素 echo $ array [ “ 0” ]; //键是一个字符串;它访问0的元素 echo $ array [ “ string” ]; //键是一个字符串;它使用键“ string”访问元素 echo $ array [ CONSTANT ]; //键是一个常量,它被替换为对应的值 echo $ array [ cOnStAnT ]; //键也是常量而不是字符串 echo $ array [ $ anyVariable ] //键是一个变量,它被替换为'$ anyVariable'中的值 echo $ array [ functionXY() ]; //键将是函数 的返回值 访问多维数组 如果彼此之间有多个数组,则只需一个多维数组。要访问子数组中的数组元素,只需使用multiple即可[]。 echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"] // ├─────────────┘ ├──────────────┘ ├────────────────────────────┘ // │ │ └── 3rd Array dimension; // │ └──────────────────── 2d Array dimension; // └───────────────────────────────────── 1st Array dimension; 对象 要访问对象属性,必须使用->。 echo $ object- >属性; 如果在另一个对象中有一个对象,则只需使用多个->即可获得对象属性。 echo $objectA->objectB->property; 注意: 另外,如果您使用的属性名称无效,也必须小心!因此,要查看所有问题,您可能会遇到一个无效的属性名称,请参阅此问题/答案。如果您在属性名称的开头有数字,则尤其要注意这一点。 您只能从班级外部访问具有公共可见性的属性。否则(私有或受保护的),您需要一个方法或反射,您可以使用该方法或反射来获取属性的值。 数组与对象 现在,如果您将数组和对象彼此混合在一起,则只需查看是否现在访问数组元素或对象属性并为其使用相应的运算符即可。 //宾语 echo $ object-> anotherObject-> propertyArray [“ elementOneWithAnObject”]-> property; //├────┘├──────────┘├─────────────├─────────── ───────┘├──────┘ //││││└──属性; //│││└────────────────────────数组元素(对象);使用->访问属性“ property” //││└──────────────────────数组(财产);使用[]访问数组元素'elementOneWithAnObject' //│└──────────────────────────── ────────────属性(对象);使用->访问属性'propertyArray' //└────────────────────────────── ───────────────────对象;使用->访问属性“ anotherObject” //数组 echo $ array [“ arrayElement”] [“ anotherElement”]-> object-> property [“ element”]; //├───┘├──────────┘├────────────┘├────┘├────── ├├───────┘ //│││││└──数组元素; //││││└────────────属性(数组);使用[]访问数组元素'element' //│││└────────────────────属性(对象);使用->访问属性“ property” //││└────────────────数组元素(对象);使用->访问属性“对象” //│└──────────────────────────── ────────数组元素(array); 使用[]访问数组元素'anotherElement' //└────────────────────────────── ─────────────数组 使用[]访问数组元素'arrayElement' 我希望这给您一个大概的想法,当它们相互嵌套时如何访问数组和对象。 注意: 是否调用数组或对象取决于变量的最外部。所以[new StdClass]是一个阵列,即使它已(嵌套)对象内的,并$object->property = array();是一个对象,即使它已(嵌套)阵列内。 并且,如果不确定是否有对象或数组,请使用gettype()。 如果有人使用您以外的其他编码样式,请不要感到困惑: //Both methods/styles work and access the same data echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property; echo $object-> anotherObject ->propertyArray ["elementOneWithAnObject"]-> property; //Both methods/styles work and access the same data echo $array["arrayElement"]["anotherElement"]->object->property["element"]; echo $array["arrayElement"] ["anotherElement"]-> object ->property["element"]; 数组,对象和循环 如果您不仅要访问单个元素,还可以遍历嵌套的数组/对象并遍历特定维的值。 为此,您只需要访问要循环的维度,然后就可以循环浏览该维度的所有值。 作为示例,我们采用一个数组,但它也可以是一个对象: Array ( [data] => Array ( [0] => stdClass Object ( [propertyXY] => 1 ) [1] => stdClass Object ( [propertyXY] => 2 ) [2] => stdClass Object ( [propertyXY] => 3 ) ) ) 如果在第一个维度上循环,则将从第一个维度获取所有值: foreach($ array as $ key => $ value) 这意味着在第一维中,您只有一个带有key($key)data和value($value)的元素: Array ( //Key: array [0] => stdClass Object ( [propertyXY] => 1 ) [1] => stdClass Object ( [propertyXY] => 2 ) [2] => stdClass Object ( [propertyXY] => 3 ) ) 如果在第二维上循环,则将从第二维获取所有值: foreach($ array [“ data”] as $ key => $ value) 在这里意味着在第二个维度你有3个元素与键($key)0,1,2和值($value): stdClass Object ( //Key: 0 [propertyXY] => 1 ) stdClass Object ( //Key: 1 [propertyXY] => 2 ) stdClass Object ( //Key: 2 [propertyXY] => 3 ) 这样,您就可以遍历任何维,无论它是数组还是对象。 分析var_dump()/ print_r()/ var_export()输出 所有这三个调试功能都输出相同的数据,只是以另一种格式或带有一些元数据(例如,类型,大小)。因此,在这里我想展示如何读取这些函数的输出,以了解/了解如何从数组/对象访问某些数据。 输入数组: $array = [ "key" => (object) [ "property" => [1,2,3] ] ]; var_dump() 输出: array(1) { ["key"]=> object(stdClass)#1 (1) { ["property"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } } } print_r() 输出: Array ( [key] => stdClass Object ( [property] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) ) var_export() 输出: array ( 'key' => stdClass::__set_state(array( 'property' => array ( 0 => 1, 1 => 2, 2 => 3, ), )), ) 因此,您可以看到所有输出都非常相似。而且,如果现在要访问值2,则可以从值本身开始,您要访问该值,然后逐步到达“左上角”。 1.我们首先看到,值2在键为1的数组中 array(3){ // var_dump() [0] => 整数(1) [1] => 整数(2) [2] => 整数(3) } 数组 // print_r() ( [0] => 1 [1] => 2 [2] => 3 ) 数组( // var_export() 0 => 1 1 => 2 2 => 3, ), 这意味着我们必须使用[]/ {}来访问值2 [1],因为该值具有键/索引1。 2.接下来,我们看到将数组分配给具有对象名称属性的属性 对象(stdClass)#1(1){ // var_dump() [“ property”] => / 此处数组 / } stdClass 对象 // print_r() ( [property] => / 此处为数组 / ) stdClass :: __ set_state ( array(// var_export() 'property' => / 此处数组 / )) 这意味着我们必须使用->访问对象的属性,例如->property。 所以直到现在我们知道,我们必须使用->property[1]。 3.最后,我们看到最外面的是一个数组 array(1){ // var_dump() [“ key”] => / 对象和数组在这里 / } 数组 // print_r() ( [key] => / 对象和数组在这里 / ) 数组( // var_export() 'key' => / 对象和数组在这里 / ) 如我们所知,我们必须使用来访问数组元素[],我们在这里看到我们必须使用["key"]来访问对象。现在,我们可以将所有这些部分放在一起并编写: echo $array["key"]->property[1]; 输出将是: 2 不要让PHP欺骗您! 您需要了解一些事情,这样您就不必花费大量时间来寻找它们。 “隐藏”字符 有时,您的按键中包含字符,这些字符在浏览器的第一次外观中不会出现。然后您要问自己,为什么无法访问该元素。这些字符可以是:标签(\t),新线(\n),空格或HTML标签(例如, )等。 作为示例,如果您查看的输出,print_r()则会看到: Array ( [key] => HERE ) 然后,您尝试通过以下方式访问元素: echo $arr["key"]; 但是您会收到通知: 注意:未定义的索引:键 这很好地表明必须有一些隐藏的字符,因为即使键看起来很正确,也无法访问该元素。 这里的技巧是使用var_dump()+查看源代码!(备选:highlight_string(print_r($variable, TRUE));) 突然之间,您可能会看到以下内容: array(1) { [" key"]=> string(4) "HERE" } 现在您将看到,您的键中带有一个html标记+一个换行符,这是您最初没有看到的,因为print_r()浏览器没有显示它。 所以现在,如果您尝试执行以下操作: echo $arr["\nkey"]; 您将获得所需的输出: HERE 永远不要相信XML 的输出,print_r()或者var_dump()如果您看XML 您可能将XML文件或字符串加载到对象中,例如 现在,如果您使用var_dump()或,print_r()您将看到: SimpleXMLElement Object ( [item] => SimpleXMLElement Object ( [title] => test ) ) 如您所见,您看不到标题的属性。因此,正如我说永远不要相信的输出var_dump()或print_r()当你有一个XML对象。始终用于asXML()查看完整的XML文件/字符串。 因此,只需使用下面显示的方法之一: echo $xml->asXML(); //And look into the source code highlight_string($xml->asXML()); header ("Content-Type:text/xml"); echo $xml->asXML(); 然后您将获得输出:

保持可爱mmm 2020-02-09 14:02:47 0 浏览量 回答数 0

问题

dom 访问元素子节点会访问到空的文本节点

杨冬芳 2019-12-01 20:09:47 997 浏览量 回答数 1

回答

$ 我们经常使用向 $ 内传入一个字符串的方式来选择或生成 DOM 元素,但如果这个字符串是来自用户输入的话,那么这种方式就是有风险的。 先看一个 DEMO: http://jsbin.com/duwuzonife/1/edit?html,js,output $("<img src='' onerror='alert();'>"); 当用户输入的字符串是像这样的时,虽然这个 <img> 元素不会马上被插入到网页的 DOM 中,但这个 DOM 元素已经被创建了,并且暂存在内存里。而对于 <img> 元素,只要设置了它的 src 属性,浏览器就会马上请求 src 属性所指向的资源。我们也可以利用这个特性做图片的预加载。在上面的示例代码中,创建元素的同时,也设置了它的属性,包括 src 属性和 onerror 事件监听器,所以浏览器会马上请求图片资源,显然请求不到,随机触发 onerror 的回调函数,也就执行了 JavaScript 代码。 推荐阅读 $ 的官方文档: http://api.jquery.com/jQuery/ 类似的其他方法 .after() .append() .appendTo() .before() .html() .insertAfter() .insertBefore() .prepend() .prependTo() .replaceAll() .replaceWith() .unwrap() .wrap() .wrapAll() .wrapInner() .prepend() 以上这些方法不仅创建 DOM 元素,并且会马上插入到页面的 DOM 树中。如果使用 <script> 标签插入了内联 JS 会立即执行。 不安全的输入来源 document.URL * document.location.pathname * document.location.href * document.location.search * document.location.hash document.referrer * window.name document.cookie document 的大多数属性都可以通过全局的 window 对象访问到。加 * 的属性返回的时编码 (urlencode) 后的字符串,需要解码才可能造成威胁。 不安全的操作 把可以被用户编辑的字符串,用在以下场景中,都是有隐患的。总体来说,任何把字符串作为可执行的代码的操作,都是不安全的。 1.通过字符串创建函数 (1)eval (2)new Function (3)setTimeout/setInterval 2.跳转页面 location.replace/location.assign 修改 <script> 标签的 src 属性 修改事件监听器 总结 如果发生在用 jQuery 时被 DOM-XSS 攻击的情况,大多是因为忽视了两个东西: 1. 在给$传参数时,对参数来源的把控。 2. 用户的输入途径不只有表单,还有地址栏,还可以通过开发者工具直接修改 DOM ,或者直接在控制台执行 JS 代码。 答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 03:05:01 0 浏览量 回答数 0

回答

java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。 队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。 offer 添加一个元素并返回true 如果队列已满,则返回false poll 移除并返问队列头部的元素 如果队列为空,则返回null peek 返回队列头部的元素 如果队列为空,则返回null put 添加一个元素 如果队列满,则阻塞 take 移除并返回队列头部的元素 如果队列为空,则阻塞 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个 NoSuchElementException异常 注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。 还有带超时的offer和poll方法重载,例如,下面的调用: boolean success = q.offer(x,100,TimeUnit.MILLISECONDS); 尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用: Object head = q.poll(100, TimeUnit.MILLISECONDS); 如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。 阻塞操作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。 Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。 答案来源于网络

养狐狸的猫 2019-12-02 02:14:06 0 浏览量 回答数 0

回答

Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。我们可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回: class CustomForm extends Component { handleSubmit = () => { console.log("Input Value: ", this.input.value); }; render() { return ( <form onSubmit={this.handleSubmit}> <input type="text" ref={input => (this.input = input)} /> <button type="submit">Submit</button> </form> ); } } 上述代码中的 input 域包含了一个 ref 属性,该属性声明的回调函数会接收 input 对应的 DOM 元素,我们将其绑定到 this 指针以便在其他的类函数中使用。另外值得一提的是,refs 并不是类组件的专属,函数式组件同样能够利用闭包暂存其值: function CustomForm({ handleSubmit }) { let inputElement; return ( <form onSubmit={() => handleSubmit(inputElement.value)}> <input type="text" ref={input => (inputElement = input)} /> <button type="submit">Submit</button> </form> ); }

问问小秘 2019-12-02 03:20:42 0 浏览量 回答数 0

回答

get和load,一个是直接加载,并不是直接去数据库查询,如果缓存里有,首先到缓存里找,缓存分为一级缓存和二级缓存,首先到一级缓存中查找;如果在session关闭之后进行获取类的名字之类的属性,依然会获取到,例:Order od = (Order) session.get(Order.class, 1);通过get获取的Order类是一个持久化类,如果session关闭之后进行获取,od.getName,它就会变成托管状态,但是这个对象还是有的,所以没事;另一个是懒加载,他不会直接进行操作,就是除了获取id(标识符)和类.class时,获取其他的类属性都会进行操作,例:Account acc=(Account)session.load(Account.class,new Long(1)); //返回一个代理对象System.out.println(acc.getId);System.out.prontln(acc.getLonginName());这里的1是一个代理对象,如果只获取他的id,则不会加载,不会出现select语句,只有获取除他和本身之外才会进行查找;否则访问的只是他的代理对象而已;如果需要取消懒加载,就只需要在你想获取的类属性的映射文件的把他改为false就可以了,这样懒加载就取消了,这里只对load管用,对get()毫无影响;如果把他System.out.prontln(acc.getLonginName());放在session关闭之后,则会出现错误,因为这里只产生了一个代理对象,没有真正去查,把session关之后,他会去查数据库,要发出sql语句,因为发出sql语句需要在session里面,所以session关了之后,就不能使用了;接下来说一说他们之间的区别,延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。如果只是访问对象标示符属性,就没有必要初始化代码。Account acc=(Account)session.load(Account.class,new Long(1)); //返回一个代理对象 Order order=new Order(); order.setCreateTime(new Date()); order.setAccount(acc); Session.save(order);在这只需要Account实例来创建一个新的Order订单对象,当调用session.save(order)时,也只需要Account的主标示符值作为外键保存到订单表的对应字段中。这样就少执行一条select语句,从而提高查询效率。Hibernate中默认采用延迟加载的情况主要有以下几种:当调用Session上的load()方法加载一个实体时,会采用延迟加载。当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。(one-to-many)例:当Client这个类里具有集合属性,Client client = (Client) session.get(Client.class, 4);System.out.println(client.getName());获取他的名字,你会发现只有一条sql语句,因为采用了延迟加载,所以如果想取消,就在该映射文件下里面把lazy改成false;当Session加载某个实体时,会对这个实体所单端关联(one-to-one, many-to-one)的另一个实体对象采用延迟加载。能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。2、 关闭延迟加载在加载单个实体时,如果不需要延迟加载,就可以使用session的get()方法。当Session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这时可以在映射文件中针对 这个集合属性的配置元素(,,…)添加属性lazy=“false”。当Session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在映射文件中对这个单端关联的配置元素(, )添加属性lazy=“false”。注意:one-to-one不能有constrained=true如果回答对您有帮助,请采纳

小旋风柴进 2019-12-02 02:11:32 0 浏览量 回答数 0

问题

【精品问答】前端开发必懂之CSS技术八十问

茶什i 2019-12-01 22:00:52 1642 浏览量 回答数 1

回答

应该是第一个方式里面,首先有一个DOM元素对象button,然后人为定义button的属性onclick是一个闭包函数,在JS里面,闭包函数是可以访问外层函数的变量,也就是onclick的闭包函数里面引用到了button元素,即使你没有使用这个东西,这就循环引用了。逻辑上来说就是:如果要释放button对象,需要先删除onclick函数,可是删除onclick函数就需要先释放对button对象的引用,然后要释放button的引用又需要先删除onclick函数,就这样死循环下去,内存泄漏了。

a123456678 2019-12-02 03:08:48 0 浏览量 回答数 0

回答

这个的目的是,给标签以href属性,并不连接到实际的页面。 给标签增加href属性,就意味着以下事情:•:link选择器可以选择到它•这个a标签可以获得焦点(可以通过tab按键访问到,从而屏幕阅读器能够读出背后的内容,增强可访问性)•在浏览器的默认样式表中,有href属性的标签才有cursor:pointer的效果。•优雅降级,在网络连接很差,还没有加载到CSS的时候,依然有手型与正常的link样式。 给标签以href属性,并不连接到实际的页面,还有其他方案。 额外说一下浏览器的默认样式表。 首先看webkit: a:-webkit-any-link { color: -webkit-link; text-decoration: underline; cursor: auto; } a:-webkit-any-link:active { color: -webkit-activelink 而mozilla有这样的默认样式: *|*:-moz-any-link { cursor: pointer; } *|*:-moz-any-link:-moz-focusring { /* Don't specify the outline-color, we should always use initial value. */ outline: 1px dotted; } 可以看到,webkit和mozilla浏览器都实现了类似于any-link的私有选择符,选取有link语义的标签,比如,有href的。 IE和opera的默认样式表里没有这样的私有选择符,但是有href属性的标签才会应用上标签的样式,若没有href属性,它的样式和一样,仅仅是inline级别的元素。 /*opera的默认样式*/ a { color: #00C; text-decoration: underline; } a:visited { color: #800080; } 我参考的浏览器默认CSS样式表:•IE:http://www.iecss.com/•WebKit在http://trac.webkit.org/browser/trunk/Source/WebCore/css(包括 html.css,fullscreen.css,quirks.css等

杨冬芳 2019-12-02 02:47:22 0 浏览量 回答数 0

回答

集合框架实现了各种接口,集合接口和Map接口(java.util.Map)是Java集合框架的主要使用接口。下面给出了Collection Framework的接口列表: 1.集合接口:集合(java.util.Collection)是主要接口,每个集合都必须实现此接口。 List接口:List接口扩展了Collection接口,它是对象的有序集合。它包含重复的元素。它还允许元素的随机访问。 Set接口:Set(java.util.Set)接口是一个不能包含重复元素的集合。它只能包含Collection接口的继承方法 4.出队接口:这是一个双端队列。它允许从两端插入和删除元素。它植入了堆栈和队列的属性,因此它可以执行LIFO(后进先出)堆栈和FIFO(先进先出)队列操作。 Map接口:Map(java.util.Map)表示元素的键,值对存储。 Map接口未实现Collection接口。它只能包含一个唯一键,但可以有重复的元素。在Java中有两个实现Map的接口是Map接口和Sorted Map。

YDYK 2020-04-24 17:03:09 0 浏览量 回答数 0

回答

png24位的图片在iE6浏览器上出现背景 解决方案:做成PNG8,也可以引用一段脚本处理. 浏览器默认的margin和padding不同 解决方案:加一个全局的 *{margin:0;padding:0;} 来统一。 IE6双边距bug:在IE6下,如果对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。 这种情况之下IE会产生20px的距离 解决方案:在float的标签样式控制中加入 _display:inline; 将其转化为行内属性。( _ 这个符号只有ie6会识别) 渐进识别的方式,从总体中逐渐排除局部。 首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。 接着,再次使用 "+" 将IE8和IE7、IE6分离开来,这样IE8已经独立识别。 5.IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性 解决方法:统一通过getAttribute()获取自定义属性 IE下,event对象有 x、y 属性,但是没有 pageX、pageY属性; Firefox下,event对象有 pageX、pageY 属性,但是没有 x、y 属性 解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。 Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示 解决方法:可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决 超链接访问过后 hover 样式就不出现了,被点击访问过的超链接样式不在具有 hover 和 active 了 解决方法:改变CSS属性的排列顺序 L-V-H-A 怪异模式问题:漏写 DTD 声明,Firefox 仍然会按照标准模式来解析网页,但在 IE 中会触发怪异模式。为避免怪异模式给我们带来不必要的麻烦,最好养成书写 DTD 声明的好习惯。现在可以使用html5 推荐的写法: 上下margin重合问题:ie和ff都存在,相邻的两个div的margin-left和margin-right不会重合,但是margin-top和margin-bottom却会发生重合。 解决方法:养成良好的代码编写习惯,同时采用margin-top或者同时采用margin-bottom。 ie6对png图片格式支持不好 解决方案:引用一段脚本处理

小柯卡力多 2019-12-02 03:21:58 0 浏览量 回答数 0

回答

在apache-tomcat -》conf -》server.xml文件Host节点中的尾部加入以下配置:<Context path="/hello" docBase="d:\source\hello" reloadable="true"/>以上元素的 path属性表明访问hello应用的URL入 口为“/hello” ;

落地花开啦 2019-12-02 02:30:52 0 浏览量 回答数 0

回答

要用nextElementSibling,以及getAttribute方法: var obj = document.getElementById('two'); if (obj.nextElementSibling) { console.log("***" + obj.nextElementSibling.getAttribute("name")); //★★★★★这个在非IE怎么总是输出不了? } else { console.log("***" + obj.nextSibling.name); } console.log("***" + obj.childNodes[0].nodeValue); //2222 补充一下,我用的是Chrome浏览器,是不能使用.name获取name属性的: <div id="one" name="ssas"> </div> <script> var o = document.getElementById("one"); console.log(o.name); //undefined console.log(o.getAttribute("name")); //sass console.log(navigator.userAgent); //Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36 </script> 好吧,最后更新一下,找到原因了:因为div、p等元素是没有name属性的,当你加上了name属性的时候,就相当于给他使用setAttribute("name", "blablabla..."),这个时候使用对象obj的属性name(obj.name)是访问不到的,只能使用getAttribute方法。 另外你可以测试一下input标签,当中添加name属性,用obj.name就可以访问。 <input type="text" id="one" name="ssas"> </input> <script> var o = document.getElementById("one"); console.log(o.name); //sass </script>

杨冬芳 2019-12-02 02:56:15 0 浏览量 回答数 0

回答

好像没啥缺点,说说优点吧。当然是兼容性了。虽然现在标准浏览器的市场份额越来越高,但是回想当年,没有jQuery,开发难度立马上升很多。方便的事件托管。在jQuery中,我们可以非常方便的使用.on('event', 'selector', function),把事件响应函数托管给父级容器,这样在列表类的应用中,不仅可以大大减少内存占用,还可以放心的移除新增子元素。部分事件增加冒泡。submit事件在IE中是不冒泡的,jQuery人工给它增加了冒泡能力。方便的trigger。虽然用起来都是事件,但其实不同的事件存在于不同的命名空间中,自己写的时候多半得查下资料,用jQuery的话直接trigger就好。批量off。原生JavaScript中,removeEventListener一次只能移除一个事件的一个侦听函数。jQuery中则可以一次性移除多个侦听或托管,甚至全部侦听。尤其在移除DOM元素前,非常有用。事件命名空间。使用命名空间可以更方便的批量管理事件。一次性操作多个事件。传递事件类型时可以使用空格分隔,达到一次绑定多个事件到同一个选择器和同一个处理函数的目的。总之,jQuery在时刻践行它的口号:少写,多效。补充两点不算缺点的注意事项吧。jQuery使用自定义事件取代原生事件。早期的事件属性比较简单,jQuery会把常用属性复制到自定义事件上,比如target、currentTarget。但是后来新增的事件,比如ctrl+v粘贴时触发的ClipboardEvent.paste,要访问剪切板的内容,就必须通过originEvent找到原生事件,才能访问.data。我有一篇博客记录了这个情况。使用事件托管时,currentTarget和this指向的都是selector指定的DOM节点。使用事件托管,移除事件时,需要指定selector,不然移除的是父节点本身的侦听,而不是子节点的侦听。

小旋风柴进 2019-12-02 02:21:21 0 浏览量 回答数 0

问题

API如何获取队列列表?

轩墨 2019-12-01 22:10:07 1162 浏览量 回答数 0

回答

1.具体区别如下: 我们在开发的过程中使用HashMap比较多,在Map中在Map 中插入、删除和定位元素,HashMap 是最好的选择。 但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列. HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直 接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null, 允许多条记录的值为null。HashMap不支持线程同步,即任一时刻可以有多个线程 同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的 synchronizedMap方法使HashMap具有同步的能力。 Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的 同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的 记录肯定是先插入的。 在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序, 也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。 2.LinkedHashMap简述: LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和 输入时的相同,那么就选用LinkedHashMap。 LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现 提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保 证该顺序恒久不变。 LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双 重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 注意:此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结 构上修改了该映射,则它必须保持外部同步。 根据链表中元素的顺序可以分为:按插入顺序的链表,和按访问顺序(调用get方法)的链表。 默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素 移至链表尾部,不断访问可以形成按访问顺序排序的链表。 可以重写removeEldestEntry方法返 回true值指定插入元素时移除最老的元素。 3.LinkedHashMap的实现: 对于LinkedHashMap而言,它继承与HashMap、底层使用哈希表与双向链表来保存所有元 素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性。 下面我们来分析LinkedHashMap的源代码: 类结构:public class LinkedHashMap extends HashMap implements Map 1) 成员变量: LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry, 该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而 在哈希表的基础上又构成了双向链接列表。看源代码: //true表示按照访问顺序迭代,false时表示按照插入顺序 private final boolean accessOrder; /** 双向链表的表头元素。 */ private transient Entry header; /** LinkedHashMap的Entry元素。 继承HashMap的Entry元素,又保存了其上一个元素before和下一个元素after的引用。 */ private static class Entry extends HashMap.Entry { Entry<K,V> before, after; …… } HashMap.Entry: static class Entry implements Map.Entry { final K key; V value; Entry<K,V> next; final int hash; Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } } 2) 初始化: 通过源代码可以看出,在LinkedHashMap的构造方法中,实际调用了父类HashMap的 相关构造方法来构造一个底层存放的table数组。如: public LinkedHashMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); accessOrder = false; } HashMap中的相关构造方法: public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); // Find a power of 2 >= initialCapacity int capacity = 1; while (capacity < initialCapacity) capacity <<= 1; this.loadFactor = loadFactor; threshold = (int)(capacity * loadFactor); table = new Entry[capacity]; init(); } 我们已经知道LinkedHashMap的Entry元素继承HashMap的Entry,提供了双向链表 的功能。在上述HashMap的构造器中,最后会调用init()方法,进行相关的初始化,这个 方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。 LinkedHashMap重写了init()方法,在调用父类的构造方法完成构造后,进一步实现 了对其元素Entry的初始化操作。 void init() { header = new Entry<K,V>(-1, null, null, null); header.before = header.after = header; } 3) 存储: LinkedHashMap并未重写父类HashMap的put方法,而是重写了父类HashMap的put方法 调用的子方法void recordAccess(HashMap m) ,void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了自己 特有的双向链接列表的实现。 HashMap.put: public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } 重写方法: void recordAccess(HashMap m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } } void addEntry(int hash, K key, V value, int bucketIndex) { // 调用create方法,将新元素以双向链表的的形式加入到映射中。 createEntry(hash, key, value, bucketIndex); // 删除最近最少使用元素的策略定义 Entry<K,V> eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); } } void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry<K,V> e = new Entry<K,V>(hash, key, value, old); table[bucketIndex] = e; // 调用元素的addBrefore方法,将元素加入到哈希、双向链接列表。 e.addBefore(header); size++; } private void addBefore(Entry existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; } 4) 读取: LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得 查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的 元素添加到双向链表的表头,并从原来的位置删除。由于的链表的增加、删除操作是常 量级的,故并不会带来性能的损失。 HashMap.containsValue: public boolean containsValue(Object value) { if (value == null) return containsNullValue(); Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true; return false; } /*查找Map中是否包含给定的value,还是考虑到,LinkedHashMap拥有的双链表, 在这里Override是为了提高迭代的效率。 */ public boolean containsValue(Object value) { // Overridden to take advantage of faster iterator if (value==null) { for (Entry e = header.after; e != header; e = e.after) if (e.value==null) return true; } else { for (Entry e = header.after; e != header; e = e.after) if (value.equals(e.value)) return true; } return false; } /*该transfer()是HashMap中的实现:遍历整个表的各个桶位,然后对桶进行遍历得到 每一个Entry,重新hash到newTable中, //放在这里是为了和下面LinkedHashMap重写该法的比较, void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry<K,V> e = src[j]; if (e != null) { src[j] = null; do { Entry<K,V> next = e.next; int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } while (e != null); } } } */ /** *transfer()方法是其父类HashMap调用resize()的时候调用的方法,它的作用是表扩容后, 把旧表中的key重新hash到新的表中。 *这里从写了父类HashMap中的该方法,是因为考虑到,LinkedHashMap拥有的双链表, 在这里Override是为了提高迭代的效率。 */ void transfer(HashMap.Entry[] newTable) { int newCapacity = newTable.length; for (Entry e = header.after; e != header; e = e.after) { int index = indexFor(e.hash, newCapacity); e.next = newTable[index]; newTable[index] = e; } } public V get(Object key) { // 调用父类HashMap的getEntry()方法,取得要查找的元素。 Entry<K,V> e = (Entry<K,V>)getEntry(key); if (e == null) return null; // 记录访问顺序。 e.recordAccess(this); return e.value; } void recordAccess(HashMap m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; // 如果定义了LinkedHashMap的迭代顺序为访问顺序, // 则删除以前位置上的元素,并将最新访问的元素添加到链表表头。 if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } } /** * Removes this entry from the linked list. */ private void remove() { before.after = after; after.before = before; } /*clear链表,设置header为初始状态/ public void clear() { super.clear(); header.before = header.after = header; } 5) 排序模式: LinkedHashMap定义了排序模式accessOrder,该属性为boolean型变量,对于访问 顺序,为true;对于插入顺序,则为false。 private final boolean accessOrder; 一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序。看LinkedHashMap 的构造方法,如: public LinkedHashMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); accessOrder = false; } 这些构造方法都会默认指定排序模式为插入顺序。如果你想构造一个LinkedHashMap, 并打算按从近期访问最少到近期访问最多的顺序(即访问顺序)来保存元素,那么请使用 下面的构造方法构造LinkedHashMap: public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; } 该哈希映射的迭代顺序就是最后访问其条目的顺序,这种映射很适合构建LRU缓存。 LinkedHashMap提供了removeEldestEntry(Map.Entry eldest)方法。该方法可以提供 在每次添加新条目时移除最旧条目的实现程序,默认返回false,这样,此映射的行为将类 似于正常映射,即永远不能移除最旧的元素。 当有新元素加入Map的时候会调用Entry的addEntry方法,会调用removeEldestEntry方法, 这里就是实现LRU元素过期机制的地方,默认的情况下removeEldestEntry方法只返回false 表示元素永远不过期。 /** * This override alters behavior of superclass put method. It causes newly * allocated entry to get inserted at the end of the linked list and * removes the eldest entry if appropriate. */ void addEntry(int hash, K key, V value, int bucketIndex) { createEntry(hash, key, value, bucketIndex); // Remove eldest entry if instructed, else grow capacity if appropriate Entry<K,V> eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); } } /** * This override differs from addEntry in that it doesn't resize the * table or remove the eldest entry. */ void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry e = new Entry(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; } protected boolean removeEldestEntry(Map.Entry eldest) { return false; } 此方法通常不以任何方式修改映射,相反允许映射在其返回值的指引下进行自我修改。 如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。 例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时 删除最旧的条目。 private static final int MAX_ENTRIES = 100; protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_ENTRIES; } 其实LinkedHashMap几乎和HashMap一样,不同的是它定义了一个Entry header, 这个header不是放在Table里,它是额外独立出来的。LinkedHashMap通过继承hashMap 中的Entry,并添加两个属性Entry before,after,和header结合起来组成一个双 向链表,来实现按插入顺序或访问顺序排序

wangccsy 2019-12-02 01:48:36 0 浏览量 回答数 0

回答

有两种方法 这是最近添加的方法。参考文献使用创建的React.createRef()方法和连接反应经由元素ref属性。为了在整个组件中使用引用,只需将引用分配给构造函数中的instance属性。 class MyComponent extends React.Component { constructor(props) { super(props) this.myRef = React.createRef() } render() { return <div ref={this.myRef} /> } } 无论React版本如何,您也可以使用ref回调方法。例如,按以下方式访问搜索栏组件的输入元素 class SearchBar extends Component { constructor(props) { super(props); this.txtSearch = null; this.state = { term: '' }; this.setInputSearchRef = e => { this.txtSearch = e; } } onInputChange(event) { this.setState({ term: this.txtSearch.value }); } render() { return ( <input value={this.state.term} onChange={this.onInputChange.bind(this)} ref={this.setInputSearchRef} /> ); } } 您还可以使用闭包在功能组件中使用引用。 注意:即使不推荐这样做,也可以使用内联引用回调

你的答案 2020-05-07 16:31:50 0 浏览量 回答数 0

问题

Android API兼容性指南

mqc 2019-12-01 21:00:01 2106 浏览量 回答数 0

问题

IE 9 DOM元素的style.setProperty()参数无效403.10 禁止访问:配置无效

kun坤 2020-05-27 18:06:49 7 浏览量 回答数 1

问题

消息服务的的Topic如何操作?

轩墨 2019-12-01 22:10:29 1532 浏览量 回答数 0

问题

JavaScript 的 jQuery 新方法 data() 我做了个实验,和我想的不一样,怎么回事呢?

a123456678 2019-12-01 20:15:26 855 浏览量 回答数 1

回答

概念 Apache Tomcat最早是由Sun Microsystems开发的一个Servlet容器,在1999年被捐献给ASF(Apache Software Foundation),隶属于Jakarta项目,现在已经独立为一个顶级项目。Tomcat主要实现了Java EE中的Servlet、JSP规范,同时也提供HTTP服务,是市场上非常流行的Java Web容器。 目录结构 以Tomcat-8.5为例,分析下各个目录都有哪些文件、有哪些作- 1. 用。 bin:主要存放tomcat的操作命令,根据操作系统可以分为两大类:一是以.bat结尾(Windows);二是以.sh结尾(Linux)。比如可以通过startup启动,shutdown关闭Tomcat。 conf:全局配置文件 一个策略文件:catalina.policy 定义了安全策略。 两个属性文件:catalina.properties 和 logging.properties 。 四个XML配置文件: server.xml:Tomcat的主要配置文件,配置整个服务器信息,如修改连接器端口号(默认为8080)。不能动态重加载,文件修改之后必须重启服务器才能生效。 web.xml:全局的web应用程序部署描述文件,如可以设置tomcat支持的文件类型。 context.xml:Tomcat的一些特定配置项,针对所有应用程序生效。 tomcat-users.xml:配置Tomcat的用户名、密码,管理身份验证以及访问控制权限。 lib:Tomcat运行依赖的一些Jar文件,比如常见的servlet-api.jar、jsp-api.jar。所有的应用程序可用,可以放置一些公用的Jar文件,如MySQL JDBC驱动(mysql-connector-java-5.1.{xx}-bin.jar)。 logs:运行中产生的日志文件。包含引擎(engine)日志文件 Catalina.{yyyy-mm-dd}.log,主机日志文件localhost.{yyyy-mm-dd}.log,以及一些其他应用日志文件如manager、host-manager。访问日志也保存在此目录下。 temp:临时文件目录,清空不会影响Tomcat运行 webapps:默认的应用程序根目录,Tomcat启动时会自动加载该目录下的应用程序,可以以文件夹、war包、jar包的形式发布(启动时会自动解压成相应的文件夹)。也可以把应用程序放置在其他路径下,需要在文件中配置路径映射。 work:用来存放tomcat在运行时的编译后文件,如JSP编译后的文件。清空work目录,然后重启tomcat,可以达到清除缓存的作用。 架构 Tomcat是一个HTTP服务器,同时也是一个Servlet容器(可以执行Servlet文件,JSP、JSF会被转换成Servlet),支持多种功能,因此采用了分层、模块化的设计。 查看conf文件夹中的server.xml文件,可以发现上图的层次结构。 <Server> <Service> <Connector/> <Engine> <Host></Host> </Engine> </Service> </Server> Server Server是一个顶级组件,代表了一个Tomcat实例,一个JVM进程中只能有一个Server实例。Tomcat提供了一个实现了 org.apache.catalina.Server接口的 org.apache.catalina.core.StandardServer默认类,读取Server元素配置。 Server是配置文件中的最外层元素,支持以下属性: className:指定要使用的实现类(必须实现org.apache.catalina.Server接口)名称。如果不指定,默认使用标准实现类StandardServer。 address:等待shutdown命令的服务器IP地址,默认是localhost。 port:等待shutdown命令的监听端口,如果设置为-1,表示关闭shutdown端口。 shutdown:指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置 。   启动Tomcat,打开命令行工具,通过telnet命令:telnet localhost 8005 连接服务器 输入SHUTDOWN命令,即可关闭Tomcat Cluster Cluster可以解决应用之间session共享、上下文属性共享,以及在集群内共同部署应用程序的问题。元素可以包含在或者元素下。 Context Host元素定义了虚拟主机,Context则是虚拟主机下的具体应用。Tomcat启动后,webapps目录下的所有应用程序都会自动运行,访问某个具体项目需要在URL中指定项目名称,如 http://localhost:8080/examples/ ,ROOT目录除外。想要通过 http://localhost:8080 来访问自定义项目,可以把应用程序直接放到ROOT目录中(让ROOT做为项目的根目录),也可以通过Context来配置映射。 <!-- path:访问项目时的URL,加在localhost:8080后 docBase:path对应的项目目录 reloadable:监视 /WEB-INF/classes/ 和 /WEB-INF/lib目录中的类文件,更改后自动重载应用程序, 生成环境不建议使用,默认为“false” -->  更改server.xml文件后,重新启动Tomcat,在浏览器中输入 http://localhost:8080 即可访问examples应用。 Host 一个Host元素代表了一个虚拟主机,默认主机名为localhost,支持多个Context。 <!-- appBase:定义了应用程序的根目录,默认是webapps unpackWARS:定义了是否解压webapps中的WAR文件,如果指定为“false”,会从WAR文件直接运行程序,执行较慢 autoDeploy:把应用程序直接拖到webapps目录下,是否自动运行 -->

问问小秘 2020-04-30 17:01:07 0 浏览量 回答数 0

回答

len是一个内置函数,该函数调用给定容器对象的__len__成员函数以获取对象中元素的数量。 带双下划线的函数通常是“特殊方法”,在Python中实现标准接口之一(容器,数字等)。通过语法糖使用特殊方法(对象创建,容器索引和切片,属性访问,内置函数等)。 使用obj.len()不是使用特殊方法的正确方法,但是我不明白为什么其他方法被如此大量地降低了。

保持可爱mmm 2020-02-07 00:15:49 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板