当我们使用数组的时候,遇到最多的问题就是怎么数组空间总是不够用,或者是只能存一种数据类型,当我们的数组存满了,如果还想往里面放东西,那么只能重新建立一个更长数组,将原数组的值复制到新数组,再往新数组添加数据,然后返回新数组。这个过程很繁琐,且容易出错。
而集合就类似于数组,并且集合解决了数组长度不够的这一缺点,但也有自己的缺点。
集合的优点:长度不固定,集合在创建出来之后的初始长度为0,随着往里面添加数据,那么集合就会自动扩容。
集合的缺点:集合可以存储的数据类型不固定,当集合中存在多种数据类型的数据时,不好遍历集合。
集合使用的语法:
ArrayList list=new ArrayList(); //这种方式创建的集合可以存放不同数据类型的数据
创建存放同种类型数据的集合:
ArrayList<String> list=new ArrayList<String>(); //创建字符串类型的集合
集合的成员方法
例如上面创建的字符串类型集合list
list.add("字符串") | 向集合种添加元素(返回值时boolean类型,添加成功返回true) |
list.remove("字符串") list.remove(int index) | 删除集合中这个字符串,若有多个相同的,则从0开始遍历,删除第一个,删除成功返回true 删除集合中index索引的元素,删除成功,则返回被删除的元素 |
list.set(int index,新值) | 将集合中index索引的值修改为 新值,方法返回的是被修改掉的旧值 |
list.get(int index) | 将集合中index索引的值返回 |
list.size() | 计算集合的长度并将长度返回 |
ArrayList<String> list=new ArrayList<>();
list.add("aaa");
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd"); //添加字符类型数据,若添加成功则返回true,否则返回false
System.out.println(list);
list.remove("aaa"); //从0索引开始遍历集合,将遇到的第一个“aaa”删除,删除成功则返回true,删除失败返回false
System.out.println(list);
//删除一个元素之后,集合的长度会自动减小,此时集合长度就为4了,而不会向数组一样如果不手动将后面的数据迁移,那么这个位置就为空了
System.out.println(list.size()); //list.size()就是统计集合的长度
String str=list.remove(0); //根据索引去删除集合中的元素
System.out.println(str); //集合根据索引删除元素这个成员方法返回的是被删除的元素
System.out.println(list); //输出删除元素后集合
System.out.println(list.size());
String str2=list.set(1,"eee"); //将集合中1索引的元素替换成新的值“eee”,并将被删除的元素返回,赋值给str2
System.out.println(str2);
System.out.println(list);
注:如果集合要存储基本数据类型数据时,ArrayList<>里面<>中的数据类型,除了int和char类型之外,其他的基本数据类型都是将首字母大写。而 int 和 char 分别为 Integer 和 Character。
练习题
学生管理系统
建立一个学生类,学生的属性有ID,姓名,年龄,出生日期
功能:
1、增加学生
2、根据ID去删除学生
3、根据ID查找学生
4、显示所有学生信息
5、根据ID修改学生信息
6、退出系统
部分功能实现:
//添加学生
public static void studentAdd(ArrayList<Student> list) {
System.out.print("请输入你要添加的学生个数:");
int number = scanner.nextInt();
for (int i = 0; i < number; i++) {
Student student = new Student();
System.out.println("请输入第" + (i + 1) + "个学生的信息:");
System.out.print("ID:");
long id;
while (true) {
id = scanner.nextLong();
boolean flag = true; //定义判断学生的id是否已经存在的标志
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getId() == id) {
flag = false;
System.out.println("ID已存在,请重新输入ID");
break;
}
}
if (flag) {
break;
}
}
student.setId(id);
System.out.print("姓名:");
String name = scanner.next();
student.setName(name);
System.out.print("年龄:");
int age = scanner.nextInt();
student.setAge(age);
System.out.print("出生日期:");
String birthDate = scanner.next();
student.setBirthDate(birthDate);
list.add(student);
}
System.out.println("添加成功!");
}
//修改学生信息
public static void studentModify(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("无法修改,还没有学生信息哦");
} else {
System.out.print("请输入需要修改的学生ID:");
long id = scanner.nextLong(); //要修改的学生id
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId() == id) {
System.out.println("请重新输入这个学生的信息:");
System.out.print("ID:");
long newId; //定义一个新的ID变量,用来存储输入的新的ID号
boolean flag = false;
while (true) {
newId = scanner.nextLong();
for (int j = 0; j < i; j++) {
if (list.get(j).getId() == newId) {
System.out.println("修改失败,ID已存在,请重新输入");
flag = true;
}
}
for (int j = i + 1; j < list.size(); j++) {
if (list.get(j).getId() == newId) {
System.out.println("修改失败,ID已存在,请重新输入");
flag = true; //再学生中找到除了这个学生之外有学生的ID跟跟新的newId相同,那么就跟新标签flag为true,表示有相同ID已存在了
}
}
if (!flag || newId == list.get(i).getId()) //如果flag=false,表示ID除了这个学生本身的ID之外没有重复的,那么就将这个newId跟新到学生的ID
{
break;
}
}
list.get(i).setId(newId);
System.out.print("姓名:");
list.get(i).setName(scanner.next());
System.out.print("年龄:");
list.get(i).setAge(scanner.nextInt());
System.out.print("出生日期:");
list.get(i).setBirthDate(scanner.next());
System.out.println("修改成功!");
return;
}
}
//遍历完所有学生都没找到这个id号的学生,那么提示每日找到这个id号的学生
System.out.println("没有ID号为" + id + "的学生!");
}
}