容器和泛型

本文深入探讨Java中容器和泛型的概念与应用,包括不同类型的容器如List、Set及Map的特点及其内部实现原理,同时介绍了如何利用泛型提高代码的安全性和效率。

        在Java编程中,对象是个永恒的话题,你有对象没敲打,没有?那就new一个吧,哈哈~ 好了废话不多,开始正题,就如昨天所说,为啥开始写笔记,其中之一就是thinking in Java 第十一章,有关泛型和容器的问题真的很重要.在说泛型和容器之前我们先说说对象,我们平时编程中接触最多的就是对象了,谁让Java就是面向对象的编程呢,但是你会发现,我们不可能随时随地的就是用一个对象或者两个,三个?更多的时候我们使用很多对象.那么此时该怎么做呢,我想你也应该想到把这些对象装到一个容器里,要多少装多少,然后直接取用,那多方便.

但是你会发现,虽然容器在装对象的时候没有任何限制,但是取出来的时候会出现一个问题,这是因为作为一个容器他继承object类,而Java中所有对象都是最终继承object类的,因此在存入的时候没有任何问题,但是,取出来的时候它也会默认是object类的,这个时候就需要我们对应去转型,而此时就会出现麻烦,你并不知道取出来的是什么类型抓狂,这个时候泛型在这里就起作用了,它在申明容器时就固定了容器的类型,你只能存这个类型的类,其他类存就会报错.同样取出来的时候容器识别泛型的类型并自动帮你转型.泛型基本申明方式:List<Object> list = new ArrayList<Object>(); object就是你要申明的对象类型!

有关容器我们需要关注Collection和Map,Collection一个独立的元素序列,并且这些元素服从一个或者多个规则,Map则是一组成对的键值对对象,允许你使用键查找值.

在Collection中又有list:按照插入顺序保存元素

                             set:不能有重复的元素

                             queue:按照排队的规则来确定对象产生的顺序(即从一端插入对象,从另一端移除对象)

同时,list中又有ArrayList:按照插入顺序保存元素,也具有更快的查找元素,较慢的插入和移除元素

LinkedList:按照断开链接放入元素,也具有更快的插入元素,较慢的查找元素

          set中又有HashSet:使用相当复杂的方式存储元素(哈希表形式),同样它是最快获取元素方式.

         TreeSet:按照比较结果升序保存对象

         LinkedHashSet:按照被添加顺序保存对象

在Map中又有HashMap:它没有按照明显的顺序来保存元素(即无序的,它通过一种非常快的算法控制顺序),但是它却又最快的查找技术.

        TreeMap:按照比较结果的顺序保存键.

        LinkedHashMap:按照插入顺序保存键,同时保留HashMap的查找速度

有关容器的遍历方式我就不赘述了,网上一大堆,这里我只想说迭代器,因为自己还不是完全理解了只是会用,而且它很强大,先说它几个特性,明天继续说他的更重要特性,首先它拥有几个方法:          iterator(),他要求容器返回一个Iterator;

      next():获取序列的下一个元素;

      hasNext():检查序列中是否还有元素;

      remove():将迭代器新近返回元素删除,注意这里是新近返回元素,它意味着,首先是返回在移除,即:Iterator.next();然后才允许Iterator.remove();如下两种方式:

      List<Object> list = new ArrayList<Object>();

      Iterator<Object> it = list.iterator();

      while(it.hasNext()){

          Object o = it.next();

          o.remove();

      }

     for(Object o : list){

          System.out.println(o);

      }

好的,今天就到这里,给自己加油!明天继续!


在C#中,`object`容器容器是两种用于存储数据的机制,它们各有优劣,适用于不同的应用场景。 ### `object`容器的特点 `object`容器指的是使用`object`类作为元素类的集合类,例如`ArrayList`或`List<object>`。由于`object`是所有类的基类,因此可以将任何类的对象放入此类容器中。这种灵活性带来了方便,但也伴随着一些限制性能开销。 - **优点**: - **灵活性高**:可以存储任意类的对象,这在处理不确定数据类时非常有用。 - **向后兼容性好**:对于早期版本的.NET框架来说,这是唯一的选择之一。 - **缺点**: - **性能较低**:当值类被添加到`object`容器中时,会触发装箱操作;而从容器中取出时,则需要进行拆箱操作。这两个过程都会带来额外的性能开销。 - **类安全性差**:因为元素以`object`形式存储,所以在取回时必须显式转换回具体类,这可能导致运行时错误,如果转换不正确的话。 ### 容器的特点 容器如`List<T>`、`Dictionary<TKey, TValue>`等,是在.NET 2.0引入的功能,它允许指定集合中的元素类,从而提供更强的类安全性更好的性能。 - **优点**: - **类安全**:编译器会在编译阶段检查类匹配,避免了运行时因类不匹配导致的问题。 - **无需装箱/拆箱**:对于值类而言,直接存储在容器中不会产生装箱或拆箱的操作,因此提高了程序执行效率。 - **代码重用性**:通过,可以编写一次性的类或方法,并应用于多种数据类,增强了代码的复用能力。 - **缺点**: - **灵活性受限**:与`object`容器相比,容器要求预先确定元素的具体类或者接口,这可能限制了其在某些动态场景下的应用。 - **学习曲线**:对于初学者来说,理解的概念及其使用方式可能会有一定的难度。 ### 总结 选择使用哪种类容器取决于具体的使用情况。如果项目需要更高的性能更严格的类检查,那么应该优先考虑使用容器。相反,如果应用程序需要极大的灵活性,并且能够接受由此带来的潜在性能损失,则可以选择`object`容器。 ```csharp // 示例:使用非ArrayList ArrayList arrayList = new ArrayList(); arrayList.Add(1); // 装箱 int numberFromArrayList = (int)arrayList[0]; // 拆箱 // 示例:使用List<T> List<int> genericList = new List<int>(); genericList.Add(1); // 不涉及装箱 int numberFromGenericList = genericList[0]; // 不涉及拆箱 ``` 上面的例子展示了`ArrayList`(一种`object`容器`List<int>`(一种容器)之间的差异。可以看到,在使用`ArrayList`时,整数被隐式地转换为`object`(即装箱),而在检索时又必须显式地转换回`int`(即拆箱)。而在`List<int>`的情况下,这些步骤都被省略了,因为列表已经知道它包含的是`int`类的数据[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值