java学习实录-------集合理论(1)

这里是学习集合主要涉及的理论知识和少许实例,以为集合的东西比较多,可能分多次写完。 后续会花一些时间写一篇关于集合方法底层的博客 可以期待下 

Java为什么会有集合存在?


在编程中,我们常常需要集中存放多个数据,比如:学校的学生花名册,考试成绩等等,类似情况。有人会会说:数组也可

以呀!没错,但是数组有它的优点也有它的不足之处:

1.我们在使用数组时,一旦为数组指定长度,那么这个数组的长度就会是不可变的,如果需要保存数量变化的数据,数组就显的

无能为力了。 

2.数组固然方便使用,但是数组没有办法保存映射关系的数据,比如:语文:89,数学:100。。。或者:某某 :男,某某:女

等等。

为了保存数量不确定的数据,以及保存具有映射关系的数据(也称为关联数组),Java提供了集合类。集合类主要负责保存、盛

装其他数据,因此集合类也被称为容器类。

区别:数据元素既可以是基本类型的值,也可以是对象(实际上保存的是对象引用的变量),集合只能保存对象(实际上也是保存

对象的引用变量,通常习惯上认为集合里保存的是对象)。

数组和集合之间是可以相互转变的 ,集合中有一个toArray()的方法,作用是将集合转换成规定类型的数组

当我们指定的泛型数组 长度小于集合元素个数时,得到的数组对象是新对象,不是我们指定的泛型数组

当我们指定的泛型数组长度不小于集合元素个数时,得到的数组对象是执行的泛型数组对象 

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test {
	public static void main(String[] args) {
		List<String> li=new ArrayList<String>();
		li.add("nihao");
		String[] s1=new String[5];
		li.toArray(s1);
		System.out.println(Arrays.toString(s1));
        //输出[nihao, null, null, null, null]
	}
}

数组 

 

     数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你

创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,

所以当你越界访问时,会抛出RuntimeException(运行时异常 实际上ArrayIndexOutOfBoundsException数组下标越界)。

      与其他容器类相比(也就是List,Set和Map),数组会在编译的时候作类型检查,从而防止你插入错误类型的对象,或者在

提取对象的时候把对象的类型给搞错了,JAVA在编译和运行的时候都能阻止你将一个不恰当的消息传给对象。至于效率,数组无

疑是要高于其他容器类的,因为有些容器类的实现就是基于数组的,比如ArrayList。不论从类型检查还是效率的角度来考虑,我

们首选数组来作为容器都是没错的,但是数组的缺点就是功能太弱了,所以才会有容器类的出现。

        其实数组还是有一个工具类的。java.util包里面有一个Arrays类,它包括了一组可以用于数组的static的工具方法,其中最基

本的是四个方法:用来比较两个数组是否相等的equals();用来填充数组的fill();用来对数组进行排序的sort();以及用于在一个

已经排序的数组中查找元素的binarySearch()。此外还有一个asList()方法,它接受一个数组,然后把它转成一个List容器。返回的

List的集合元素类型由传入的数组的元素类型决定 注意:返回的集合我们不能对其进行增删元素,否则抛出异常。并且对集合的

元素进行修改会影响数组对应的元素 如果想对集合进行增删改,可以将此集合里的元素添加到一个新集合对象中。

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test {
	public static void main(String[] args) {
		List<String> li=new ArrayList<String>();
		li.add("nihao");
		String[] s1=new String[5];
		li.toArray(s1);
		System.out.println(Arrays.toString(s1));
		List<String> li2= Arrays.asList(s1);
		System.out.println(li2.get(0));
		System.out.println(li2.size());
		//这里将数组s1的所有元素[nihao, null, null, null, null]转换成了一个长度为5的集合
		li2.add("wobuhao");
		//这里报运行时异常UnsupportedOperationException  

	}
}

JAVA标准类库还提供了一个System.arraycopy()的静态方法,它能以较快的速度拷贝数组。

        
 

集合

      泛型机制

泛型是JavaSE5.0引入的新特性,它的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型通过传入的参数

进行指定。广泛应用在集合框架中,所有的集合类型都带有泛型参数,

创建集合对象时可以直接指定放入集合中的元素类型,Java编译器可以根据此类型进行类型检查,可以减少代码在运行时出现的

错误可能性
 

package test;

import java.util.ArrayList;
import java.util.List;

public class test {
	public static void main(String[] args) {
		List<String> li=new ArrayList<String>();
		li.add("nihao");
		li.add(1);
        //这里会报错 类型不匹配
        /*The method add(int, String) in the type List<String> is not applicable for the             
          arguments (int)*/
	}
}

 

1、Iterator接口

  Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口

LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在

遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,

HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()

访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。

集合容器大致分为三个

集合一共有两个顶级父接口 collection 和map 我们先来看一下Collection。

2、Collection接口

三个子接口 Set List Queue


Set : 类似一个罐子,包一个数据添加到集合时,Set无法记住添加这个元素的顺序,所以Set集合内的元素不允许重复(否则系统

无法准确识别这个元素);如果访问Set中的元素,只能根据元素本身来访问(这也是Set不能有重复的原因)。

List : 非常像一个数组,它可以记住每次添加元素的数序,且List的长度可变。如果访问List中的元素可以直接根据元素的索引来

访问。
 

Queue:实际上集合容器一般认为是List Set Map 三种 Queue本来是单独的一类,不过在SUN的JDK里就是用LinkedList来提供

这个功能的,主要方法是offer/pull/peek,因此归到这里呢。我们最后说 

 1)List

  List 是一个元素有序、且可重复的集合,集合中的每个元素都有其对应的顺序索引,从0开始

  List 允许使用重复元素,可以通过索引来访问指定位置的集合元素。

  List 默认按元素的添加顺序设置元素的索引。

  List 集合里添加了一些根据索引来操作集合元素的方法

因为我们肯定不能直接使用接口 所以使用的是他的实现类LinkedList 和ArrsyList 以及被弃用的的Vector

a)    实现类ArrayList和LinkedList

   ArrayList是实现了基于动态数组的数据结构,对象存储在连续的位置上

   LinkedList基于双链表的数据结构,链表中的每个节点都包含了前一个和后一个元素的引用。

 对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remova)    实现类

ArrayList和LinkedList

 ArrayList是实现了基于动态数组的数据结构,  对象存储在连续的位置上

 LinkedList基于双链表的数据结构,链表中的每个节点都包含了前一个和后一个元素的引用。

对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。

对于新增和删除操作,LinkedList比较占优势,因为ArrayList要移动数据。

b)Vector

Vector 也是子接口List的一个实现类,和List用法差不多,在使用上,Vector是线程安全的,ArrayList是线程不安全的。不过即使

为保证 List 集合线程安全,也不推荐使用 Vector。

c)方法

List集合的方法无非add/remove/get/set。也就是增删改查。只是提供了一些针对于索引的方法重载

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test {
	public static void main(String[] args) {
		List<String> li=new ArrayList<String>();
		List<String> li1=new ArrayList<String>();
		li.add("你好");
		li.add("我很好");
		li1.add("我还行");
		li1.add("我不怎么样");
		//添加方法add(); 参数为泛型元素
		li.add(1, "Nihao");
		System.out.println(li);
		//添加方法2 add();重载 参数为插入下标和泛型元素 
		//这里输出为[你好, Nihao, 我很好]
		li.addAll(li1);
		System.out.println(li);
		//方法addAll 作用将另一个集合添加进本集合 还有一个可以传索引的重载方法 作用是可以从指定开始
		//这里输出为[你好, Nihao, 我很好, 我还行, 我不怎么样]
		//get() set() 也就是查和改 remove() 一般都有从尾部操作 和指定位置操作的重载方法  这里笔者
		//就不浪费笔墨 可以查询api

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值