集合:很多数据堆放在一起,可变长的数据集合
回顾一下数组:
定义:相同数据类型的集合,数组既可以存基本数据类型,也可以存引用数据类型
弊端:数组它创建出来时候长度是固定的,如果要新增数组,需要对数组扩容
需要操作数组api(Arrays.copyOf(arr,arr.length+5);相当于删除一个原数组,在新建一个数组
单列集合(Collection 是一个接口,接口是不能实力化的(就是不能new一个对象)
List集合(子接口):
- ArrayList集合(子类) 底层是基于数组实现 查询快
- LinkedList(子类) 底层是基于链表实现 增删快
- Vector(子类)几乎不用
Set集合(子接口): 存储元素不可以重复,如果插入相同的元素,会插入失败,但是不会报错了
- HashSet集合 基于hash算法 存取 查找 删除 性能都很好(使用频率较高)
无序(元素存取的时候不一定会按照顺序存储)
可以存null值
不是线程安全的
- TreeSet集合 基于二叉树算法
需求:
创建一个集合,调用一下的方法看一下效果:
add()增加数据
remove()删除数据
clear()清空数据
contains()判断某个元素
imEmpty()
size()集合的长度
遍历集合
public static void main(String[] args) {
Collection c = new ArrayList();
//注意以下写法存Student对象到集合中只是为了演示,在实际工作中不可以这么写
//因为没有引用对象指向对象,新建对象可能会被自动回收
c.add(new Student("张三",18));
c.add(new Student("李四",19));
c.add(new Student("王五",20));
//将集合转换为数组
Object[] object = c.toArray();
for (int i = 0; i < object.length; i++) {
Student student = (Student)object[i];
//由于数组中的元素是 Object 类型,但实际上是 Student 类的实例,所以在访问之前需要进行类型转换。类型转换通过 (Student) obj[i] 实现,这将 obj[i] 强制转换为 Student 类型,以便可以调用 Student 类的方法 getName() 和 getAge()。
System.out.println(student.getAge());
System.out.println(student.getName());
}
}
List集合
List集合接口
get(index) 根据下标获取集合中的元素,下标从0开始
set(index,元素) 替换index位置的元素
public static void main(String[] args) {
// 父类引用指向子类对象 这个是多态的体现
List list = new ArrayList();
list.add(new Student("张三", 23));
list.add(new Student("李四", 24));
list.add(new Student("王五", 25));
// ClassCastException 类型转换异常
list.add(1.23);
try {
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
System.out.println(stu.getAge());
}
} catch (ClassCastException e) {
System.out.println("小数不可以转换成Student类型");
}
}
/**
* 创建一个集合,存入3个学生的信息,遍历3个学生的信息,把名字叫张三的同学的年龄改成18
*/
public static void main(String[] args) {
List<Object> list = new ArrayList();
list.add(new Student("张三", 23));
list.add(new Student("李四", 24));
list.add(new Student("王五", 25));
list.add(1.23);
// list里面如果存引用数据类型,存的是引用数据类型的地址,
// setAge=18修改的是引用数据的地址所指向的堆中的变量
for (Object obj:list) {
// ClassCastException
Student stu = (Student)obj;
if("张三".equals(stu.getName())){
stu.setAge(18);
}
}
System.out.println(list);
foreach
for (Object i:list) {
System.out.println(i);
int num = (int)i;
if(num==3){
// ConcurrentModificationException 因为增强for循环就是对迭代器的封装
list.remove(i);
}
}