|

来自网络
一、为何需要集合?
原来的数组不能够满足需求,存在以下问题:
1)长度开始时必须指定,而且一旦指定,不能更改
2)保存的必须为同一类型的元素
3)使用数组进行增加/删除元素时(扩容时)比较麻烦 二、集合的好处
1)可以动态保存任意多个对象,使用比较方便!
2)提供了一系列方便的操作对象的方法:add、remove、set、get等
3)使用集合添加,删除新元素的示意代码-简洁了

List&Set,他们的实现子类都是单列集合,用add添加元素

Map接口的实现子类是双列集合,存放的K-V,用put添加元素
//1.集合主要是两组(单列集合,双列集合)
//2. Collection 接口有两个重要的子接口 List Set,他们的实现子类都是单列集合
//3. Map接口的实现子类是双列集合,存放的K-V
代码示例
ArrayList al=new ArrayList();
al.add("andy");
al.add("boy");
HashMap hm=new HashMap();
hm.put("andy", 15);
hm.put("boy", 18);-------------------------------------------------分割线---------------------------------------------
Collection接口和常用方法
public interface Collection<E> extends Iterable<E> Collection接口实现类的特点
1)collection实现子类可以存放多个元素,每个元素可以是Object
2)有些Collection的实现类,可以存放重复的元素,有些不可以
3)有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
4) Collection接口没有直接的实现子类,是通过它的子接口Set 和 List 来实现的

//演示Collection接口中存在的方法,需要用其实现类演示。说明:以ArrayList实现类来演示
public class CollectionMethods {
public static void main(String[] args) {
List list=new ArrayList();
//add :添加单个元素
list.add(&#34;andy&#34;);
list.add(16);
list.add(true);
System.out.println(&#34;list=&#34;+list);//list=[andy, 16, true]
//remove:删除指定元素
String str=(String)list.remove(0);//按下标删除元素,删除了&#34;andy&#34;
System.out.println(str);
list.remove(true);
System.out.println(&#34;list=&#34;+list);
//contains:查找元素是否存在
list.add(&#34;first&#34;);
System.out.println(list.contains(&#34;first&#34;));//true
//size:获取元素个数
System.out.println(list.size());//2
//isEmpty:判断是否为空
System.out.println(list.isEmpty());//false
//clear:清空
// list.clear();
// System.out.println(&#34;list=&#34;+list);
//addAll:添加多个元素
List myList=new ArrayList();
myList.add(&#34;apple&#34;);
myList.add(&#34;google&#34;);
myList.add(&#34;pdd&#34;);
list.addAll(myList);
System.out.println(&#34;list=&#34;+list);//list=[16, first, apple, google, pdd]
//containsALl:查找多个元素是否都存在
System.out.println(list.containsAll(myList));//true
//removeAll:删除多个元素
list.removeAll(myList);
System.out.println(&#34;list=&#34;+list);//list=[16, first]
Iterator iterator=list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());//逐个元素遍历
}
}
}
迭代器遍历
因为Collection接口继承了Iterable接口,而该接口中存在迭代器实例,Iterator,在遍历实现了Collection接口的集合类元素时,可以获取该迭代器。

1) lterator对象称为迭代器,主要用于遍历Collection集合中的元素。
2)所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了lterator接口的对象,即可以返回一个迭代器。
4)Iterator仅用于遍历集合,Iterator本身并不存放对象。
Iterator的结构如下图

Iterator iterator=list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());//逐个元素遍历
}增强for循环底层是调用迭代器,是一种简化写法:
//增强for循环,可以用到集合上,底层仍然是迭代器
//增强for循环可以理解成简化版的迭代器
for(Object book:arrayList) {
System.out.println(&#34;book=&#34;+book);
}
//增强for循环也可以用在打印数组元素上
int[] arr={1,2,3,4,5};
for(int i:arr) {
System.out.println(i);
}迭代器遍历集合元素的方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectioonIterator {
public static void main(String[] args) {
Collection arrayList = new ArrayList();
arrayList.add(new Book(&#34;三国&#34;, &#34;罗贯中&#34;, 23.4));
arrayList.add(new Book(&#34;水浒&#34;, &#34;施耐庵&#34;, 20.4));
arrayList.add(new Book(&#34;西游记&#34;, &#34;吴承恩&#34;, 21.4));
arrayList.add(new Book(&#34;石头记&#34;, &#34;曹雪芹&#34;, 22.4));
System.out.println(&#34;集合:&#34;+arrayList);//会打印集合中三个元素的地址,而不是值
Iterator iterator=arrayList.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//增强for循环,可以用到集合上,底层仍然是迭代器
//增强for循环可以理解成简化版的迭代器
for(Object book:arrayList) {
System.out.println(&#34;book=&#34;+book);
}
//增强for循环也可以用在打印数组元素上
int[] arr={1,2,3,4,5};
for(int i:arr) {
System.out.println(i);
}
}
}
class Book{
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return &#34;书名:&#34;+name+&#34;作者:&#34;+author+&#34;价格:&#34;+price;
}
}----------------------------------------------分割线----------------------------------------------------
上面是Collection接口的方法,是List和Set的共有方法,下面分别介绍List和Set的特有方法。

List
List集合类(Vector(已过时、线程安全集合)、ArrayList、LinkedList)中元素有序,即添加顺序和取出顺序一致,且可以重复。
public class ListDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add(&#34;andy&#34;);
list.add(&#34;boy&#34;);
list.add(&#34;cat&#34;);
list.add(&#34;dog&#34;);
System.out.println(&#34;结果:&#34;+list);//和添加顺序一致,结果:[andy, boy, cat, dog]
//list集合中的每个元素都有其对应的顺序索引,索引从0开始
System.out.println(list.get(3));//dog
}
}

代码示例:
import java.util.List;
import java.util.ArrayList;
public class ListDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add(&#34;andy&#34;);
list.add(&#34;boy&#34;);
list.add(&#34;cat&#34;);
list.add(&#34;dog&#34;);
System.out.println(&#34;结果:&#34;+list);//和添加顺序一致,结果:[andy, boy, cat, dog]
//list集合中的每个元素都有其对应的顺序索引,索引从0开始
System.out.println(list.get(3));//dog
//如果没有指定下标,默认插入在最后
list.add(1,&#34;zoom&#34;);//
System.out.println(&#34;结果:&#34;+list);
List list2=new ArrayList();
list2.add(&#34;apple&#34;);
list2.add(&#34;ibm&#34;);
list2.add(&#34;ebay&#34;);
list2.addAll(list2);//如果没有指定下标,默认插入在最后
System.out.println(&#34;结果:&#34;+list);
List list3=new ArrayList();
list3.add(&#34;mask&#34;);
list3.add(&#34;pony&#34;);
list3.add(&#34;robin&#34;);
list.addAll(1,list3);//在指定下标添加一个集合的元素
System.out.println(&#34;结果:&#34;+list);
System.out.println(list.get(3));
System.out.println(list.remove(4));//删除指定下标的元素并返回
list.set(0, &#34;mary&#34;);//替换下标元素,下标需要存在,否则报错
System.out.println(&#34;结果:&#34;+list);
List sub =list.subList(0, 3);
System.out.println(&#34;结果:&#34;+sub);
}
}List接口实现类的遍历方式

ArrayList的底层结构和源码分析
(1)可以存放null
(2)底层用数组实现存储,类似于“数据结构之动态泛型数组”中的那样,链接
渔舟唱晚:数据结构之动态泛型数组(java实现)
(3)ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高).在多线程情况下,不建议使用ArrayList,可以考虑使用Vector
ArrayList的源码分析

Vector介绍

Vector和ArrayList的底层区别

LinkedList的介绍
LinkedList的全面说明
1)LinkedList底层实现了双向链表和双端队列特点
2)可以添加任意元素(元素可以重复),包括null
3)线程不安全,没有实现同步

LinkedList源码分析
略
ArrayList和LinkedList比较

---------------------------分割线----------------------------
Set接口介绍
(1)无序(添加元素和取出的顺序不一致,但每次打印出的结果是固定的,虽然和添加顺序不一致),不能通过索引取数据
(2)集合中不存在重复元素,所以最多包含一个null
(3)JDK API中Set接口的实现类有:HashSet、TreeSet、LinkedHashSet

常用方法

代码演示

常用方法:

--------------------------------------------------分割线-------------------------------------
HashSet介绍

------------------------------------------------------------分割线------------------------------------
LinkedHashSet介绍

未完待续。。。 |
|