考书籍java疯狂讲义所做的学习总结。我相信我还会回来的!
一、概要:List集合是一个元素有序,可重复的集合,该接口是Collection接口的子接口。List接口下接口的实现类有,ArrayList、LinkedList、Vector,其中Vector年龄较大(1.0版本就存在了)。
二、List接口中常用的方法
》void add(int index,Object element):将元素element插入到集合的index处。
》boolean addAll(int index,Collection c):将集合c所包含的元素都插入到List集合的index处。
》Object get(int index):返回集合index处的索引处的元素。
》int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。
》int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的索引。
》Object remove(int index):删除并返回index索引处的元素。
》Object set(int index,Object element):将index索引处的元素替换为element对象,返回新元素。
》List subList(int fromIndex,int toIndex):返回从索引fromIndex(包含)到toIndex(不包含)处所有集合元素组成的子集合。
部分用法如下:
三、遍历List集合的三种方式
关于迭代器Iterator的使用:Iterator接口也是java集合框架的成员,但它与Collection,Map集合不一样,Collection集合和Map集合主要用户装对象,而Iterator主要用于遍历,Iterator本身病不提供盛装对象的能力;还有一点需要注意的是,当时用Iterator遍历Collection集合元素时,只有通过Iterator的romove方法删除上一次next方法返回的集合元素才可以,否则的话,会引发java.util.ConcuurentModdificationException异常。
三、ArrayList的使用以及存储原理
ArrayList和Vector是基于数组实现的List类,所以AyyayList和Vector类封装了一个动态的、允许再分配的Object数组。ArrayList或Vector对象使用initialCapacity参数设置数组的长度,当向ArrayList和Vector中添加元素超出该数组的长度时,他们的initialCapacity会自动增加。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组的增长大约是其原容量的1.5倍。如果向ArrayList或Vector集合中添加大量元素时,可使用ensureCapacity(int X)方法一次性地增加initialCapacity.可减少重分配的次数,从而提高性能。(摘自疯狂java讲义)
关于具体ArrayList的实现原理,推荐前辈博客:https://www.cnblogs.com/ITtangtang/p/3948555.html
四、LinkedList的使用原理
1.LinkedList是一个双向链表,它也可以被当作堆栈、队列或双端队列进行操作。既然其底层的数据结构是链表,必然每个节点中的存储都是:前一个节点的位置信息,节点数据和后一个节点的位置信息。正是因为此结构,所以在进行增删元素的时候效率特别高,不需要像ArrayList那样还要按索引查找,在进行增加,删除元素,然后还需要更新索引结构。LinkedList在进行增删的时候,只需要修改上一个元素的后节点信息和下一个元素的前节点信息即可。但是在查询的时候就慢了,它只能依次访问集合中的每个元素,找不到的话,就根据链表继续向下走,去访问下一个元素。
2.使用LinkedList模拟队列:
五、线程安全问题
ArrayList是线程不安全的集合,当有多个线程访问同一个Arraylist的集合时,如果有超过一个线程修改了ArrayList集合,则必须手动保证该集合的同步性。使用Conllections类中提供的syschronizedXXX()方法,该方法将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时带来的线程安全问题。
六、ArrayList和LinkedList性能比较
1.ArrayList做查询比较快,但是增删的时候比较满。当插入或删除元素时,还要涉及数组元素的移动等内存操作。
2.LinkedList做增删比较快,但是查询慢。LinkedList使用双向链表实现存储,形成一个按序号索引的线性结构,与数组存储的方式相比,按序号索引数据需要进行前向或后向遍历,但是插入数据的时候,只需要记录本项的前后项即可,所以插入较快,删除同样。
一、在Html中 列表一共分为三种:
(1)无序列表 :使用 ul 标签来创建,用 li 标签来表示列表项 (较常用)
<ul>
<li>结构</li>
<li>表现</li>
<li>行为</li>
</ul>
(2)有序列表 :使用 ol 标签来创建,用 li 标签来表示列表项
<ol>
<li>结构</li>
<li>表现</li>
<li>行为</li>
</ol>
(3)定义列表 :使用 dl 标签来创建,用 dt 标签来表示定义的内容 ,dd 标签来对内容进行解释说明
<dl>
<dt>YYDS</dt>
<dd>yyds是“永远的神”的缩写 [1] ,常被粉丝用来赞赏自己的爱豆 </dd>
<dt>XSWL</dt>
<dd>XSWL = 笑死我了”,作为当代沙雕青年,每天除了哈哈哈就是“窝窝头一块钱四个</dd>
</dl>
二、列表相互之间可以嵌套:
<ul>
<li>节日
<ol>
<li>中秋</li>
<li>国庆</li>
<li>元旦</li>
</ol>
</li>
<li>中国</li>
<li>世界</li>
</ul>
三、网页展示:
网页效果展示
HTML中,标签可以包含各种属性,用于定义标签的特性和行为。例如,img标签可以有src属性来指定要显示的图像的URL,a标签可以有href属性来指定链接的目标地址。通过获取标签的属性值,我们可以获取到这些额外的信息,然后根据需要进行处理。
定义方法
/**
* 提取富文本字符串某个标签的所有属性
* @param {String} str 要提取的html富文本
* @param {Object} tagName 要提取的标签名称
* @param {Object} attrName 要提取的属性名称
* @returns {Array} list 属性列表
*/
function getStrTagAttribute(str,tagName,attrName){
let attributeList = []
const re = new RegExp(`<${tagName} [^>]*${attrName}=['"]([^'"]+)[^>]*>`,'g')
str.replace(re, (match, capture) => {
attributeList.push(capture);
});
return attributeList;
}
使用方法
*请认真填写需求信息,我们会在24小时内与您取得联系。