黑马程序员——Java要点笔记——集合框架(List)

时间:2023-02-18 17:46:02

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Collection派系

day16 01-常用对象API(集合框架-概述)

1、集合是一个容器。

2、集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。

3、集合的特点:

         ①、用于存储对象的容器

         ②、集合的长度是可变的

         ③、集合中不可以存储基本数据类型,都是用的封装类,例如Integer

4、集合框架体系图

黑马程序员——Java要点笔记——集合框架(List)

day16 02-常用对象API(集合框架-体系&共性内容)

1、对于体系的学习:看顶层,用底层。顶层中的内容都是这一体系的共性内容。

Collection在集合框架中的位置:

黑马程序员——Java要点笔记——集合框架(List)

2、工具包:java.util      接口:Collection

         注意Collection是一个接口,里面全都是抽象方法。

3、Collection接口的常用方法

         (1)添加:

                   boolean add(Object  obj)——添加对象

                   boolean  addAll(Collection coll)——把集合里的元素全部添加进来

         (2)删除:(集合用的是remove,不是delete)

                   boolean remove(Object  obj)——删对象,若集合中有多个该对象,只删第一个

                   boolean removeAll(Collection coll)——删集合里重复的元素

                   void clear()——清空

         (3)判断

                   boolean contains(Object  obj)——包含对象

                   boolean containsAll(Collection  coll)——包含子集(包含coll中的所有元素),无顺序要求

                   boolean isEmpty()——判断集合中是否有元素

         (4)获取

                   int  size()——返回此Collection中的元素个数

                   Iterator iterator()——取出元素的方式:迭代器

         (5)其他

                   boolean retainAll(Collection  coll)——取交集

                   Object[] toArray()——将集合转成数组

day16 05-常用对象API(集合框架-Iterator迭代器使用)

1、Iterator接口在集合框架中的位置:

黑马程序员——Java要点笔记——集合框架(List)

2、java.util包——接口Iterator(迭代器)就三个方法

方法摘要

 boolean

hasNext()
          如果仍有元素可以迭代,则返回 true。

 E

next()
          返回迭代的下一个元素。

 void

remove()
          从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

2、代码示例——迭代器使用方法

public class Demo36 {
public static void main(String args[]){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
for(Iterator<String> it =al.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}

运行结果:abc1  abc2   abc3   abc4

3、特别说明:Iterator取完元素后,再next()就没用了。这时它就占着控件。为了用完它就释放它。我们在开发时一般不用while循环,而用for循环。

4、一个迭代器(以写一次“集合.iterator()”为一个)。观察以下两段代码:

代码示例1:

    public class Demo37 {
public static voidmain(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
Iterator<String> it1 = al.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
System.out.println(it1.next());
}
}

运行结果:abc1  abc2   abc3   abc4  

    Exception in thread "main" java.util.NoSuchElementException

代码示例2:

    public class Demo37 {
public static voidmain(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
Iterator<String> it1 = al.iterator();
Iterator<String>it2 = al.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
System.out.println(it2.next());
}
}

运行结果:abc1  abc2   abc3   abc4   abc1

day16 06-常用对象API(集合框架-迭代器的原理)

1、迭代器的实现其实是通过内部类完成的。迭代器必须依赖于容器,因为没一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。对于使用者而言,具体的实现不重要,只要通过融期货渠道该实现的迭代器对象即可,也就是iterator()方法。Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

day16 07-常用对象API(集合框架-List和Set的特点)

1、List和Set的位置

黑马程序员——Java要点笔记——集合框架(List)

2、Collection

       |

       |——List:①有序(存入和取出的顺序一致)②元素都有索引(角标)③与Set不同,    |          列表通常允许重复的元素

       |

       |——Set:①元素不能重复②无序(但是LinkedHashSet是有序的)

day16 08-常用对象API(集合框架-List集合的常见方法)

1、List特有的常用方法,有一个共性特点,就是都可以操作角标。

2、List集合的常见方法

①List集合的“增”

    void  add(index,element)——在指定角标插入元素

    boolean  addAll(Collection<? extends E> c)——添加C集合中的所有元素

    booleanaddAll(int index, Collection<? extends E> c)——在指定角标,添加C集合中的所有元素

②List集合的“删”

    Object  remove(index)——删除指定角标的元素,返回被删除的元素(我得知道,我删了谁)

③List集合的“改”

    Object  set(index,element)——更改指定角标的元素,返回被修改的元素(我得知道,我改了谁)

④List集合的“查”(获取)

    Object  get(index)——获取指定角标的元素

    int  indexOf(Object)——正向查找,获取指定元素的角标

    int  lastIndexOf(Object)——反向查找,获取指定元素的角标

    List  subList(from,to)——获取子集合,(包含头,不包含尾)

3、代码示例——List集合常用方法演示

public class Demo38 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
//添加元素
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println(list);//运行结果:[abc1, abc2, abc3]
//插入元素
list.add(1, "abc9");
System.out.println(list);//运行结果:[abc1, abc9, abc2, abc3]
//删除元素
System.out.println(list.remove(2));//运行结果:abc2
System.out.println(list);//运行结果:[abc1, abc9, abc3]
//修改元素
System.out.println(list.set(2,"abc0"));//运行结果:abc3
System.out.println(list);//运行结果:[abc1, abc9, abc0]
//获取元素
System.out.println(list.get(1));//运行结果:abc9
//获取子集合
System.out.println(list.subList(0, 2));//运行结果:[abc1, abc9]
}
}

4、add方法与addAll方法的区别(),其余的xx方法与xxAll方法也类似。观察以下两段代码。

代码示例1——add方法:

public class Demo39 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("A");
list1.add("B");
list1.add("C");

List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add(list1);

for(Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}

    运行结果:abc1  abc2   abc3   [A, B, C]

代码示例2——addAll方法

public class Demo39 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("A");
list1.add("B");
list1.add("C");

List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.addAll(list1);

for(Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}

    运行结果:abc1  abc2   abc3   A   B   C

5、集合也是一个对象,你add一个集合,相当于把这个集合作为一个整体、一个元素,加了进来。而addAll方法则是把这个集合中的每个元素一一加进来。

day16 09-常用对象API(集合框架-ListIterator)

1、ListIterator在集合框架中的位置

黑马程序员——Java要点笔记——集合框架(List)

2、List集合除了使用普通的迭代器Iterator之外,还可以使用功能更多的列表迭代器ListIterator。只有List集合能用列表迭代器!

3、ListIterator接口方法摘要,有色彩填充的为新增方法

方法摘要

 void

add(E e)
          将指定的元素插入列表(可选操作)。

 boolean

hasNext()
          以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

 boolean

hasPrevious()
          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

 E

next()
          返回列表中的下一个元素。

 int

nextIndex()
          返回对 next 的后续调用所返回元素的索引。

 E

previous()
          返回列表中的前一个元素。

 int

previousIndex()
          返回对 previous 的后续调用所返回元素的索引。

 void

remove()
          从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。

 void

set(E e)
          用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

 

day16 10-常用对象API(集合框架-List常用子类的特点)

1、List常用子类(3个),Vector、ArrayList、LinkedList在集合框架中的位置

黑马程序员——Java要点笔记——集合框架(List)

2、List集合常用的3个子类

(1)Vector:内部是数组数据结构(1.0就有了)。Vector是同步的。可变数组原理,100%延长。增删查询都很慢。

(2)ArrayList:内部是数组数据结构。ArrayList是不同步的。可变数组原理,50%延长。增删改查速度快。替代了Vector

(3)LinkedList:内部是链表数据结构。LinkedList是不同步的。增删元素速度非常快。

day16 12-常用对象API(集合框架-Vector集合)

1、Vector集合中,Enumation接口功能与Iterator接口的功能一模一样。此外,Iterator添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用Iterator接口,而不是Enumeration接口。

2、Enumeration接口

方法摘要

 boolean

hasMoreElements()
  测试此枚举是否包含更多的元素。

 E

nextElement()
  如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素

3、代码示例,演示Vector集合

public class Demo40 {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("abc1");
v.addElement("abc2");
v.add("abc3");
v.add("abc4");

System.out.println("------------以下使用Enumeration遍历-----------------");
for(Enumeration en =v.elements();en.hasMoreElements();){
System.out.println("nextelement:" + en.nextElement());
}

System.out.println("------------以下使用Iterator遍历-----------------");
for(Iterator it = v.iterator();it.hasNext();){
System.out.println("next:" + it.next());
}
}
}

    运行结果:

       ------------以下使用Enumeration遍历-----------------

       nextelement:abc1

       nextelement:abc2

       nextelement:abc3

       nextelement:abc4

       ------------以下使用Iterator遍历-----------------

       next:abc1

       next:abc2

       next:abc3

       next:abc4

day16 13-常用对象API(集合框架-LinkedList集合)

1、LinkedList(链表)常用方法

    void addFirst(E  e)——将指定元素插入该列表的开头

    void addLast(E  e)——将指定元素添加到此列表的结尾

    void add(int  index,E element)——将指定元素插入到指定位置

   

E  removeFirst()——移除并返回此列表的第一个元素

    E removeLast()——移除并返回此列表的最后一个元素

   

    E getFirst()——返回此列表的第一个元素

    E getLast()——返回此列表的最后一个元素

    E get(int index)——返回此列表中指定位置处的元素

   

    int indexOf(Object o)

day17 14-常用对象API(集合框架-LinkedList集合-练习(堆栈和队列))

1、面试题:请使用LinkedList来模拟一个堆栈或者队列数据结构。LinkedList适合用来实现堆栈与队列。

    堆栈:先进后出,后进先出

    队列:先进先出

2、代码示例——队列

class DuiLie {
private LinkedList link;
public DuiLie(){
link = new LinkedList();
}
//队列添加元素的功能
public void myAdd(Object obj){
link.addLast(obj);
}
//队列取出元素的功能、
public Object myGet(){
return link.removeLast();
}

public boolean isNull(){
return link.isEmpty();
}
}
public class LinkedTest{
public static void main(String args[]){
DuiLie dl = new DuiLie();
dl.myAdd("abc1");
dl.myAdd("abc2");
dl.myAdd("abc3");
dl.myAdd("abc4");
while(!dl.isNull()){
System.out.println(dl.myGet());
}
}
}

3、LinkedList类中的方法在java版本升级后有了些许变动:

    addFirst()

    addLast()

    在java1.6后

    offerFirst()

    offerLast()

 

    getFirst()//获取但不移除,如果链表为空,抛出NoSuchElementException

    getLast()

    在java1.6后

    peekFirst()//获取但不移除,如果链表为空,返回null

    peekLast()

 

    removeFirst()//获取并移除,如果链表为空,抛出NoSuchElementException

    removeLast()

    在java1.6后

    pollFirst()//获取并移除,如果链表为空,返回null

    pollLast()