Java–集合
一.集合由来
a.数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,。
b.java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加。
二.集合和数组的区别
区别1 :
- 数组既可以存储基本数据类型,又可以存储引用数据类型
- 集合只能存储引用数据类型(对象)
- 集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
区别2: - 数组长度是固定的,不能自动增长
- 集合的长度的是可变的,可以根据元素的增加而增长
三.使用场景
- 如果元素个数是固定的推荐用数组
- 如果元素个数不是固定的推荐用集合
四.集合继承体系图
**
**
五.基本方法演示
注意: 以ArrayList为例进行演示,LinkedList用法完全一致,只是使用场景不一样.
package CSDN;
import java.io.IOException;
import java.util.ArrayList;
public class Entrance {
public static void main(String[] args) throws IOException {
//生成集合
ArrayList<Person> list1 =new ArrayList<>();
Person p1=new Person();
Person p2=new Person();
//添加元素
list1.add(p1);
list1.add(p1);
list1.add(p1);
//删除元素(如果有相同元素那么会删除第一次添加的元素)
list1.remove(p1);
System.out.println(list.size());
ArrayList<Person> list2 =new ArrayList<>();
list2.add(p2);
list2.add(p2);
list2.add(p2);
//boolean addAll(Collection c);
list1.addAll(list2); //将list2的元素添加到list1中 list2不变
//boolean removeAll(Collection c);
list1.removeAll(list2) //删除掉list1中和list2相同的元素,也是通过equals方法比较 list2不变
//boolean containsAll(Collection c);
list1.containsAll(list2); //判断list1是否包含list2全部的元素
//boolean retainAll(Collection c);
list1.retainsAll(list2); //删除掉
}
}
class Person{
int age=18;
}
1.remove方法在底层是怎样删除元素的?
p2和list集合中的每个元素比较
p2.equals(第一个元素)
p2.equals(第二个元素)。p2会去调用Object中的equals方法和集合中的每个元素进行比较
//假设p2.eaquals();
//每次调用的是p2的equals方法 传入的是集合中的元素
void equals(Object obj){
return(this==obj)
}
//== 当连接基本数据类型时候是比较俩个数的大小,但是当它连接俩个对象时是来判断俩个对象的地址是否相同。
//我们也可以复写equasl方法去达到你的要求。 假如我们希望俩个对象的年龄相同就是同一个对象就可以这样写
public boolean equals(Object obj){
Person p=(Person)obj;
return (this.age==p.age);
}
六.集合的遍历
①转化为数组进行遍历
代码如下:
import java.util.ArrayList;
public class Entrance {
public static void main(String[] args) {
ArrayList<Person> coll=new ArrayList<>();
coll.add(new Person("张三",24));
coll.add(new Person("李四",24));
coll.add(new Person("王五",24));
coll.add(new Person("赵六",24));
//JDK中 集合的toArray返回的是一个Object数组
Object [] arr=coll.toArray();
for(int i=0;i<arr.length;i++){
//arr[i]为Object类型所以需要向下转型才可以找到Person的特有方法
Person s =(Person) arr[i];
System.out.println(s.getName()+","+s.getAge());
}
}
}
class Person{
int age=18;
String name;
Person(String name,int age){
this.age=age;
this.name=name;
}
public boolean equals(Object obj){
Person p=(Person)obj;
return this.age==age;
}
String getName(){
return name;
}
int getAge(){
return age;
}
}
②迭代器遍历
代码如下:
import java.util.ArrayList;
import java.util.Iterator;
public class Entrance {
public static void main(String[] args) {
ArrayList<Person> coll=new ArrayList<>();
coll.add(new Person("张三",24));
coll.add(new Person("李四",24));
coll.add(new Person("王五",24));
coll.add(new Person("赵六",24));
//这里需要一个泛型 由于iterator.hasNext返回的是Object导致Person中的方法就会访问不到
Iterator<Person> iterator=coll.iterator();
//iterator.hasNext() 返回true就会继续进行打印
while (iterator.hasNext()){
System.out.println(iterator.next().getName());
}
}
}
class Person{
int age=18;
String name;
Person(String name,int age){
this.age=age;
this.name=name;
}
public boolean equals(Object obj){
Person p=(Person)obj;
return this.age==age;
}
String getName(){
return name;
}
int getAge(){
return age;
}
}
注意:如果需要更改集合的结构,要调用迭代器的方法,否则会抛出
ConcurrentModificaitionException异常。
③for-each遍历
内部的实现也是迭代器,所以也请注意ConcurrentModificationException
import java.util.ArrayList;
public class Entrance {
public static void main(String[] args) {
ArrayList<Person> coll=new ArrayList<>();
coll.add(new Person("张三",24));
coll.add(new Person("李四",24));
coll.add(new Person("王五",24));
coll.add(new Person("赵六",24));
for(Person unit:coll){
System.out.println(unit.getName());
}
}
}
class Person{
int age=18;
String name;
Person(String name,int age){
this.age=age;
this.name=name;
}
public boolean equals(Object obj){
Person p=(Person)obj;
return this.age==age;
}
String getName(){
return name;
}
int getAge(){
return age;
}
}
七.ArrayList和LinkedList场景使用区别
LinkedList经常用在增删操作较多而查询操作很少的情况下,ArrayList则相反。