Snapshot diagram
关于Snapshot diagram,考虑到其为期末题中一大重要考点,几乎每年的选择题和设计题都会涉及到这个知识点的考察,同时本人在复习后面内容(主要是设计模式时),在理解过程中也会写下相关模式的Snapshot diagram 来帮助自己理解。因此再结合工大软构PPT的内容再次进行复习,希望可以有所收获。
下面介绍基础类型和对象类型的表示,对于基础类型,我们直接用一个箭头和指向的值表示即可:当然此处的基础类型指的是int、float、double、long、boolean、char
这些。
对于对象类型,我们首先使用对象名和用箭头指向椭圆结构表示具体的对象,然后标识对象的类名,具体的属性。
(本人认为包装类(Integer等)最好也使用基础类型那种,Map就是这样用的)
推荐使用第一种(其中Point为可变类型):
接下来我们考虑不可变和可变类型的画法。对于不可变对象,我们画双线椭圆‘;对于不可变引用,我们用双线箭头表示。(我们可以这样理解,双线的话比较坚固,不会移动或改变值)
-
不可变对象意味着当我们需要改变其值的时候,我们只会获得我们需要值的一个新的对象,而不是在原有不可变对象的基础上进行修改。(如下图的可变对象:StringBuilder)
-
不可变引用意味着id只能指向初始化后的对象,至于这个对象可不可以修改值,这取决于指向的对象是可变类型还是不可变类型
-
因此,我们可以获得小小的结论就是:引用是不可变的,不过指向的值是可以改变的;可变的引用也可以指向不可变的对象。
下面我们考虑一些复杂的集合类型:
-
所有这些集合类型,因为都是接口,当初始化时把List等改成对应的具体实现
-
List:
-
List是有序集合类型,里面的属性我们用
0 - list.length()-1
表示
-
List<Integer> list = new ArrayList<Integer>();
Set
无序集合
Map
类似字典:键值对
Arrays and Collections
Array
// 初始化 : int [] a = new int [100]; // 一旦创建长度不可改变 //操作 : a[2]; //索引获取值 a[2] = 0 ; // 赋值 a.length; // 获取长度
Collections
List
-
可变长的数组
-
尽可能地使用List而不是array
// 初始化 /* 其中List为接口, ArrayList为其的数组实现,还有一个链表实现LinkedList 同时List中的元素必须是对象类型,因此不能用int而是Integer */ List<Integer> list = new ArrayList<Integer>(); //操作 list.get(2); // 获取值 list.set(2,0); // 赋值 list.size(); // 获取list大小 // 迭代器 for(int x : list){ //这样利用迭代器获取集合的元素 //对元素进行操作 }
Set
-
一个Set就是零个或多个独特对象的无序集合
-
同一个对象不可以出现在一个Set多次,要么它在Set内,要么不在
-
Set 是一个接口,也有两种具体实现,HashSet 和 TreeSet
// 初始化 Set<Integer> set = new HashSet<Integer>(); // 操作 set.contains(e); //是否包含e对象
-
Map
-
Map类似于字典: 键值对 键 -> 值
-
Java实现里,Map为一个抽象接口,有多个具体实现类,如HashMap等
Map<L,T> map = new HashMap<>(); map.put(key,val); // 增加映射 key -> val map.get(key); // 获取value 获得key对应的value map.containsKey(key); // 判断map是否有这个键值对 map.remove(key); // 删除key对应的映射
Collection 使用
-
首先我们需要明确的是:java为我们提供了
-
类型的规约 : 它是做什么的 -> 抽象接口
-
类型的具体实现 : 代码是什么 -> 具体类
-
-
List、Set和Map都是接口
-
他们仅仅定义相对应的类型怎么工作,不提供具体实现
-
优势是使用者可以按照不同的场景选择不同的实现方式
-
具体实现:
-
List : ArrayList and LinkedList
-
Set : HashSet
-
Map : HashMap
List<String> firstNames = new ArrayList<String>(); List<String> lastnames = new LinkedList<String>(); Set<Integer> numbers = new HashSet<>(); Map<String,Turtle> turtles = new HashMap<>();
-
-
-
迭代器
-
迭代器是一个逐步遍历元素集合并逐个返回元素的对象
-
使用方法
-
使用
for(... : ... )
循环结构
List<Stiring> cities = new ArrayList<>(); for(String city: cities){ System.out.println(city); }
-
使用迭代器对象
Iterator iter = lst.iteraor();
//hasNext()判断是否到达集合的末尾 //next()返回集合的下一个元素---这是一个更改器方法 List<Stiring> cities = new ArrayList<>(); Iterator city = cities.iterator(); while(city.hasNext()){ String str = city.next(); System.out.println(str); }
-
-
关于突变对迭代器的破坏
-
删除迭代对象本身的元素会导致index出错,导致不易发现的错误
-
使用迭代器本身提供的方法remove删除元素,迭代器会自动以合适的方式调整其index。
-
-