List接口继承自Collection接口,自身具有三大特点:

1.有序集合:存入和取出的顺序一致;

2.此接口的用户可以对每个元素插入位置进行精确控制:可以通过索引操作元素

3.可以存储重复元素

List接口的特有方法:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; /*List接口的特有方法:
* 1)add()添加元素
* 2)remove()删除元素
* 3)get()获得元素
* 4)set() 修改元素
* 5) listIterator()迭代器*/
public class Demo3 {
public static void main(String[] args) {
addfun();
removefun();
getfun();
setfun();
listiteratorfun();
} private static void listiteratorfun() {
List<String> list = fun();
ListIterator<String> it =list.listIterator(1);//从列表的指定位置开始迭代;
while (it.hasNext()) {
String next = it.next();
System.out.println(next);
/*world
love
java*/
}
} private static void setfun() {
List<String> list = fun();
System.out.println(list);//[hello, world, love, java]
list.set(1,"abc");//用指定的元素“abc”替换列表中指定位置的元素
System.out.println(list);//[hello, abc, love, java]
} private static void getfun() {
List<String> list = fun();
System.out.println(list);//[hello, world, love, java]
String s = list.get(3);//get()获得指定下标位置的元素
System.out.println(s);//java
} private static void removefun() {
List<String> list = fun();
System.out.println(list);//[hello, world, love, java]
list.remove(1);//remove()删除列表中指定位置的元素
System.out.println(list);//[hello, love, java]
} private static void addfun() {
List<String> list=fun();
System.out.println(list);//[hello, world, love, java]
list.add(1,"abc");//add();插入一个元素到指定位置
System.out.println(list);//[hello, world, love, java]
} private static List<String> fun() {
//创建新建集合方法,,返回集合对象
List<String> li=new ArrayList<>();//List是接口,所以只能通过子类创建对象,这里使用ArrayList类创建
li.add("hello");
li.add("world");
li.add("love");
li.add("java");
return li;
}
}

List集合遍历有三种遍历方式:迭代器遍历;普通for循环遍历,增强for循环遍历;

List接口的数据存储结构:List的众多子类数据元素所采用的结构方式是不一样的,

  数据存储通常结构有:堆栈,队列,数组,链表;

堆栈:先进后出     就像一个死胡同,后面进来的人先出去,先进来的人最后出去,

队列:先进先出     就像一个胡同,两边都通,只能从一边进,另一边出,先进去的人先出去,后边的人才能出去;

链表:(链表分为单链表和双链表,这里用单链表举例)链表中的数据是以节点来表示的,每一个节点由两部分组成,一部分存指针,另一部分存储数据,指针指向上一个节点的地址。查找的时候速度慢,增删的时候,直接操作地址,速度块

数组:通过索引查找,长度固定,增删慢

List接口由两个子类,分别是LinkedList类,ArrayList类,

ArrayList类采用数组结构存储方式,有索引,所以查找快,增删慢,线程不安全,运行速度快;

ArrayList方法前面已经写过了,这里主要写LinkedList的方法;

LinkedList类采用双向循环链表存储结构,没有索引,查找慢,增删快,线程不安全,运行速度快;

LinkedList特有方法:

package com.zs.Demo;

import java.util.LinkedList;

/*LinkedList中由大量首尾操作的方法
* 1)添加元素:addFirst() 将指定元素插入此列表的开头
* addLast() 将指定元素插入此列表的结尾
* offerFirst() 在此列表的开头插入指定的元素
* offerLast() 在此列表的结尾插入指定的元素
* 2)增删元素:removeFirst() 移除并返回此列表的第一个元素
* removeLast() 移除并返回此列表的最后一个元素
* pollFirst() 获取并移除此列表的第一个元素;如果列表为空,则返回null。
* pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回null。
* 3)获取元素:getFirst() 返回此列表的第一个元素
* getLast() 返回此列表的最后一个元素
* pollFirst() 获取并移除此列表的第一个元素;如果列表为空,则返回null。
* pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回null。
* 4)栈操作: push() 将元素推入此列表表示的堆栈。
* pop() 从此列表表示的堆栈出弹出一个元素。
* peek() 获取但不移除此列表的头(第一个元素)*/
public class LinkedListDemo {
public static void main(String[] args) {
//添加方法
addDemo();
//增删元素
insertAndDelete();
//获取元素
getDemo();
//栈操作
StackDemo();
} private static void StackDemo() {
LinkedList<String> li=new LinkedList<>();
li.push("a");//push()方法将一个元素推入堆栈
System.out.println(li);//[a]
li.push("b");
li.push("c");
li.push("d");
System.out.println(li);//[d, c, b, a]a最先进来,排在最后面
// 可以看出堆栈中元素,push把元素不断往后推,进来越早越往后,这就是堆栈的先入后出
String s1 = li.pop();//弹出堆栈中最后进去的元素(先入后出,后入先出)
System.out.println(s1);//d
System.out.println(li);//[c, b, a] 可以看出d被弹出堆栈
String s2 = li.peek();//获取但不移除此列表的头
System.out.println(s2);//c
System.out.println(li);//[c, b, a] 列表头没有被移除
} private static void getDemo() {
LinkedList<String> li=new LinkedList<>();
li.add("a");
li.add("b");
li.add("c");
System.out.println(li);//[a, b, c]
String s = li.getFirst();
System.out.println(s);//a
String last = li.getLast();
System.out.println(last);//c
// pollFirst/Last()在增删方法中测试
} private static void insertAndDelete() {
LinkedList<String> li=new LinkedList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
System.out.println(li);//[a, b, c, d]
String s = li.removeFirst();//删除并返回头元素给s
System.out.println(s);//a
System.out.println(li);//[b, c, d]
String s1 = li.removeLast();
System.out.println(s1);//d
System.out.println(li);//[b, c]
String s2 = li.pollFirst();
System.out.println(s2);//b
System.out.println(li);//[c]
String s3 = li.pollLast();
System.out.println(s3);//d
System.out.println(li);//[]为空
String s4 = li.pollFirst();
System.out.println(s4);//null
} private static void addDemo() {
LinkedList<String> li=new LinkedList<>();
li.add("b");
System.out.println(li);//[b]
li.addFirst("a");//添加头元素
li.addLast("c");//尾部添加元素
System.out.println(li);//[a, b, c]
li.offerFirst("Z");//头部添加元素
li.offerLast("d");//尾部添加元素
System.out.println(li);//[Z, a, b, c, d]
}
}

Java学习笔记22(List接口)的更多相关文章

  1. Java学习笔记之---比较接口与抽象类

    Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...

  2. 【Java学习笔记】Map接口的子接口---TreeMap

    TreeMap,与TreeSet类似,可以对集合中的元素进行排序,同时保持元素的唯一性. 应注意,Comparable(实现接口,记得覆盖comparaTo方法),Comparator的使用. imp ...

  3. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  4. java学习笔记——Collection集合接口

    NO 方法名称 描述 1 public boolean add(E e) 向集合中保存数据 2 public void clear() 清空集合 3 public boolean contains(O ...

  5. Java学习笔记-抽象类与接口

    抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...

  6. Java学习笔记(十)面向对象---接口

    理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...

  7. java学习笔记(1)——有关接口

    接口: interface intf0{ public void doSomething(); } interface intf1{ public void doAnything(); } class ...

  8. Java学习笔记:03面向对象-接口_多态

    1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...

  9. Java学习笔记22(Date类、DateFormat类)

    Date,时间和日期类,这里讲util包中的而不是sql包中的 Date:表示特定的时间瞬间,精确到毫秒(1000毫秒=1秒) 时间和日期的操作都基于毫秒值 时间原点:1970年1月1日,0时0分0秒 ...

随机推荐

  1. 『计算机视觉』Mask-RCNN_推断网络其五:目标检测结果精炼

    一.Detections网络 经过了ROI网络,我们已经获取了全部推荐区域的信息,包含: 推荐区域特征(ROIAlign得到) 推荐区域类别 推荐区域坐标修正项(deltas) 再加上推荐区域原始坐标 ...

  2. js定义类

    以下是es5标准里定义类的方法: function Point(x,y){ this.x=x; this.y=y; } Point.prototype.toString=function(){ ret ...

  3. 笔记react router 4(三)

    上一篇我们说到了路由组件的嵌套.想必你已经运用自如了.那么,这一次我们来聊一聊4.X中Router的变更. 在3.X中我们若使用路由的模式,可通过在Router上配置history的值即可. 例如, ...

  4. Convert PIL Image to byte array?

    1.import io img = Image.open(fh, mode='r') roiImg = img.crop(box) imgByteArr = io.BytesIO() roiImg.s ...

  5. Leetcode 1004. 最大连续1的个数 III

    1004. 最大连续1的个数 III  显示英文描述 我的提交返回竞赛   用户通过次数97 用户尝试次数143 通过次数102 提交次数299 题目难度Medium 给定一个由若干 0 和 1 组成 ...

  6. python 小练习4

    给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个连续子序列,使其和最大,输出最大子序列的和. 例如,对于L=[2,-3,3,50], 输出53(分析:很明显,该列表最大连续子序 ...

  7. spring xml的配置

                    Spring xml文档头得配置 spring文档头一般是可以复制过来得,刚学习得时候一直看网上有没有配置,然后也没有找到,希望以下过程得学习可以给大家带来帮助!! 1 ...

  8. jquery ready&&load用法

    ready和load那一个先执行 DOM文档加载的步骤 (1) 解析HTML结构 (2) 加载外部脚本和样式表文件 (3) 解析并执行脚本代码 (4) 构造HTML DOM模型 //ready (5) ...

  9. js匀速运动

    匀速运动      封装匀速运动原理:设置定时器,将传入的ele,设定一个速度,使用定时器获取当前时间的一个位置,加上速度值,给回节点,当节点到达目标位置,判断给他清除定时器. 匀速效果地址:http ...

  10. struts访问

    struts基本工程结构: 1. struts.xml支持语法提示;2. struts.xml配置常量, 用来覆盖struts.properties中的默认常量配置  一般情况下, 这个配置放在str ...