Java基础(二)集合

一.Java类集合基本认识
在编程中经常需要集中存放多个数据,从我们的认识里,数组是一个很好的选择,前提是我们需要事先知道我们需要操作数据的数量。数组需要初始化长度,而且一旦指定数组长度,后面不可以改变。如果我们需要在编程中保存或者操作一组动态增长的数据,便可以使用Java集合类

集合类主要负责动态保存,储存数据,因此集合也可以成为数据的容器。集合类主要位于java.util包下,我们可以从数学的角度来理解集合

二.集合体系
在这里插入图片描述

如上图:接口:是代表集合的抽象数据类型,Collection、List、Set、Map 。
实现(类):是集合接口的具体实现,如ArrayList、LinkedList、HashSet、HashMap
算法:是实现集合接口的对象里的方法执行的一些常规的计算,例如:搜索和排序

集合框架定义了一些接口,如下:

接口接口描述
CollectionCollection 是最基本的集合接口,Collection 接口存储一组不唯一,无序的对象。
ListList接口是一个有序的 Collection,存储一组不唯一,有序(插入顺序)的对象
SetSet 具有与 Collection 完全一样的接口,不保存重复的元素。存储一组唯一,无序的对象
MapMap 接口存储一组键值对象,提供key(键)到value(值)的映射。
SetSet 具有与 Collection 完全一样的接口,不保存重复的元素。存储一组唯一,无序的对象

Set和List的区别:
1.Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

2.Set检索效率低,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。

3.List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,会引起其他元素位置改变 ,ArrayList,LinkedList,Vector

三.集合的遍历
我们会将数组里的数遍历出来,集合也可以,数组一般采用for循环或者增强for,这两个方法也可以用在集合中,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口

1.遍历 ArrayList

public class JiheTest1 {
	public static void main(String[] args) {
		
		List<String> list= new ArrayList<String>();
		list.add("zhang");
		list.add("jia");
		list.add("xiao");
		list.add("ge");
		
		//第一种方法使用foreach遍历List
		for (String str:list) {
			System.out.println(str);
		}
		第二种,把集合变为数组相关的内容遍历
		String[] atrArry = new String[list.size()];
		list.toArray(atrArry);
		for (int i = 0; i < atrArry.length; i++) {
			System.out.println(atrArry[i]);
		}
		第三种遍历方式,使用迭代器遍历
	    Iterator<String>  ite = list.iterator();
	    while (ite.hasNext()) {          //来判断下一个元素有值
			System.out.println(ite.next());
			}
		}
}

分析:三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度,比较方便些

2.遍历 LinkedList

public class LinkedList {
	public static void main(String[] args) {
		//LinkedList经常用在增删操作较多
		List<String> list = new java.util.LinkedList<String>();
		list.add("zhang");
		list.add("jia");
		list.add("xiao");
		list.add("ge");
		list.add("zhang");
		
		//Iterator 遍历输出
		/*Iterator迭代器,有三种方法
		 *next():获得序列的下一个元素
		 *hasNext():序列中是否还有元素
		 *remove():将迭代器新返回的元素删除*/
		
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			String string = (String) it.next();
			System.out.println(string);
		}
	}
}

java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现

3.遍历 HashSet,可以和上面的LinkedList进行对比

public class HashSetTest {
public static void main(String[] args) {

    Collection<String> list = new HashSet<String>();//打印结果zhang,jia,zhang 但是Set集合不允许重复
    list.add("zhang");
    list.add("jia");
    list.add("zhang");
    /*Iterator迭代器,有三种方法
	 *next():获得序列的下一个元素
	 *hasNext():序列中是否还有元素
	*remove():将迭代器新返回的元素删除*/
    Iterator<String> Ite = list.iterator();
    while (Ite.hasNext()) {
		String string = (String) Ite.next();
		System.out.println(string);
     }
    }
}

遍历 Map

public class MapTest {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("1","zhang");
		map.put("2", "jiao");
		map.put("3", "xiao");
		map.put("4", "ge");
		
		//第一种遍历,普遍使用,二次取值
		System.out.println("通过Map.keySet遍历key和value");
		for (String key: map.keySet()) {
         	System.out.println("key="+key+"and value="+map.get(key));
		}
		
		//第二种
		System.out.println("通过Map.entrySet使用iterator遍历key和value");
		Iterator<Map.Entry<String, String>> it =map.entrySet().iterator();
		 while (it.hasNext()) {
	       Map.Entry<String, String> entry = it.next();
		      System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
		}
	    //第三种:推荐,尤其是容量大时
	      System.out.println("通过Map.entrySet遍历key和value");
	      for (Map.Entry<String, String> entry : map.entrySet()) {
	      System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
	     }
	    
	    //第四种
	   System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
	   for (String v : map.values()) {
	    System.out.println("value= " + v);
	   }
	}
}

Map 和 Set 集合的关系

都有几个类型的集合。HashMap 和 HashSet ,都采哈希表算法;TreeMap 和 TreeSet 都采用 红-黑树算法;LinkedHashMap 和 LinkedHashSet 都采用 哈希表算法和红-黑树法

还有:ArrayList和LinkedList区别:
1.ArrayList 是 List 接口的一种实现,它是使用数组来实现的。
2.LinkedList 是 List 接口的一种实现,它是使用链表来实现的。
3.ArrayList 遍历和查找元素比较快。LinkedList 遍历和查找元素比较慢。
4.ArrayList 添加、删除元素比较慢。LinkedList 添加、删除元素比较快。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值