上课视频:
第一集:链接:https://pan.baidu.com/s/1oMR-dQbI3Tx7ZZZrFmlnpA 密码:1735
第二集: 链接:https://pan.baidu.com/s/1clOWtvLLIX_2bD9DCyDgDQ 密码:41hh
第三集:链接:https://pan.baidu.com/s/1HTsGnbemVYJv8uhv6Iiu4w 密码:1t83
Map说明视频:
链接:https://pan.baidu.com/s/1ywwDXnWI1A7Zd2zJAs1SHw 密码:87ld
链接:https://pan.baidu.com/s/15vZrVKiT6sM5XFZgUEohOQ 密码:7j0o
作业讲解视频:
链接:https://pan.baidu.com/s/1zbuFc4qpvDbAoZ5DU9mdtg 密码:xtsw
链接:https://pan.baidu.com/s/17LPK6tCWs7XBpvjPj1gktQ 密码:apcs
一、java什么是集合。
其实集合跟数组差不多,只不过长度是可以变化的。
集合分为三大类
List : 有序的,可以通过下标访问读取
Map : 无序的,是通过键值对存取
Set :就是一个无序集合。
它们的都实现Collection接口
1.常用集合List:
List-->ArrayList
List-->LinkedList
二、集合当中ArrayList和LinkedList有什么区别。
ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
链表数据结构:
image.png
https://www.cnblogs.com/soundcode/p/6294174.html
二、常用集合Map?
List集合跟Map集合差别在那里。
List:它是跟据下标来进行添加和读取,是有顺序的。
Map:是跟据键值对来添加和读取,key value
HashMap和TreeMap的区别
HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法
默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;
TreeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
上课练习:
练习1:往Map里存10个学生,通过id为8找出对应学生的姓名和性别
Student类
package com.joychen.shuzu;
public class Student {
private int id;
private String name;
private String sex;
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类
package com.joychen.shuzu;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String args[]){
Map<Integer,Student> map = new HashMap<Integer, Student>();
new Student(2,"aa","");
map.put(1,new Student(1,"小明","男"));
map.put(2,new Student(2,"小红","女"));
map.put(3,new Student(3,"小蓝","男"));
map.put(4,new Student(4,"小黑","男"));
map.put(5,new Student(5,"小小","女"));
map.put(6,new Student(6,"小萌","女"));
map.put(7,new Student(7,"小李","男"));
map.put(8,new Student(8,"小猪","男"));
map.put(9,new Student(9,"小二","男"));
map.put(10,new Student(10,"小三","女"));
Student student = map.get(8);
System.out.println(student.getSex()+student.getName());
}
//往Map里存10个学生,通过id为8找出对应学生的姓a名和性别
}
作业思考
作业1:
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10;
分析:1.看到这个题目,或许你脑海中会想到很多方法,比如判断生成的字符串是否包含重复,在判断长度是不是10,等等.
2.其实这题我们可以培养一个习惯,大问题分解小问题解决.
(1).10个字符串,我们先产生一个10个字符不重复的字符串,
(2).怎么去重复呢?集合中的HashSet就可以,这题不适合用包含方法做,代码复杂
(3).字符组成是由(a-zA-Z0-9) 难道我们在随机他们的码表一一判断吗?-------->可以把们放到一个容器中ArrayList 在集合的随机索引
package com.joychen;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class WrokOne {
static HashSet<String> strings = new HashSet<>();
static List<String> chars = new ArrayList<>();
public static void main(String args[]){
//System.out.println(String.valueOf(9));
initData();
// for (int i = 0;i<chars.size();i++){
// System.out.println(i+":"+chars.get(i));
// }
// System.out.println(chars.size());
while (strings.size() <10) {
String s = buildString();
strings.add(s);
}
for (String s :strings){
System.out.println(s);
}
}
private static void initData(){
for (char i = 'a';i<='z';i++){
chars.add(String.valueOf(i));
}
for (char i = 'A';i<='Z';i++){
chars.add(String.valueOf(i));
}
for (int i = 0;i<=9;i++){
chars.add(i+"");
}
}
/**
* 产生一个字符串
* @return
*/
public static String buildString(){
String tempString = "";
while (true) {
int index = (int) (Math.random() * 62);
String c = chars.get(index);
if (!tempString.contains(c)){
tempString= tempString+c;
}
if (tempString.length()>=10){
break;
}
}
return tempString;
}
}
作业2:
2.集合框架中的泛型有什么优点?
http://www.jfox.info/40-ge-java-ji-he-lei-mian-shi-ti-he-da-an.html
作业3:
从控制台中录入学生信息,包含学号、姓名、性别,用集合保存。保存好的跟据学生姓名去查找此学生的所有信息。然后再打印一下所有学生的信息。
需求分析之后,我们要做成下面这样子
需求
Student类
package com.joychen;
public class Student {
private String number;
private String name;
private String sex;
public Student() {
}
public Student(String number, String name, String sex) {
this.number = number;
this.name = name;
this.sex = sex;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"学号='" + number + '\'' +
", 姓名='" + name + '\'' +
", 性别='" + sex + '\'' +
'}';
}
}
Test类
package com.joychen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Test {
public static Scanner scan = new Scanner(System.in);
static List<Student> students = new ArrayList<>();
static Map<String,Student> studentMap = new HashMap<>();
public static void main(String args[]) throws IOException {
// MyList<Student> stringMyList = new MyList<>();
// stringMyList.set
while (true) {
menu();
intoSystem();
//按任意键继续
System.out.println("按任意键回车继续");
scan.next();
//清除屏目
clear();
}
}
public static void menu() {
System.out.println("\t\t学生信息查询demo");
System.out.println("1.录入学生信息");
System.out.println("2.查询所有学生信息");
System.out.println("3.跟据学生姓名查所对应学生信息");
System.out.println("4.退出");
}
public static void intoSystem() {
System.out.println("\n>>请跟据菜单提示选择对应功能:");
int choose = scan.nextInt();
switch (choose) {
case 1:
inputStudentInfo();
break;
case 2:
findAll();
break;
case 3:
System.out.println("请输入要查找的学生姓名;");
String name = scan.next();
getStudentByName(name);
break;
case 4:
System.out.println("4.退出系统");
System.exit(0);
break;
default:
System.out.println("输入错误,请重新输入");
break;
}
}
public static void clear() {
for (int i = 0; i < 20; i++)
System.out.println("");
}
/**
* 录入学生成绩
*/
public static void inputStudentInfo() {
System.out.println("开始录入学生信息,可以输入exit结束录入。");
int count = 1;
while (true) {
System.out.println("请录入第" + count + "个学生信息:");
System.out.println("录入学号:");
String number = scan.next();
if (number.equals("exit")) {
break;
}
System.out.println("录入姓名");
String name = scan.next();
if (name.equals("exit")) {
break;
}
System.out.println("录入性别");
String sex = scan.next();
if (sex.equals("exit")) {
break;
}
Student student = new Student(number, name, sex);
students.add(student);
studentMap.put(name,student);
count++;
}
}
/**
* 查询所有学生信息
*/
public static void findAll() {
for (Student s : students) {
System.out.println(s);
}
}
public static void getStudentByName(String name) {
System.out.println(name+"的信息如下");
Student s = studentMap.get(name);
System.out.println(s==null?"查无此人":s);
// for (Student s : students) {
// if (s.getName().equals(name)) {
// System.out.println(s);
// }
// }
}
}