Java基础——集合框架

一、集合

         Java集合类存放于 java.util 包中,是一个用来存放对象的容器。Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。

     1)集合中只能存放对象;

     2)集合存放的是对象的引用,对象本身仍在堆内存中;

     3)集合可以存放不同类型、不同数量的数据类型(Map)。

二、集合框架    

图片来源:http://blog.csdn.net/u010887744/article/details/50575735

高清图地址:https://img-blog.csdn.net/20160124221843905

三、集合详解

  Collection集合框架

  顶层接口:

public interface Iterable<T> {
    /**
     * 返回类型 T元素的迭代器。
     */
    Iterator<T> iterator();

    /**
     * 执行给定的操作的每个元素 Iterable直到所有的元素都已经被处理或行动将抛出一个异常。
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    /**
     * 在Iterable描述的元素上创建一个spliterator
     * @since 1.8
     */
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

  迭代器接口:

public interface Iterator<E> {
    /**
     * 如果仍有元素可以迭代,则返回 true。
     */
    boolean hasNext();

    /**
     * 返回迭代的下一个元素
     */
    E next();

    /**
     * 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
     */
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    /**
     * 为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常。
     * @since 1.8
     */
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

}

  核心接口:

public interface Collection<E> extends Iterable<E> {
         ..........
}

  子接口:

  1)、List<E>:有序,可重复,有索引 ,可以有null元素

public interface List<E> extends Collection<E> {
            .........
}

   实现类:

        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new LinkedList<>();
        List<Integer> list3 = new Vector<>();

  ArrayList<E>:ArrayList是基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组。

          特点:底层数据结构是数组,查询快,增删慢;线程不安全,效率高;

  LinkedList<E>:implements List<E>, Deque<E>。实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的    元素。同时它还实现Deque接口,即能将LinkedList当作双端队列

          特点:底层数据结构是链表,查询慢,增删快;线程不安全,效率高;

  Vector<E>:Vector和ArrayList在用法上几乎完全相同,基本被淘汰

          特点:底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合;

  其他:

          Stack:vector提供的子类,用于模拟"栈"这种数据结构(LIFO后进先出)

          CopyOnWriteArrayList:

         CopyOnWriteArrayList是ArrayList的线程安全的变体,其中的所有可变操作(add, set等)都是对底层数组进行一次新的复制来实现的,相比ArrayList的要慢一些,适用于读多写少的场景 ;

          在并发操作容器对象时不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素是一致的 ;
          容器对象的复制需要一定的开销,如果对象占用内存过大,可能造成频繁的YoungGC和Full GC ;
          CopyOnWriteArrayList不能保证数据实时一致性,只能保证最终一致性

  2)、Set<E>:不可重复,无索引

public interface Set<E> extends Collection<E> {
            .........
}

  实现类:

        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new LinkedHashSet<>();
        Set<Integer> set3 = new TreeSet<>();

  HashSet<E>:HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性      能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该    HashCode值决定该对象在HashSet中的存储位置。

  HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等

  特点:底层数据结构是数组;无序、不可重复;线程不安全;

  LinkedHashSet<E>:

  特点底层采用 链表和哈希表的算法,链表保证元素的添加顺序,哈希表保证元素的唯一性;有序、不可重复;线程不安全;

  TreeSet<E>:TreeSet是SortedSet接口的唯一实现类,可以确保集合元素处于排序状态

  特点:底层使用红黑树算法,擅长于范围查询;有序、不可重复;线程不安全;

  3)、Queue<E>:链表结构,先进先出

public interface Queue<E> extends Collection<E> {
                ...........
}

 Map集合框架

key-value 的键值对,key 不允许重复,value 可以;双列

Map接口的三个实现类:

HashMap<K,V>:线程不安全,高效,支持null;

HashTable:线程安全,低效,不支持null;

SortedMap:有一个实现类:TreeMap

ConcurrentHashMap<K,V>:HashMap的变体线程安全

 

四、集合遍历

  遍历ArrayList

import java.util.*;
/**
 * 三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。
 */
public class Test{
 public static void main(String[] args) {
     List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用foreach遍历List
     for (String str : list) {            //也可以改写for(int i=0;i<list.size();i++)这种形式
        System.out.println(str);
     }
 
     //第二种遍历,把链表变为数组相关的内容进行遍历
     String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) //这里也可以改写为  foreach(String str:strArray)这种形式
     {
        System.out.println(strArray[i]);
     }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
         System.out.println(ite.next());
     }
 }
}

遍历Map

import java.util.*;
 
public class Test{
     public static void main(String[] args) {
      Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      
      //第一种:普遍使用,二次取值
      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);
      }
     }
}

遍历Set

import java.util.HashSet;
import java.util.Iterator;

public class SetTest {
    public static void main(String[] args) {
        HashSet<String> sets = new HashSet<>();
        sets.add("h");
        sets.add("e");
        sets.add("l");
        sets.add("l");//不可重复
        sets.add("0");

        //方法一:迭代遍历
        for (Iterator<String> iterator = sets.iterator(); iterator.hasNext();){
            System.out.println(iterator.next());
        }
        //输出结果:
        /*
        0
        e
        h
        l
         */
       //可以看出Set集合是不可重复(添加重复操作不会报错)且无序的

        //方法二:foreach循环(没有普通for循环方法)
        for (String value:sets) {
            System.out.println(value);
        }
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
使用 JavaScript 编写的 Squareshooter 游戏及其源代码   项目:使用 JavaScript 编写的 Squareshooter 游戏(附源代码) 这款游戏是双人游戏。这是一款使用 JavaScript 编写的射击游戏,带有门户和强化道具。在这里,每个玩家都必须控制方形盒子(作为射手)。这款射击游戏的主要目标是射击对手玩家以求生存。当它射击对手时,它会获得一分。 游戏制作 该游戏仅使用 HTML 和 JavaScript 开发。该游戏的 PC 控制也很简单。 对于玩家 1: T:朝你上次动作的方向射击 A:向左移动 D:向右移动 W:向上移动 S:向下移动 对于玩家2: L:朝你上次移动的方向射击 左箭头:向左移动 右箭头:向右移动 向上箭头:向上移动 向下箭头:向下移动 游戏会一直进行,直到您成功射击对手或对手射击您为止。游戏得分显示在顶部。所有游戏功能均由 JavaScript 设置,而布局和其他次要功能则由 HTML 设置。 如何运行该项目? 要运行此项目,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要运行此游戏,首先,通过单击 index.html 文件在浏览器中打开项目。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值