`
nudtgk2000
  • 浏览: 72513 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

马士兵课程笔记(续6)

阅读更多

容器

概念

    Java API 所提供的用于在程序中存放对象的一系列类的实例。

    数组其实也是一种容器, 不过其他容器类都不用也不能指定大小。

 

容器API

  • 位于 java.util 包内;
  • 类图结构如下:

  • Collection 接口 —— 定义了存取一个一个对象的方法,其子接口 Set 和 List 分别定义了存储方式
    • Set 中的数据对象无序不重复
    • List ... 有序可重复
    • “重复”的定义:互相equals()。
  • Map 接口 —— 定义了存储 "key - value 映射对" 的方法。

 

Collection<E> 接口

方法

int size(); boolean isEmpty();

boolean contains(E element)//依据equals, add(...), remove(...); void clear(); 

boolean containsAll(Collection c), addAll(...), removeAll(...), retainAll(...)//保留交集;

E[] toArray(); Iterator<E> iterator();

 

import java.util.*;
...
Collection c = new ArrayList();    // 父接口引用子类对象
// 可以存入不同类型的对象,但必须是对象,因为基本数据类型位于Stack里随时可被清空
c.add("Hello");
c.add(new Name("f1", "l1"));
c.add(new Integer(200));
System.out.println(c.size());
System.out.println(c);    // ArrayList的toString()方法
...

/** 输出:
 * 3
 * [hello, fi1 l1, 100]
 */
  • 容器类对象在调用 remove、contains 等方法时需要比较对象是否相等,这就涉及到对象类型的 equals 及 hashCode 方法[注1]:对自定义类,需要重写 equals 及 hashCode 方法[注2]以实现自定义的相等规则。
  • 注1:hashCode方法因为同时具有索引的特性,会在 Map 型容器中对key对象的比较中被用到;
  • 注2:equals 为 true,hashCode 也要为相等,好比同一个人不该有多个住址就没法找了。一个住址可以住多人,但是找个人效率会降低,应尽量避免这样,即设计hashCode方法应尽量让hashcode相等的对象也相等;
  • hashCode方法设计比较难,可以调用API类的方法。

Iterator<E>接口

    所有实现了 Collection 接口的容器类都有一个 iterator() 方法用以返回一个实现了 Iterator 接口的对象;

    Iterator 对象称作迭代器,用以方便地实现对容器内元素的遍历操作;

    Iterator 接口内定义了三个方法:

        boolean hasNext(); E next();

        void remove();    // 删除指针前一个元素,(一定有机制保存了前一个元素的引用)所以在执行完 next() 之后只能 remove() 一次(那个保存前一个的引用删掉失效了)。Iterator的remove() 是在迭代过程中删除容器元素(不只是迭代器里的元素)唯一安全方法,此时不能用容器类提供的remove,会产生例外,因为Iterator对象内部对容器对象做了线程锁定。

Tips:JDK5.1增强的for循环

缺陷:1. 不适用数组 —— 不能方便地访问下标

      2. 对于集合 —— 该for结构内部也是调用Iterator,但与Iterator相比却不能方便地删除集合中的元素(原因在上文)

结论:除了简单遍历读取元素外,不建议使用

 

Set<E>接口

对应数学中的“集合”概念

无序,无重复

HashSetTreeSet

Tips:Set 和 List 类都具有以 Collection接口类 为参数的构造方法

 

List<E>接口

有序,可有重复

像数组 —— 元素对应整型的索引,可按索引访问;又不同于数组 —— 不限大小,自动扩容

ArrayList,LinkedList 等

特有方法

get(index); remove(index);

indexOf(E), lastIndexOf(...);

E set(index, element); void add(index, element)

java.util.Collections类 提供了一组静态方法实现基于List容器的常用算法

void sort(List) // 借助于Comparable接口; void shuffle(List); void reverse(List); void filll(List, E); void copy(List dest, List src); int binarySearch(List, E) // 先排序再查找

 

Comparable<T>接口

所有可“排序”的类都实现了 java.lang.Comparable接口

只包含一个方法:public int compareTo(T o); 0: ==, +: this > obj, -: <。

Comparable接口的实现类通过实现 compareTo 方法确定该类对象的排序依据。Note: 实现该方法同重写equals()一样,要先检查类型, SDK1.5引进泛型后就不用了

 

class Name implements Comparable {
    ... ...
    public int compareTo(Object o) {   // 强调:实现/重写的方法头部要copy自接口/父类
        Name n = (Name) o;    // 类型检查或强制转换
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp :
                                            firstName.compareTo(n.firstName));
    }
}
  

如何选择*

看应用

Array 读快改慢;

Linked 改快读慢;

Hash 两者之间。

 

Map<K, V>接口

键-值对, key和value都是对象

以Key标识,key不可重复,依据 hashCode 比较

HashMap类(Hash表实现),TreeMap类(红黑树)

特有方法

put(K key, V value);    // 如果发生了替换,返回旧的value

V get(key), V remove(key);    // value对象以Object类型输出,所以要再按原有类型强制转换

boolean containsKey(key), containsValue(value);

int size(); boolean isEmpty(); void clear();

void putAll(Map<K, V> t);

Auto-boxing/unboxing 机制

基础数据类型<->封装类 自动转换(JDK1.5后)

 

import java.util.*
...
Map m1 = new HashMap();
m1.put("one", 1);    // 并不是存在 put(Object, int) 方法,而是自动打包机制将int转换成Integer传给put方法
int i = (Integer) m1.get("one");    // Integer类型的对象可以自动解包成int,但是这里是以Object类型输出的,不强制转换成Integer型就不会启用自动解包机制
...

 

泛型Generic(after JDK1.5)

起因:JDK1.4 以前类型不明确

  • 装入集合的类型都被当成Object对待,从而失去自己的实际类型;
  • 从集合中取出时往往需要转型,效率低,容易出错。

解决办法:在定义集合的时候同时定义集合中对象的类型

格式Collection<E>, Iterator<E>Comparator<T> , Map<K, V>等凡是API中这样定义的接口、类;

使用:把指定的类型填进<>,见TestArgsWords.zip

优点:增强程序的可读性和稳定性

 

Summary —— 一一三六

 

  • 一个图
  • 一个类 —— java.util.Collections
  • 三个知识点
    • 增强for (不好)
    • Generic
    • Auto-boxing / unboxing
  • 六个接口
    • Collection<E>
    • Iterator<E>
    • Set<E>
    • List<E>
    • Map<K, V>
    • Comparable<T>
  • 大小: 23.3 KB
分享到:
评论

相关推荐

    马士兵课程笔记(续5)

    【标题】"马士兵课程笔记(续5)"主要聚焦在编程和软件开发的某一特定领域,结合了“源码”和“工具”的概念。这可能是关于解析、分析或利用源代码,以及使用特定工具来提升开发效率或理解复杂系统的主题。马士兵是一...

    马士兵课程笔记(续4)

    【标题】"马士兵课程笔记(续4)"主要聚焦于编程知识,特别是通过代码实例来深化理解。马士兵是一位知名的IT教育专家,他的课程通常涵盖了广泛的编程主题,旨在帮助学员深入掌握技术。在这个部分,他可能继续讲解了...

    马士兵jvm调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...

    马士兵JAVA笔记(全).docx

    马士兵JAVA笔记(全) 本资源是马士兵的JAVA笔记,涵盖了JAVA语言的基础知识,包括标识符、常量、变量、数据类型、运算符、控制流语句等。 标识符是JAVA中的一种符号,用于命名变量、方法、类等。标识符由字母、...

    马士兵oracle笔记

    马士兵oracle笔记,浅显易懂。

    jvm java虚拟机 调优 马士兵 笔记

    jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识

    Spring学习笔记(马士兵spring视频笔记).doc

    Spring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).doc

    马士兵老师spring框架学习笔记

    马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...

    马士兵 mybatis学习笔记

    马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...

    马士兵Spring课堂笔记(超级详细版).pdf

    马士兵Spring课堂笔记(超级详细版) 本资源主要讲解了Spring框架的基础概念和应用,涵盖了面向接口编程、IOC/DI、AOP、Spring应用IOC/DI、Spring应用AOP、Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合、Spring...

    马士兵Spring课堂笔记(详细版)

    马士兵Spring课堂笔记(详细版) 马士兵spring视频笔记

    JAVA就业班笔记【马士兵说】.nyf

    JAVA就业班笔记【马士兵说】.nyf

    JAVA笔记(根据马士兵的java视频整理).pdf

    "JAVA笔记(根据马士兵的java视频整理)" 本资源是根据马士兵的JAVA视频整理的笔记,涵盖了JAVA的基础知识、数据结构、面向对象编程、Java Web编程、J2EE、J2ME等方面的知识点。 在基础知识方面,本资源涵盖了变量...

    马士兵多线程笔记.zip

    以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...

    java-SE-马士兵笔记word

    ### Java SE - 马士兵笔记精要 #### 第1章 Java概述 - **Java语言的特点**: - **面向对象**:Java是一种完全支持面向对象编程的语言。 - **平台无关性**:通过Java虚拟机(JVM),Java可以在任何安装了JVM的...

    马士兵Springboot课堂笔记

    马士兵Springboot课堂笔记

Global site tag (gtag.js) - Google Analytics