java高级部分(二)-(集合一)
对象数组
对象数组:可以存储对象的数组
需求:有5个学生,5个学生有自己的姓名,年龄,遍历当前学生数组,获取到每一个学生的信息
1)自定义类:Student name,age
2)在测试类中:创建一个数组,可以存储Stduent类型的
3)根据的提供长度,分别创建5个具体的学生对象
4)赋值并且遍历
集合
集合的由来?
面向对象语言对事物的描述是通过对象体现的,那么需求需要来存储多个对象.
要存储多个对象,不能使用基本类型的变量,需要使用容器类型的变量? 学习过哪些容器变量? 数组 ,字符串缓冲区(StringBuffer)
对于字符串缓冲区来说,在内存中始终存储的是字符串,不能满足要求;数组呢,数组的长度是固定的,不符合长度编号的要求,所
以Java提供了一个
Collection 集合;
集合:Collection:有两个子接口,两个子接口分别对应多个子实现类,多个集合数据结构不同,但是他们有共性内容,将共性内容
抽取出来,就可以集合继承体系图!
数据结构:数据的存储方式
Collection:
Collection 是层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口,更具体的实现类
添加功能:
boolean add(Object e)
删除功能:
void clear() :删除集合中所有元素(暴力删除)
boolean remove(Object o):删除集合中的指定元素
判断功能:
boolean contains(Object o):集合中是否包含指定的元素
获取功能:
int size() :获取集合中的元素数
boolean retainAll(Collection c) :交集功能: A集合对B集合取交集元素 :思考
boolean 表达的是什么意思,交集的元素是去A集合还是去B集合中
boolean removeAll(Collection c):删除一个集合中所有元素: 思考: 删除一个元素算是删除还是删除所有算是删除?
转换功能:
Object[] toArray() :将集合转换成数组
import java.util.ArrayList;
import java.util.Collection;
public class CollectionToArrayDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("Hello");
c.add("World");
c.add("java");
Object[] j=c.toArray();
System.out.println(c);
for(int i=0;i<j.length;i++) {
System.out.println(j[i]+"------"+j.length);
}
System.out.println("------------------------");
for(int i =0;i<j.length;i++) {
String s=(String)j[i];
System.out.println(s+"-------"+s.length());
}
}
}
Colleciton的集合的高级功能:
boolean addAll(Collection c) :添加一个集合中的所有元素
boolean removeAll(Collection c):删除的高级功能(思考:删除一个算是删除还是删除所有算是删除?)
boolean containsAll(Collection c):包含所有元素算是包含,还是包含一个算是包含
交集:
boolean retainAll(Collection c):A集合对B集合取交集,交集的元素到底是去A集合还是去B集合中,返回值boolean
表达什么意思?
Iterator iterator() :集合的迭代器方法(获取集合的迭代器)
集合的专有遍历方式:迭代器遍历
Iterator :接口中有以下的方法:
boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false
Object next()返回迭代的下一个元素。
存储String类型的元素
存储自定义对象并遍历(使用专有遍历方式)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("Hello");
c.add("World");
c.add("javee");
Iterator i=c.iterator();
while(i.hasNext()) {
String s=(String)(i.next());
System.out.println(s+"----"+s.length());
}
}
}
注意:
1)it.next(),只使用一次即可,使用多次,会出现问题(it.next(),每次使用的时候都是返回一个对象)
2)遍历的时候使用的while循环,一般不使用for循环
Collection有两个子接口:List Set
List集合的特点:
有序的 (存储和取出一致),可以允许重复元素
Set集合的特点:
无序性(不能保证迭代的顺序,基于hashMap),并且元素不能重复
List集合的特有功能:
添加功能
void add(int index,Object element):在指定位置处添加指定元素
获取功能
Object get(int index)返回列表中指定位置的元素。
ListIterator listIterator():列表迭代器
删除功能:
Object remove(int index):删除指定位置处的元素
修改功能:
Object set(int index, Object element):用指定element元素替换掉指定位置处的元素
ListIterator listIterator():列表迭代器 (List集合的专有迭代遍历:列表迭代器)
ListIterator接口中:
boolean hasNext() :判断是否有下一个可以迭代的元素(正向遍历)
Object next():获取下一个元素
boolean hasPrevious():判断是否有上一个可以迭代 元素(逆向遍历)
Object previous():返回上一个元素
注意:
逆向迭代(遍历),单独使用没意义,前提,要先正向遍历
使用List集合存储自定义对象并遍历:
方式一:size()和get(int index):相结合 方式二:普通for循环的方式
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListDemo3 {
public static void main(String[] args) {
List l=new ArrayList<>();
l.add("Hello");
l.add("World");
l.add("java");
//方式一
ListIterator it=l.listIterator();
while(it.hasNext()) {
if("World".equals((String)it.next())) {
it.add("wang");
}
}
System.out.println(l);
System.out.println("-----------");
for(int i=0;i<l.size();i++) {
if("World".equals(l.get(i))) {
l.add("zhao");
}
}
System.out.println(l);
}
}
需求:
有一个集合,如下List,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"wang"元素,请写代码实现
假设:List集合的元素:"hello","world","java".
按照正常的思路:完成了需求,发现出现异常:
java.util.ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
产生的原因:按照正常的需求,给集合添加元素,遍历,遍历同时,判断集合中是否有需要的元素,有就添加新元素,
遍历的时候,使用迭代器遍历,但是添加元素,使用集合添加元素.
集合添加了一个新的元素,迭代器不知道...
使用迭代器遍历元素,不能使用集合添加元素!
解决方案:
方式1:要么使用迭代器遍历,使用迭代器添加元素!
方式2:要么使用集合遍历,使用集合添加元素!
并发
并行
两种方式实现:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListDemo3 {
public static void main(String[] args) {
List l=new ArrayList<>();
l.add("Hello");
l.add("World");
l.add("java");
//方式一
ListIterator it=l.listIterator();
while(it.hasNext()) {
if("World".equals((String)it.next())) {
it.add("wang");
}
}
System.out.println(l);
System.out.println("-----------");
for(int i=0;i<l.size();i++) {
if("World".equals(l.get(i))) {
l.add("zhao");
}
}
System.out.println(l);
}
}
List集合有三个子实现类:
ArrayList
底层数据结构式数组结构,查询块,增删慢
从内存角度考虑:线程不安全的,不同步的,执行效率高
多线程:synchronized :同步的意思 解决线程安全问题
sychronized(锁对象){ 同步代码
共享数据;
}
解决线程安全问题,通过同步可以解决,但是效率低了...
LinkedList:
底层数据结构式链表结构,查询慢,增删块
从内存角度考虑:线程不安全,不同步,执行效率高
Vector:
这是一个线程安全的类,
底层数据结构是数组:查询快,增删慢
线程安全的,同步,执行效率低!
上一篇: Class & Struct 的 NSCoding 一种较好的实现思路
下一篇: 集合一些方法陷阱
推荐阅读