集合是同一类型元素的组合,本身也是一个类/对象,就像一个容器一样,(可以)装着它的元素。
PS:早期的集合元素类型都是Object,但现在我们都使用泛型。(@想一想@:为什么?)
数组就是一种集合。
除此以外,Java和C#还内置了:
再下面又根据其数据结构,派生出:
以上粗体为Web开发常用集合。(理解起来觉得抽象的同学,可以先看Java/C#部分的演示)
所有集合中都内置了相应的增删改查等方法。
PS:现在终于可以回答这个问题:为什么实际开发中我没有写过数据结构和算法呢?
所有的集合都有一个要求:遍历(迭代/枚举)每一个元素。
我们能不能提供一个统一的方法,实现这个功能?
很简单,让所有集合类实现一个接口(Java中Iterable/C#中IEnumerable),在接口中定义一个遍历的方法(Java中iterator()/C#中GetEnumerator()),不就OK了吗?
注意这个接口方法返回的值又是一个接口(Java中Iterator<T>/C#中IEnumerator<T>),它又有两个方法:
这样,我们要遍历任何一个集合的时候,都只需要这样机械地调用:
//拿到集合students的迭代器 Iterator<Person> iterator = students.iterator(); //只要没有遍历结束 while(iterator.hasNext()) { //获取下一个元素 Person current = iterator.next(); System.out.println(current.Name); }
@想一想@:为什么还要引入Iterator,而不直接在Iterable中定义hasNext()和next()呢?
Entity-Relationship Model:实体关系模型。
是一种流行的、用于将现实世界映射到软件系统的概念模型。具体来说,它由以下三部分组成:
^_^,good question!
简单理解:实实在在存在的物体。
面向对象的世界里,万物皆对象。但
有些对象是能够映射到现实世界实际存在的物体的,或者拥有实实在在的数据信息的,比如:
他们就是实体。
有些对象则不然,他们没有对应的实体,在系统中作为辅助、运算、工具类存在,比如:生成随机数的Random对象,对应啥?对应一个色子?就算这样,这个色子本身也没有任何数据需要记录,我们只是需要它的运算结果。还有StringBuilder、集合对象……他们就不是实体。
PS:这个问题其实在学了数据库之后更好理解,凡是要存到数据库的,都是实体。
实体和实体之间,会产生关系。
可以通过一个对象的属性指向另一个/系列的对象来体现,这种组织形式又被称之为:引用/关联/组合。(复习:继承不是为了重用,重用使用组合)
public class Student { private Teacher teacher; public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } }
Student atai = new Student(); Teacher fg = new Teacher(); atai.setTeacher(fg);
PS:引用(属性依赖)是依赖关系的一种。依赖的概念比引用大,只要一个对象/类使用了另一个对象/类,就算是形成了依赖关系。
除了属性依赖,还可以有:
我们也把对象之间的关联关系概括为(以老师/学生关系为例):
注意:我们上面说的“有”,是规则允许“可以有”“最多有”的意思。比如:
表现形式
可以用单个属性引用表示1,集合表示n。比如一个学生多个老师:
关系首先可以分成单向和双向,比如:
public class Student { private Teacher teacher; public class Teacher { private Student student;
Student引用了Teacher,Teacher也引用了Student,我们就说Student和Teacher之间形成了“双向”引用。
构建ER模型,可以灵活使用单向/双向关系:
public class Teacher { private List<Student> students; public class Student { private List<Teacher> teachers;
public class Student { private Teacher teacher;
public class Teacher { private List<Student> students;
public class Student { private Teacher teacher; public class Teacher { private Student student;
然后,通过对象间引用,我们可以反推:
|
Student | Teacher | 可能的关系 |
双向 | Teacher | Student | 1:1 |
Teacher | IList<Student> | 1:n | |
IList<Teacher> | IList<Student> | n:n | |
单向 | Teacher | 无 | 看内容:1:1或1:n |
IList<Teacher> | 无 | 1:n |
用户注册,系统应该新生成了一个User对象(包含用户名密码等)
@想一想@:这个对象存放在哪里?假设我们把对象都存储在集合里,这个集合是静态的,还是实例的好?
用户登录,我们要在集合里去检查登录用户的输入是否正确
@想一想@:应该怎么操作?本质上是根据用户名进行检索查找。
某一天被用户注销,我们又该怎么办?当然是在集合中删除这个对象。
OK,现在总结出来,存放、查找和删除都要封装成方法,这些方法放在哪里?
三种方案:
对应enities,建立专门的repository(仓库类),有以下好处:
class Repository<T>{ public static List<Object> entities; //C#可以直接使用T public void Save(T entity) { entities.add(entity); } public void Delete() { entities.remove(this); } }
class StudentRepository extends Repository<Student>{ public boolean Find(String name) {
多快好省!前端后端,线上线下,名师精讲
更多了解 加: