Snapshot diagram and Complex data types

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<>();
  • 迭代器

    • 迭代器是一个逐步遍历元素集合并逐个返回元素的对象

    • 使用方法

      1. 使用for(... : ... )循环结构

      List<Stiring> cities = new ArrayList<>();
      for(String city: cities){
        System.out.println(city);
      }
      1. 使用迭代器对象 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值