数组和集合

数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。
     JAVA里面提供的其他容器还包括List,Set和Map。他们处理对象的时候就好像这些这些对象都没有自己的类型一样,容器将它所含的元素都看成是JAVA中所有类的根类Object类型的,这样我们只需创建一种容器,就能把所有的类型的对象全部放进去。但是当取出的时候,那就需要我们自己进行类型转换了,不过在JAVA Tiger版里面新引入了“泛型”的概念,结合容器类一起使用就可以解决类型转换的问题,关于“泛型”这就不详细讲解了。从上面的角度来看,这种做法很不错,但是就是苦了primitives,如果是常量的话,可以把primitive转换成wrapper类然后放进容器里面,如果是变量的话,那就只能放在你自己的类里了。与其他容器类相比,数组会在编译的时候作类型检查,从而防止你插入错误类型的对象,或者在提取对象的时候把对象的类型给搞错了,JAVA在编译和运行的时候都能阻止你将一个不恰当的消息传给对象。至于效率,数组无疑是要高于其他容器类的,因为有些容器类的实现就是基于数组的,比如ArrayList。不论从类型检查还是效率的角度来考虑,我们首选数组来作为容器都是没错的,但是数组的缺点就是功能太弱了,所以才会有容器类的出现。
     要多说几句的就是,java.util包里面有一个Arrays类,它包括了一组可以用于数组的static的工具方法,其中最基本的是四个方法:用来比较两个数组是否相等的equals();用来填充数组的fill();用来对数组进行排序的sort();以及用于在一个已经排序的数组中查找元素的binarySearch()。所有这些方法都对primitives和Object进行了重载。此外还有一个asList()方法,它接受一个数组,然后把它转成一个List容器。JAVA标准类库还提供了一个System.arraycopy()的静态方法,它能以较快的速度拷贝数组,对primitive和Object都进行了重载,但是注意当对Object数组进行拷贝时,进行的是浅拷贝(shallow copy)。

1.linkedList 内部双向链表结构存储数据,存取两端数据效率高
 LinkedList 遍历
  Iterator it = list.iterator();
  while(it.hasNext()) {
   Object o = it.next();
   ...
  }
2.HashMap 1)哈希表结构,存储键值对数据。2)快速查找数据 3)乱序   (4)键必须重写hashCode()和equls()方法(5)hashCode()和  equals()必须使用相同的属性来运算活判断(6)hashCode方法的实现应保证:1、equals()相等的对象,必须具有相同的哈希值2、具有相同哈希值得对象,equals()不保证相等(应尽量相等)
  (7)存数据的步骤:1、获得键的哈希值2.通过哈希值运算得到一个索引位置(3)创建一个Entry实例,封装键和值两个数据(4)将Entry实例放入2计算出的位置
 (4.1)如果此位置已经存在数据(4.1.1)equals比较相等,覆盖(4.2.2)equals比较不相等,链表挂在一起。
   (8)、获取数据的步骤1.获取键的哈希值2.通过哈希值运算得到一个索引位置3.若果只有一个对象,equals比较(3.1)相等,取出(3.2)不等,不取(4)如果存在对个对象,依次执行equals比较,直到找到相等的为止
3.TreeMap 1)存放键值对数据2)二叉树存储结构3)快速查找算法4)从小到大 5)键可以实现Comparable接口,实现其compareTo()方法 6)也可以在TreeMeep中外接比较器Comparator,对数据比大小
4. HashSet 1)内部使用HashMap实现 2)不重复,乱序
5 .TreeSet 1)内部使用TreeMap实现 2)方法与HashSet相同 3)不重复,从小到大
6、谁可以说出HashMap和HashSet的相同点和不同点?
 Map集合,就是有一对属性值得集合,属性包括key,和value。关键字key是唯一不重复的。map是一个有序集合,所以查询起来速度很快。而HashSet就像是吧HashMap中的value去掉,说白了就是只有一个key和HashMap集合。Set是数学中定义的集合,所以元素无序,且不能重复添加。
7、集合数组相互转换?
   1)数组转集合:List list=Arrays.asList(array);
   2)集合转数组:String[] arr=list.toArray(new String[list.size()]);
 String[] arr=list.toArray(new String[0]);

8.泛型
   1)什么是泛型?泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
   2)泛型的类型?泛型的定义主要有以下两种:
在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型编程语言支援泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的编程语言只能达到部分目的。
   3)Java 的泛型
Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。Java 允许对个别泛型的类型参数进行约束,包括以下两种形式(假设 T 是泛型的类型参数,C 是一般类、泛类,或是泛型的类型参数):T 实现接口 I 。T 是 C ,或继承自 C 。一个泛型类不能实现Throwable接口。

9.for-each循环。
  for(int element : a)//int element  其中的element相当于    for中的i,int是element的数据类型(我的个人理          解不知道对不对~~)
    System.out.println(element);
相当于:
    for(int i=0;i
      System.out.println(a[i]);//int element  其中的element相当于  for中的i, 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值