关于java集合的总结

 

Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放.
   集合对象:用于管理其他若干对象的对象


List:

   有顺序的,元素可以重复;

   遍历:for,迭代;

   排序:Comparable Comparator Collections.sort()
ArrayList:

   底层用数组实现的List;
   特点:查询效率高,增删效率低 轻量级 线程不安全;
LinkedList:

   底层用双向循环链表实现的List;
   特点:查询效率低,增删效率高;

Vector:

   底层用数组实现List接口的另一个类;
   特点:重量级,占据更多的系统开销,线程安全;

 

Set:

   无顺序的,元素不可重复(值不相同);
    遍历:迭代;
   排序:SortedSet
HashSet:

   采用哈希算法来实现Set接口;
   唯一性保证:重复对象equals方法返回为true;
   重复对象hashCode方法返回相同的整数,不同对象hashCode尽量保证不同(提高效率);

SortedSet:

   对一个Set排序;
TreeSet:

   在元素添加的同时,进行排序。也要给出排序规则;
   唯一性保证:根据排序规则,compareTo方法返回为0,就可以认定两个对象中有一个是重复对象。

 

Map:

   元素是键值对:key唯一不可重复,value可重复;

   遍历:先迭代遍历key的集合,再根据key得到value;

SortedMap:元素自动对key排序

HashMap:

   轻量级,线程不安全,允许key或者value是null;
Hashtable:

   重量级,线程安全,不允许key或者value是null;
   Properties:Hashtable的子类,key和value都是String

TreeMap:

   集合是指一个对象可以容纳了多个对象(不是引用),这个集合对象主要用来管理维护一系列相似的对象。

 

集合接口类层次:
位于package java.util.*;
Collection

Set  List  Map
↑          
SortedSet SortedMap

1) Set: 集合类中不允许有重复对象;
2) SortedSet: 和Set接口同,但元素按升序排列;
3) List: 元素加载和移出时按照顺序,可以保存重复对象。
4) Map: (key-value对)存储了唯一关键字辨识和对应的值。
5) SortedMap: 和Map类同,但对象按他们关键字的升序排列。

 

集合类层次:(注:JAVA1.5对JAVA1.4的最大改进就是增加了对范型的支持)

                                           Collection 
                                               ↑ 
                    |ˉˉˉˉˉˉˉˉˉˉˉˉˉ|ˉˉˉˉˉˉˉˉˉˉˉˉˉ| 
                  (List)                      (Set)                     (Map) 
             |ˉˉˉ|ˉˉˉ|                  |ˉˉˉ|                |ˉˉˉ|

 ArrayList   LinkedList  Vector           HashSet  TreeSet      TreeMap   Hashtable Hashmap 
                                                                                    

Collection接口的方法:
    add(Objecto)
   addAll(Collection c)
   contains(Object o)
   containsAll(Collection c)
   remove(Object o)
   removeAll(Collection c)
   clear()
   equals(Object o)
   isEmpty()
   iterator()
    size()
   toArray()
   toArray(Object[] o)


五个最常用的集合类之间的区别和联系:
    1.ArrayList:元素单个,效率高,多用于查询
    2.Vector:元素单个,线程安全,多用于查询
   3.LinkedList:元素单个,多用于插入和删除
    4.HashMap:元素成对,元素可为空
    5.HashTable:元素成对,线程安全,元素不可为空

 

ArrayList:
   底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。
LinkedList:

   底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。双向循环链表的查询效率低但是增删效率高。
   ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的。LinkedList经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。

Vector:(与ArrayList相似,区别是Vector是重量级的组件,使用消耗的资源比较多)
   为了保证线程的安全,在考虑并发的情况下用Vector,在不考虑并发的情况下用ArrayList。


java.util.stack

   stack即为堆栈,父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。对于堆栈和队列只能用push类和get类。Stack类以后不要轻易使用。

   实现栈一定要用LinkedList(在JAVA1.5中,collection有queue来实现队列);

 

Set-HashSet实现类:
   遍历一个Set的方法只有一个:迭代器(interator)。
   HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。
   在Object中除了有finalize(),toString(),equals(),还有hashCode()。
   HashSet底层用的也是数组。
   当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode:
       int hc=o.hashCode(); 返回的hashCode为整数值。
    IntI=hc%n;(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n为6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。

   如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。


在实例中,定义student对象时覆盖它的hashcode。
   因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。现在,在大部分的JDK中,都已经要求覆盖了hashCode。
   结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。

例子:
public int hashCode(){
return name.hashcode()+age;
}
这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。

 

使用hashSet的优点:
   hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较来确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。但是hashSet增删高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。

 

比较
Collections类(工具类―――全是static 方法)
    Publicstatic int binarySearch(List list,Object key)
    Publicstatic void Sort(List list,Comparator com)
    Publicstatic void sort(List list)
方法一:
Comparator接口
    Intcompare(Object a,Object b)
    Booleanequals(Object o)
例子:
import java.util.*;
public class Test {
    publicstatic void main(String[] arg) {
       ArrayList al = new ArrayList();
       Person p1 = new Person("dudi");
       Person p2 = new Person("cony");
       Person p3 = new Person("aihao");
       al.add(p1);
       al.add(p2);
       al.add(p3);
       Collections.sort(al,p1);
       for(Iterator it = al.iterator();it.hasNext();){
           Person p = (Person)it.next();
           System.out.println(p.name);
       }
    }
}
class Person implements java.util.Comparator
{
      publicString name;
      publicPerson(String name){
       this.name = name;
      }
      publicint compare(Object a,Object b){
       if(a instanceof Person && binstanceof Person){
       Person pa = (Person)a;
       Person pb = (Person)b;
       return pa.name.compareTo(pb.name);
      }
    return0;
    }
    publicboolean equals(Object a){return true;}
}
方法二
Java.lang.Comparable
       Public int compareTo(Object o)


Class Person implements java.lang.Comparable{
       Public int compareTo(Object o){
           Comparable c1=(Comparable)this;
           Comparable c2=(Comparable)o;
           Return c1.name.compareTo(c2.name );
       }
}

Collection和Map是两个毫无关系的接口,Collection是对象集合,Map是键值对集合;
Collection有两个子接口List和Set,List可以通过下标(1,2..)来取得值,值可以重复;而Set只能通过游标来取值,并且值是不能重复的;
  ArrayList,Vector,LinkedList是List的实现类  
  ArrayList是线程不安全的,Vector是线程安全的,这两个类底层都是由数组实现的  
  LinkedList是线程不安全的,底层是由链表实现的  

  HashTable和HashMap是Map的实现类  
  HashTable是线程安全的,不能存储null值  
  HashMap不是线程安全的,可以存储null值 

 

   实现Collection接口的类,如果底层是用数组实现,那么添加新元素花费的时间会比较多,因为他要保证这个数组的容量足够大,所以在每添加一个新元素的时候都要自动扩大数组容量....

   如果实现Collection接口的类底层是用链表实现,那么他查找一个元素所花费的时间会比较长,因为他不能通过下标来查找,只能一个个的遍历....

   所以在add()操作比较多的时候用LinkedList性能比较好,在search()操作比较多的时候用ArrayList和Vector比较好。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值