目录
对象数组
即数组元素为对象
三个对象
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);Student s3 = new Student("王五", 25);
Student[] students = {s1, s2, s3};
for (int i = 0; i < students.length; i++) {
Student student = students[i];
System.out.println(student.getName() + "====" + student.getAge());
}
数组特点: 数组一旦定义好的长度是固定。遍历数组的途中,我不能增删数组中的元素。所以数
组作为就不太方便
Java考虑到,让我们更加方便的去操作容器中的元素,给我们提供了另外一种容器,叫做集合
数组和集合的区别
1.数组的长度是固定的,集合的长度是可变的。
2.数组既可以存储基本数据类型的元素,也可以存储引用数据类型的元素。
集合只能存储引用数据类型的元素。
3.数组中只能存储同一种数据类型的元素。
集合可以存储任意数据类型的元素。
集合
Collection集合
添加功能
1.boolean add(Object obj):添加一个元素
Collection collection = new ArrayList(); //多态
boolean aaa = collection.add("aaa");
collection.add("bbb");
collection.add("ccc");System.out.println(aaa) //true
System.out.println(collection); //[aaa, bbb, ccc]
注意:集合只能存储引用数据类型的元素。
collection.add(num); //Integer 自动装箱
collection.add(3.25);//Double
collection.add(Boolean.valueOf(false));
collection.add(true);
2.boolean addAll(Collection c):添加一个集合的元素 (给一个集合添加进另一个集合中的所有元素)
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");Collection c2 = new ArrayList();
c2.add(100);
c2.add(200);
c2.add(300);boolean b = c1.addAll(c2);
System.out.println(b); //true
System.out.println(c1); //[aaa, bbb, ccc, 100, 200, 300]
System.out.println(c2); //[100, 200, 300]
删除功能
1.boolean remove(Object o):移除一个元素
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");//删除集合中的某个元素
boolean b = c1.remove("aaa");
if (b) {
System.out.println(c1); // [bbb, ccc]
}
2.void clear():移除所有元素
//清空集合
c1.clear();System.out.println(c1); // []
3.boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb1");
c1.add("ccc1");
c1.add("ddd1");
c1.add("eee");
c1.add("fff");
Collection c2 = new ArrayList();c2.add("aaa");
c2.add("bbb");
c2.add("ccc");
c2.add("ddd");//c1 会删除掉两个集合的交集元素,c2的元素不影响。
boolean b = c1.removeAll(c2); //如果有交集元素被删除,返回true,没有交集元素被删除返回false
System.out.println(b); // trueSystem.out.println(c1); // [bbb1, ccc1, ddd1, eee, fff]
System.out.println(c2); // [aaa, bbb, ccc, ddd]
判断功能
1.boolean contains(Object o):判断集合中是否包含指定的元素
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb1");
c1.add("ccc1");
c1.add("ddd1");
c1.add("eee");
c1.add("fff");
//判断集合中是否有该元素
System.out.println(c1.contains("aaa5")); // falsec1.clear();
//判断结合是否为空
System.out.println(c1.isEmpty()); // true
2.boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");
c1.add("ddd");
c1.add("eee");
c1.add("fff");
Collection c2 = new ArrayList();c2.add("aaa");
c2.add("bbb");
c2.add("ccc");
c2.add("ddd");
c2.add("555");//a集合.containsAll(b集合); 看a集合是否包含了所有b集合的元素,如果包含了返回true ,如果有一个没有包含就会false
boolean b = c1.containsAll(c2);
System.out.println(b); // false
获取长度
int size() //元素的个数
Collection c1 = new ArrayList();
c1.add("aaa");
c1.add("bbb");
c1.add("ccc");
c1.add("ddd");
c1.add("eee");
c1.add("fff");int size = c1.size();
System.out.println(size); //6
迭代器遍历集合元素
Iterator<E> iterator()
接口 Iterator<E> 对 collection 进行迭代的迭代器。
boolean hasNext() //如果仍有元素可以迭代,则返回 true。
E next() //返回迭代的下一个元素。
Iterator iterator = c1.iterator();
System.out.println(iterator); //java.util.ArrayList$Itr@1b6d3586while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
为什么这个迭代器,设计成ArrayList的内部类?
内部类可以直接访问外部类的成员,包括私有成员。
内部类也就是这个迭代器,肯定要访问集合的元素,集合的元素,在ArrayList中还是用数组存的元素 ,内部类就可以遍历外部类维护的这个数组。
若元素为对象
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);Collection list = new ArrayList();
list.add(s1);
list.add(s2);
list.add(s3);
Iterator iterator = list.iterator(); //迭代器遍历
while (iterator.hasNext()) {
Student stu = (Student) iterator.next(); //向下转型
System.out.println(stu.getName() + "====" + stu.getAge());
}
集合转换为数组
常规做法
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);Collection list = new ArrayList();
list.add(s1);
list.add(s2);
list.add(s3);//把集合转换成数组。
Student[] arr = new Student[list.size()];Iterator iterator = list.iterator();
int index = 0;
while (iterator.hasNext()) {
Student stu = (Student) iterator.next();
arr[index++] = stu;
}
System.out.println(Arrays.toString(arr));
集合方法
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);Collection list = new ArrayList();
list.add(s1);
list.add(s2);
list.add(s3);Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects));
子接口——List集合
元素有序,并且每一个元素都存在一个索引,元素可以重复.
List特有功能
1. void add(int index,E element) //在指定索引处添加元素
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(0, "ddd");System.out.println(list); // [ddd, aaa, bbb, ccc]
2. E remove(int index) //移除指定索引处的元素 返回的是移除的元素
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.remove(0);System.out.println(list); //[bbb,ccc]
注意:若存的是Integer类型
List list2 = new ArrayList();
list2.add(100);
list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);list2.remove(0);
System.out.println(list2); // [200, 300, 400, 500]
//我想要200 表示的是元素
list2.remove(Integer.valueOf(200));System.out.println(list2); // [300, 400, 500]
3. E get(int index) //获取指定索引处的元素
List list2 = new ArrayList();
list2.add(100);
list2.add(200);
list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);//根据索引获取元素
Object o = list2.get(0);
System.out.println(o); //100
4. E set(int index,E element) //更改指定索引处的元素 返回的而是被替换的元素
List list2 = new ArrayList();
list2.add(100);
list2.add(200);
list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);Object oldEle = list2.set(0, 20000);
System.out.println(list2); // [20000, 200, 200, 300, 400, 500]
System.out.println(oldEle); // 100
5. int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
List list2 = new ArrayList();
list2.add(100);
list2.add(200);list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);int index = list2.indexOf(200);
System.out.println(index); // 1
6. int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
List list2 = new ArrayList();
list2.add(100);
list2.add(200);list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);int index = list2.lastIndexOf(200);
System.out.println(index); // 2
List遍历功能
for循环 size() get()
//若用父接口中的迭代器
List list2 = new ArrayList();
list2.add(100);
list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);Iterator iterator = list2.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
//for循环
List list2 = new ArrayList();
list2.add(100);
list2.add(200);
list2.add(300);
list2.add(400);
list2.add(500);for (int i = 0; i < list2.size(); i++) {
Object o = list2.get(i);
System.out.println(o);
}
// listIterator 正向 反向遍历
//正向
ListIterator listIterator = list2.listIterator();
System.out.println(listIterator);while (listIterator.hasNext()) {
Object next = listIterator.next();
System.out.println(next);
}//反向
ListIterator listIterator = list2.listIterator();
while (listIterator.hasNext()) {
Object next = listIterator.next();
System.out.println(next);
}
//反向迭代,注意:反向迭代之前,先正向迭代
while (listIterator.hasPrevious()) {
Object previous = listIterator.previous();
System.out.println(previous);
}
并发修改异常
需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合,会出现并发修改异常。
原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了
ArrayList list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("world");
list.add("ccc");ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
String ele = (String) listIterator.next();
if (ele.equals("world")) {
//list.add("javaee"); //集合的添加方法,会产生集合的并发修改异常
listIterator.add("javaee"); //迭代器自己的添加方法
}
第二种方式:普通for循环遍历集合
for (int i = 0; i < list.size(); i++) {
String ele = (String) list.get(i);
if (ele.equals("world")) {
list.add("hello");}
List子接口——ArrayList集合
特点:底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
1.ArrayList初始化为一个 空数组
2.ArrayList的Add操作不是线程安全的
3.ArrayList添加第一个元素时,数组的容量设置为 10
4.当ArrayList数组超过当前容量时,扩容至 1.5倍 (遇到计算结果为小数的,向下取
整),第一次扩容后,容量为15,第二次扩容至22
5.ArrayList在第一次和扩容后都会对数组进行拷贝,调用 Arrays.copyOf 方法。
遍历功能
普通for循环
ArrayList list = new ArrayList();
list.add(10);
list.add(50);
list.add(60);
list.add(20);
list.add(30);
list.add(50);for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
System.out.println(o);
}
forEach循环
list.forEach(new Consumer() {
@Override
public void accept(Object ele) {
System.out.println(ele);
}
});
排序功能
sort()
list.sort(new Comparator() {
@Override
public int compare(Object a, Object b) {
//System.out.println(a + "===" + b);
Integer x = (Integer) a;
Integer y = (Integer) b;
return x - y; //根据返回值的 正 负 0 进行了一个排序
}
});
System.out.println(list);
截取功能
subList() //截取一部分元素到新集合中,为SubList
ArrayList list = new ArrayList();
list.add(10);
list.add(50);
list.add(60);
list.add(20);
list.add(30);List list1 = list.subList(0, 2);
System.out.println(list1); // [10,50]
list1.add(600);
System.out.println(list1); // [10,50,600]
List子接口——Vector集合
特点:底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
特有功能
1. 添加 void addElement(E obj)
Vector vector = new Vector();
vector.add(100);
vector.addElement(600);
vector.addElement(200);System.out.println(vector); // [100,600,200]
2. 返回索引处元素 E elementAt(int index)
Vector vector = new Vector();
vector.add(100);
vector.addElement(600);
vector.addElement(200);Object o = vector.elementAt(1);
System.out.println(o); // 600
3. 返回第一个元素 E firstElement ()
Vector vector = new Vector();
vector.add(100);
vector.addElement(600);
vector.addElement(200);Object o1 = vector.firstElement();
System.out.println(o1); //100
4. 返回最后一个元素 E lastElement ()
Vector vector = new Vector();
vector.add(100);
vector.addElement(600);
vector.addElement(200);Object o2 = vector.lastElement();
System.out.println(o2); //200
5. 插入指定元素到指定位置 void insertElementAt(E obj, int index)
Vector vector = new Vector();
vector.add(100);
vector.addElement(600);
vector.addElement(200);vector.insertElementAt(300,1);
System.out.println(vector); // [100,300,600,200]
自带的迭代器 elements
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
Object o3 = elements.nextElement();
System.out.println(o3);
}
List子接口——LinkedList集合
特点:底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
特有功能
1. void addFirst(E e) 添加元素到头位置
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
System.out.println(linkedList); // [ccc,aaa,bbb]
2. void addLast(E e) 添加元素到末位置
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
linkedList.addLast("ddd");
System.out.println(linkedList); // [ccc,aaa,bbb,ddd]
3. E getFirst() 获取头元素
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
linkedList.addLast("ddd");
Object first = linkedList.getFirst();
System.out.println(first); // ccc
4. E getLast() 获取尾元素
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
linkedList.addLast("ddd");
Object last = linkedList.getLast();
System.out.println(last); // ddd
5. E removeFirst() 删除头元素
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
linkedList.addLast("ddd");
linkedList.removeFirst();
System.out.println(linkedList); // [aaa,bbb,ddd]
6. E removeLast() 删除尾元素
LinkedList linkedList = new LinkedList();
linkedList.add("aaa");
linkedList.add("bbb");
linkedList.addFirst("ccc");
linkedList.addLast("ddd");
linkedList.removeLast();
System.out.println(linkedList); // [ccc,aaa,bbb]
7. E poll () 和 E pop ()
调用poll() 和pop() 都可以返回队首元素并将其从原队列删除。
poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除
pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
contains注意
比的是地址值