集合框架(1)
概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。
和数组区别:
- 数组长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,集合只能存储引用类型
Collection体系集合
Collection父接口
特点:代表一组任意类型的对象,无序、无下标、不能重复。
方法:
- boolean add(0bject obj)//添加一个对象。
- boolean addAl1(Collection c)//将一个集合中的所有对象添加到此集合中。
- void clear()//清空此集合中的所有对象。
- boolean contains(0bject o)//检查此集合中是否包含o对象
- boolean equals(0bject o)//比较此集合是否与指定对象相等。
- boolean isEmpty()//判断此集合是否为空
- . boolean remove(Object o)//在此集合中移除o对象
- int size()//返回此集合中的元素个数。
- 0bject[] toArray ()//将此集合转换成数组。
package United;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
Collection接口的使用
1. 添加元素
2. 删除元素
3. 遍历元素
4. 判断
*/
public class Demo01 {
public static void main(String[] args) {
//创建集合
Collection a = new ArrayList();//有序的
//1. 添加元素
a.add("水果");
a.add("香蕉");
a.add("榴莲");
a.add("草莓");
System.out.println("元素的个数:"+a.size());
System.out.println(a);
//2. 删除元素
a.remove("香蕉");
System.out.println("元素的个数:"+a.size());
//3. 遍历元素 第一种:增强for循环 第二种:迭代器
for (Object b:a) {
System.out.println(b);
}
//hasNext();有没有下一个元素
//next();获取下一个元素
//remove();删除当前元素
//在迭代器的过程当中不能用其他的方法,如Collection
Iterator c = a.iterator();
while (c.hasNext()){
String d = (String) c.next();
System.out.println(d);
c.remove();
}
System.out.println("元素的个数:"+a.size());
//4. 判断
System.out.println(a.contains("西瓜"));
System.out.println(a.isEmpty());
}
}
创建一个学生类
package United;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name,int age){
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student["+"name:"+name+","+"age:"+age+"]";
}
}
package United;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
//Collection的使用:保存学生信息
public class Demo02 {
public static void main(String[] args) {
//新建Collection对象
Collection a = new ArrayList();
Student s1 = new Student("汪汪",12);
Student s2 = new Student("小王",14);
Student s3 = new Student("旺财",13);
//1. 添加数据
a.add(s1);
a.add(s2);
a.add(s3);
System.out.println("元素的个数:"+a.size());
System.out.println(a.toString());
//2. 删除
//a.remove(s1);
System.out.println("删除之后:"+a.size());
//a.clear();
System.out.println("清空之后:"+a.size());
//3.1 遍历 增强for循环
for (Object b:a) {
System.out.println(b);
}
System.out.println("===========================");
//3.2 迭代器循环
Iterator c = a.iterator();
while (c.hasNext()){
System.out.println(c.next().toString());
}
//4. 判断
System.out.println(a.contains(s1));
System.out.println(a.isEmpty());
}
}
List集合
特点:有序、有下标、元素可以重复。
方法:
- void add(int index,Object o) 在index位置插入对象o。
- boolean addAll(int index,Collection c) 将一个集合中的元素添加到此集合中的index位置。
- Object get(int index) 返回集合中指定位置的元素。
- List subList(int fromIndex,int toIndex) 返回fromIndex和toIndex之间的集合元素。
package United;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Demo03 {
public static void main(String[] args) {
//先创建集合对象
List a = new ArrayList();
//1. 添加元素
a.add("安安");
a.add("风扇");
a.add("吉他");
a.add(0,"华为");
System.out.println("元素个数:"+a.size());
System.out.println(a.toString());
//2. 删除元素
//a.remove("苹果");
//a.remove(0);
System.out.println("删除之后:"+a.size());
System.out.println(a.toString());
//3.1 增强for
for (Object b:a) {
System.out.println(b);
}
System.out.println("======================");
//3.2 for循环
for (int i = 0; i < a.size(); i++) {
System.out.println(a.get(i));
}
System.out.println("======================");
//3.3 迭代器循环
Iterator c = a.iterator();
while (c.hasNext()){
System.out.println(c.next());
}
System.out.println("======================");
//3.4 使用列表迭代器 ListIterator 和 Iterator的区别:ListIterator可以向前或向后遍历,添加、删除、修改元素
ListIterator d = a.listIterator();
while (d.hasNext()){
System.out.println(d.next());
}
//4. 判断
System.out.println(a.contains("华为"));
System.out.println(a.isEmpty());
//5. 获取位置
System.out.println(a.indexOf("安安"));
}
}
package United;
import java.util.ArrayList;
import java.util.List;
public class Demo04 {
public static void main(String[] args) {
//1. 创建一个集合
List a = new ArrayList();
//2. 添加数字数据(自动装箱)
a.add(20);
a.add(15);
a.add(10);
a.add(25);
a.add(30);
System.out.println("元素个数:"+a.size());
System.out.println(a.toString());
//3. 删除操作
a.remove(2);
a.remove((Object)20);
System.out.println("删除后:"+a.size());
System.out.println(a.toString());
//3. 补充方法 subList:返回子集合 范围含头不含尾
List b = a.subList(0,1);
System.out.println(b.toString());
}
}
List实现类
-
ArrayList【重点】:
- 数组结构实现,查询快、增删慢;
- JDK1.2版本,运行效率快、线程不安全。
-
Vector:
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全。
-
LinkedList:
- 链表结构实现,增删快,查询慢。
package United;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name,int age){
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student ["+"name:"+name+","+"age:"+age+"]";
}
@Override
public boolean equals(Object obj) {
//1. 判断是否为同一个对象
if (this==obj){
return true;
}
//2. 判断是否为空
if (obj==null){
return false;
}
//3. 判断是否为Student类型
if (obj instanceof Student){
Student s = (Student)obj;
//4. 比较属性
if (this.name.equals(s.getName())&&this.age==s.getAge()){
return true;
}
}
//5. 不满足条件返回false
return false;
}
}
package United;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class Demo05 {
public static void main(String[] args) {
ArrayList a = new ArrayList();
//1. 添加元素
Student s1 = new Student("刘德华",45);
Student s2 = new Student("古天乐",43);
Student s3 = new Student("梁朝伟",47);
a.add(s1);
a.add(s2);
a.add(s3);
System.out.println("元素个数:"+a.size());
System.out.println(a.toString());
//2. 删除元素
//a.remove(new Student("刘德华",45));//这里是重写了equals方法之后能这样操作,源equals方法是不能直接new对象这种形式删除的
//System.out.println("删除之后:"+a.size());
//System.out.println(a.toString());
//3. 遍历
//3.1 迭代器
Iterator b =a.iterator();
while (b.hasNext()){
System.out.println(b.next());
}
System.out.println("================");
//3.2 列表迭代器
ListIterator c = a.listIterator();
while (c.hasNext()){
System.out.println(c.nextIndex()+":"+c.next());
}
//4. 判断
System.out.println(a.contains(s1));
System.out.println(a.isEmpty());
//5. 查找
System.out.println(a.indexOf(s3));
}
}
ArrayList源码分析
DEFAULT_CAPACITY=10默认容量;若超出10的容量,每次扩容都是原来的1.5倍
注意:如果没有向集合中添加任何元素时,默认容量为0;
elementData存放元素的数组;
size 实际元素的个数
add(); 添加元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}