如何设计容器类

10、容器类设计与实现:构建高效的数据结构体系 本文深入探讨了容器类的设计与实现,重点分析了包括二叉树、字典和有序字典在内的数据结构接口定义与具体实现。通过构建灵活、可扩展的容器层次结构,展示了如何高效管理和操作数据,并结合实验室应用验证各类容器的功能。文章还涉及高级容器如优先队列、集合和堆的应用,以及数据结构优化策略,为读者提供了全面理解容器类设计与实现的基础知识和实践指导。 阅读详情

设计容器类

1.     设计原则

a.  包含什么?

即容器中放入什么东西,是包含对象吗?包含一个对象的确切含义是什么呢?

容器应该包含放在其中的对象的副本,而不是原对象本身。即可以把指向该对象的指针放入到容器中。

b.  复制容器意味着什么?

容器称为模板,而容器内的对象的类型就是模板参数。复制容器是不是也应该复制包含在容器中的对象呢?

Container<T> c1;

Container<T> c2(c1);

或者

Container<T> c2;

c2=c1;

如果复制c2到c1会导致c1和c2指向同一底层对象,那么对c2的改变也会映射到c1中。如果我们定义复制意味着把c2的值放入c1中,则c2的改变对c1就不会影响了。

对于C/C++中的内建集合都实现了两种不同的方法:复制对于这两种方法来说含义各不相同:

   结构体实现值的语义;复制完成之后,两个变量都有这个值的独立的副本。

数组实现引用语义:复制完成之后,两个变量都引用同一个底层对象(效率高)。

引用计数和写时复制技术可以减少容器复制的开销。

复制容器定义为复制存储在容器中的值。

c.  怎么样获取容器中的元素?

即当从Container取出对象时候,应该得到类型T还是类型T&的对象呢?

获取容器中对象时复制操作带来的额外开销要比向容器中插入对象时的复制操作的额外开销大得多,当对象本身是某种集合时,更为突出。

 

 如果能够修改容器中的对象对我们来说很重要,那么容器必须提供对象的引用,否则必须提供另外一种方法来改变容器所包含的对象。

d.  怎么样区分读和写?

可以用operator[]用于读,另外再定义一个函数来写元素。但是单独定义的update函数用来写元素对包含容器的容器可能毫无用处。对于容器的容器最好的折中办法就是允许获得引用。并提醒用户只能在创建了引用之后才能使用。

e.  怎么样处理容器增长?

要避免存储一个不存在的元素和取出一个不存在的元素。

如果试图在没有创建元素前就想访问该元素的时候可以抛出异常或者提供一种显示创建先的容器元素,譬如用缺省构造函数返回的值。

如何为容器中的元素分配内存?

例如往数组的尾部添加一个元素,可以按区块增加容器的大小,新的内存空间必须一次分配完毕。但在选择适当的计算新块大小策略的时候要注意。

什么时候讲内存还给系统也很重要。

f.  容器支持哪些操作?

例如是否允许容器包含容器?如果容器内部复制元素,而元素另一种容器,则该种容器必须能够被复制。

除非容器有一个缺省构造函数,否则不可能创建一个容器数组。

顺序地遍历容器中的所有元素。(迭代器)

g.  怎样设想容器元素的类型?

 

容器至少需要复制、赋和销毁类型为T的对象等操作。根据容器的用途来决定T应具备的操作。

h.  容器和继承

假设有一个基类B和一个派生类D,把一个D对象放入到一个Container<B>中会发生什么呢?

例如:

Class Vehicle{};

Class Airplane:public Vehicle{};

如果有Container<Vehicle>,想放入一个Airplane去,只能得到Airplane的Vihicle部分的副本。如果要记住整个Airplane应该使用Container<Vehicle *>.

如果Contain<Airplane>从Container<Vehicle>继承。

Vehicle v;

Container<Airplane> ca;

Container<Vehicle> &vp =ca;

Vp.insert(v);这样就可以往Container<Vehicle>插入普通的Vehicle.实际上我们并不想这样。

不同类型的容器不应该存在继承关系;Container<Vehicle>和Container<Airplane>是完全不同的类。

2.     设计实例(类似数组的类)

#ifndef   _ARRAY_H

#define   _ARRAY_H

#include <iostream>

using namespace std;

namespace Meditation

{

    template<class T> class Array

    {

    public:

       Array():data(0),sz(0){} //缺省构造函数,保证new T[size]

       Array(unsigned int size):sz(size),data(new T[size]) { }

        const T& operator[](unsigned int n)const

       {

           if(n >= sz || data == 0)

              throw "Array subscript out of range";

           return data[n];

       }

       T& operator[](unsigned int n)

       {

              if(n >= sz || data == 0)

              throw "Array subscript out of range";

           return data[n];

       }

       //数组到指向它的第一个元素的指针的转换

       operator const T*() const

       {

           return data;

       }

        operator  T*() 

       {

           return data;

       }

 

    private:

       T *data;

       unsigned int sz;

       Array(const Array &a);

       Array&operator=(const Array&);

       //禁止复制和赋值

    };

}

#endif


 

上面类的特点:1.禁止进行复制和赋值

              2.允许创建new T[size];

              3.提供了从T*到const T*

缺陷:包含元素的Array消失后,它的元素的地址还存在

,允许用户访问它元素的地址。如:

Void f()

{

Int *p

{

Array<int> x(20);

P=&x[10]

}

Cout<<*p<<endl;//此处有问题

}

Array对象x超出了作用域,而p还指向它的一个元素。

 

a. 访问容器中的元素

上面的容器使得用户能够狠轻易得到一个指向Array内部的指针,即使Array本身不存在了,这个指针仍然保留在那里。如果Array占用的内存发生变化,可能会导致用户错误。,怎么保留指针的表达能力同时又避免这些不足呢?

 定义一个识别Array和内部空间的类,这个类应该包括一个下标和一个指向相应Array的指针。这个类的对象的行为类似指针。

template<class T> class Pointer

    {

    public:

       Pointer(Array<T>& a,unsigned int n=0):ap(&a),sub(0) { }

       Pointer():ap(0),sub(0) { }

       T operator*()const

       {

           if(ap == 0)

              throw "* of unbound Pointer";

           return (*ap)[sub];

       }

       void update(const T&t)

       {

           if (ap == 0)

           {

              throw "update of unbound Pointer";

           }

           (*ap)[sub] = t;

       }

       T operator[](unsigned int n) const

       {

           if(n >= sz)

           {

              throw "Array subscript out of range";

           }

           return data[n];

 

       }

    private:

       Array<T> *ap;

       unsigned int sub;

   };


 

上面使用update而不是operator[]来更新容器中的值,会让容器包含容器失效。

b. 遗留问题

上面只是增加了一个防止出错的中间层,如果Array不存在了,还可能存在一个指向它的某个元素的空悬Pointer.使用Pointer和使用指针一样会造成混乱。如:

Array<int>* ap= new Array<int>(10);

Pointer<int> p(*ap,s);

Delete ap;

*p = 42;

删除了Array,然后再试着给这个元素赋值,这样的错误怎么避免呢?

如果我们能确保只要存在一个指向某个Array对象的Pointer对象,该Array对象就不会消失,情况会不会改变呢?

怎么样设计Array,使得删除Array时不会真正使Array消失?

需要引入一个额外的中间层,使删除了Array对象后仍然保留数据,让Array对象指向数据而不是包含数据。

定义三个类:Array,Pointer,Array_data。每个Array对象都指向一个Array_data对象。

现在还是可以删除Array,每个Pointer对象都指向一个Array_data对象而不是一个Array对象。

何时删除Array_data对象?当没有Array或者Pointer指向某个Array_data对象,就先删除这个Array_data对象。

做法:跟踪这些对象的数目,每个Array_data对象都会包含一个引用计数。这个计数器在创建Array_data的时候设置为1,每次指向这个Array_data的Array或者Pointer被创建时增加1,在指向它的Array或者Pointer被删除时减1.如果引用计数为0,销毁Array_data对象本身。

template<class T> class Array_data {

    friend class Array<T>;

    friend class Ptr_to_const<T>;

    friend class Pointer<T>;

    Array_data(unsigned size = 0): 

       sz(size), data(new T[size]), use(1) { }

    ~Array_data() { delete [] data; }

 

    const T& operator[](unsigned n) const 

    {

       if (n >= sz) 

           throw "Array subscript out of range";

       return data[n];

    }

    T& operator[](unsigned n) 

    {

       if (n >= sz) 

           throw "Array subscript out of range";

       return data[n];

    }

    

    void resize(unsigned);

    void copy(T*, unsigned);

    void grow(unsigned);

    void clone(const Array_data&, unsigned);

    //禁止复制

    Array_data(const Array_data&);  // not implemented

    Array_data& operator=(const Array_data&); // not implemented

 

    T* data;

    unsigned sz;

    int use;

};

 

Array类必须有一个Array_data<T> *,而不是T*,Array<T> *可以将大多数操作转给相应的Array_data对象:

接下来定义一个Pointer ,指向某个Array_data对象,而不是指向Array对象。

template<class T> class Array {

    friend class Ptr_to_const<T>;

    friend class Pointer<T>;

public:

    Array(unsigned size): 

       data(new Array_data<T>(size)) { }

    ~Array() 

    {

       if (--data->use == 0)

           delete data;

    }

    const T& operator[](unsigned n) const 

    {

       return (*data)[n];

    }

    T& operator[](unsigned n) 

    {

       return (*data)[n];

    }

 

    void resize(unsigned n)

    {

       data->resize(n);

    }

 

    void reserve(unsigned new_sz)

    {

       if (new_sz >= data->sz)

           data->grow(new_sz);

    }

 

    Array(const Array& a): data(new Array_data<T>(a.data->sz))

    {

       data->copy(a.data->data, a.data->sz);

    }

    Array& operator=(const Array& a)

    {

       if (this != &a)

           data->clone(*a.data, a.data->sz);

       return *this;

    }

private:

    Array_data<T>* data;

};


 

//为了能让Pointer指向const Array的元素,定义Ptr_to_const

template<class T> class Ptr_to_const {

public:

    Ptr_to_const(const Array<T>& a, unsigned n = 0):

       ap(a.data),   

       sub(n) { ++ap->use; }

 

    Ptr_to_const(): ap(0), sub(0) { }

 

    Ptr_to_const(const Ptr_to_const<T>& p): 

       ap(p.ap), sub(p.sub) 

    {

       if (ap)

           ++ap->use;

    }

 

    ~Ptr_to_const() 

    {

       if (ap && --ap->use == 0)

           delete ap;

    }

 

    Ptr_to_const& operator=(const Ptr_to_const<T>& p) 

    {

       if (p.ap)

           ++p.ap->use;

       if (ap && --ap->use == 0)

           delete ap;

       ap = p.ap;

       sub = p.sub;

       return *this;

    }

 

    const T& operator*() const 

    {

       if (ap == 0) 

           throw "* of unbound Ptr_to_const";

       return (*ap)[sub];

    }

 

protected:

    Array_data<T>* ap;

    unsigned sub;

};

 

template<class T> class Pointer: public Ptr_to_const<T> {

public:

    Pointer(Array<T>& a, unsigned n = 0):

       Ptr_to_const<T>(a,n) { }

    T& operator*() const 

    {

       if (ap == 0) 

           throw "* of unbound Ptr_to_const";

       return (*ap)[sub];

    }

};


现在可以安全的操作该容器了,如下:

Array<int> *ap =new Array<int>(10);

Pointer<int> p(*ap,5);

delete ap;

*p=42;

完整代码见:http://download.youkuaiyun.com/download/xiaoding133/6192957

Java 泛型语法用法通配符泛型类容器类API设计 泛型类是指在类定义中包含一个或多个类型参数的类。这些参数用于指定该类可以操作的数据类型。类似地,也可以定义泛型接口,使得其实现类能够指定具体的数据类型。T remove();Java泛型是构建类型安全且灵活的应用程序的强大工具。通过合理运用泛型,可以在不影响性能的前提下,提高代码的复用性和可读性。无论是容器类、工具类、服务层、持久层还是API设计,泛型都能发挥其独特的优势,帮助我们更好地应对复杂的业务需求。在实际开发中,应当根据具体的业务场景选择合适的泛型模式,以达到最佳的开发效果。 阅读详情

相关推荐

22、2D游戏开发中的设计模式与实用容器类

本文介绍了2D游戏开发中常用的设计模式与实用容器类,涵盖命令、享元、观察者、策略、责任链、组件/组合、装饰器、适配器、原型和外观等十大设计模式,并结合资源管理器、动画器和有限状态机等实用类,详细说明其使用场景、优缺点及代码示例。文章还提供了模式选择建议、性能权衡和模式间协作方法,帮助开发者提升代码的可维护性、灵活性和性能,适用于希望优化架构的游戏开发人员参考与实践。

h6j7k8l9p0的博客 55

1、容器的创建

    通过idea快速搭建一个基于spring的web应用,我们就可以从web.xml中spring监听器开始入手 1.1 context的创建     在tomcat启动webapp应用的时候会使用多线程调用StandardContext的start方法,在StandarContext启动的时候会调用实现了Ser...

zhen_hong的博客 1039

std::vector类模板

使用C++类模板实现的std::vector容器。 对于学习动态数组有很大的帮助。

【面向对象】(c++)自定义模板库的应用

利用面向对象程序设计思想,设计并实现自定义模板库,应包含以下几个部分: 一、容器类模板 线性表Vector(动态数组实现) 栈Stack(静态数组实现) 链表List(链式存储结构实现) 队列Queue(静态数组实现) 映射表Map(平衡二叉树实现) 二、函数模板 排序算法(冒泡、快排、堆排) 查找算法(顺序查找、二分查找) 三、应用实例 四则运算表达式的计算 图的遍历 一、容器类 List(线性表) List.h //Operation /* list_init(); //初始化线性表

jxyyyy的博客 1408

企业微信自建应用全流程部署指南:从HTTPS到API调试

本文提供了一份详尽的企业微信自建应用部署指南,涵盖从HTTPS域名配置、Nginx反向代理到企业微信后台应用创建与API调试的全流程。核心在于构建一个符合企业微信安全要求的“可信”服务环境,并利用JupyterLab等工具进行高效调试,帮助企业快速完成内部系统与企业微信的集成。

weixin_29247219的博客 422

GOM Correlate拉伸试验后处理操作

本文描述了使用GOM Software 2022对拉伸试样进行后处理的操作,包括设置检测点、引伸计、输出应变数据到表格、输出报告为视频等

qq_45008924的博客 4662

[C++系列] 60. queue介绍使用及相关OJ

1. queue的介绍和使用 1.1 queue的介绍 1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。 2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。 3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层...

Y-puyu 的博客 480

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

c++ - 第11节 - stack和queue类

注:1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。

qq_45113223的博客 2792

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4001

容器设计模式

文章目录简介Single-node multi-container patternsSidecars extend and enhanceAmbassadors proxy and representAdapters normalize and present 简介 云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服务的事实标准。其中容器编排系统Kubernetes和容器是基石。 英语好且想直接读英文原版的朋友转这里:Design Patter

看,未来的博客 1088

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9885

容器类的设计及应用

列表是有序的可变容器,元组是有序的不可变容器,集合是无序的唯一元素容器,字典是键值对的映射容器。因此,在设计容器类时,需要综合考虑具体的需求和设计目标,权衡利弊,决定是否使用单例模式。容器类的使用可以提高代码的灵活性和可读性,使得数据的组织和操作更加方便和高效。考虑容器的可扩展性:容器类的设计应该考虑到容器的可扩展性。考虑容器的用途和需求:在设计容器类之前,需要明确容器的用途和需求。考虑容器的灵活性:容器类的设计应该考虑到容器的灵活性。考虑容器的兼容性:容器类的设计应该考虑到容器的兼容性。

超哥量化的博客 729

【Unity的HDRP渲染管线下实现好用的GUI模糊和外描边流光效果_Blur_OutLine_案例分享(内附源码)】

因为没有用到纹理,但介于是UI层,没有MainTeX的时候,会提示报错,所以这里加上了MainTex,最后不在片段着色渲染出来既可。这样UI层级显示正常了,但旋转后的模糊效果,跟背景拼接不上,有很大的偏移。猜测是屏幕UV采样错误导致,只要找到屏幕UV数值,更正过来就可以了,RenderTexture设置一下Size既可,其他的先不管。没有贴图,用Shader实现外描边流光效果。将主相机拖入Render Camera。新建一个RenderTexture。

暴走约伯的博客 1149

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

容器类与包容类库的系统设计。

容器类是与包容类库相关的概念。从设计的层次划分上,包容类库负责顶层的调度管理功能,容器类负责底层的具体功能实现,这样还需要一个衔接二者的接口层、就能够非常轻松的实现一个完全功能的系统。 容器类通常可以被包容类库看成是一个数据块或者内存空间,接口类用于把容器类的实例注册到包容类库中、同时还需要负责为容器类分配系统资源。 容器类可以根据实际的业务需求进行设计,在使用时进行实例化。

luj_1768的博客 217

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java自定义容器类设计

我的网站:欢迎大家访问 设计一个容器类,可以添加任意多及任意类型的数据,打印容器对象的时候可以将所有数据打印出来 示例代码: package Test; import java.util.Arrays; import com.sun.org.apache.bcel.internal.generic.NEW; import sun.security.util.Length; public c...

f2315895270的博客 595

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java容器类源码分析及设计模式

Java container tutorialHashSet的工作原理及实现基本操作TreeSet工作原理及实现LinkedHashSet工作原理及实现ArrayList工作原理及实现概述add函数set和get函数remove函数LinkedList工作原理及实现概述set和get函数ArrayDeque工作原理及实现HashMap工作原理及实现概述两个重要的参数put函数的实现get函数的实现hash函数的实现resize的实现总结TreeMap工作原理及实现概述put函数get函数successor.

gonghaiyu的博客 285

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

容器类与数据传递:软件设计中的数据载体模式

关注行为而非数据位置:在阅读源码时,我们应该更关注类的行为和数据处理的逻辑,而将数据存储的具体位置放在次要地位。选择合适的数据表示:数据的表示可以是POJO类、值类型、数组、基本数据类型或其组合。在编码过程中,我们应该特别注意数据结构的可读性,并优先考虑使用不可变对象来表示数据。理解数据流设计:数据的传递路径反映了系统的架构设计。有时候虽然不清楚数据传递的具体过程,但我们更关心数据传递的最终结果和影响。

2501_93078354的博客 503

设计模式之2 iterator模式-主要是容器类的应用

容器类是java当中非常重要的类。可以说,基本上每个项目都要用到容器类。通过这个设计模式,主要是反映通过接口来控制提供规定的方法名。具体的实现交给不同的具体的类去实现。collection接口是如此,iterator也是如此。   本文word版本(可下载):   http://wenku.baidu.com/view/1dc00c6acaaedd3383c4d34a.html   首

utnewbear的专栏 663

《java程序设计基础》容器类

1.列表接口List 利用LinkedList类构造一个先见后出的堆栈 package yuan; import java.util.*; class StringStack{ private LinkedListld = new LinkedList();//创建LinkedList对象ld public void push(String name) { //入栈操作 ld.addFirst(name); //将name添加到链表的头 } public String pop() { //出栈操

qq_45724328的博客 219

delphi 容器类 3

出于效率的考虑,Delphi并没有象C++和Java那样将字符串定义为类,因此TList本身不能直接存储字符串,而字符串列表又是使用非常广泛的,为此Borland提供了TStrings类作为存储字符串的基类,应该说是它除了TList类之外另外一个最重要的Delphi容器类。要注意的是TStrings类本身包含了很多抽象的纯虚的方法,因此不能实例化后直接使用,必须从TStrings类继承一个基类实现

流年~~ 3983

C++沉思录之三——设计容器类

一、对容器的基本认识   总的来说,容器应该包含放在其中的对象的副本,而不是对象本身。 二、复制容器意味着什么?   通常将容器成为模板,而容器内的对象的类型就是模板参数。Container<T>   显然,如果复制容器只不过简单地使两个容器指向同一个底层对象,而不是复制容器内的元素,那么效率就会提高很多。毕竟,大多数复制是在调用函数时发生的,像下面这样编写代码会犯一个很常见的...

weixin_30920853的博客 134

Java程序设计——匿名类、异常类与容器类

其次,在异常处理部分,我尝试编写了代码块,但在处理多个异常时出现了捕获顺序错误的问题。首先,在理解匿名类时,起初对其语法和使用场景感到困惑,尤其是如何在接口或抽象类中直接实现匿名类。通过查阅资料和反复练习,我掌握了匿名类的定义方式及其简化代码的优势,例如在事件监听器中直接重写方法,避免了单独创建子类的繁琐。最后,在容器类的使用中,我重点练习了集合类的增删改查操作。在本次实验中,我学习了Java的匿名类、异常处理机制以及常用容器类的使用,收获颇丰,但也遇到了一些问题。3.学会Java常用容器类的使用。

m0_74043762的博客 675

容器类原理。

容器是个非常泛化的概念,盒子、箱子、柜子、瓶子、杯子、桶、锅碗瓢盆,身边的许许多多的器物都可以叫做容器。容器类是容器这个概念应用到软件中的产物。 许多非常标准的容器类,它们的制作者却可能没有想到过容器类这个概念。比如:微软的套间模型;360为代表的杀毒软件厂家广泛使用的沙箱模型;就都是设计得非常优秀的容器类。 容器类的定义是非常困难的,勉强为之:容器类是可以容纳并运行其他代码封装的类。 容器最重要的考量就是边界与容量。容器类的设计最重要的考量是:线程闭包,地址空间闭包,依赖关系闭包。能够满足这三个要求的容器

luj_1768的博客 144
上一篇: 算术表达式树
下一篇: C++模板:函数模板、类模板、模板与继承
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值