原文  http://www.jianshu.com/p/2070cb32accb

List接口

查阅API,看 List 的介绍。有序的 collection (也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素

特点:

  • 它是一个元素储存有序的集合
  • 它是一个带有索引的集合
  • 集合中可以有重复的元素

常用的子类:

  • ArrayList 集合
  • LinkedList 集合

常用方法

image.png

方法演示

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Test {
public static void main(String[] args){
List<String> list = new ArrayList<String>(); // 添加元素
list.add("cuzz");
list.add("uzi");
list.add("faker");
System.out.println(list); // [cuzz, uzi, faker] // 指定位置添加元素
list.add(1, "mlxg");
System.out.println(list); // [cuzz, mlxg, uzi, faker] // 删除元素
list.remove(2);
System.out.println(list); // [cuzz, mlxg, faker] boolean a = list.remove("cuzz"); // true
System.out.println(a);
System.out.println(list); // [mlxg, faker] // 修改元素
list.set(1, "FAKER");
System.out.println(list); // [mlxg, FAKER] // 迭代
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
} // 由于List有索引,除了使用迭代器的方法,还可以使用索引的方式
for (int i = 0; i < list.size(); i++){
String str = list.get(i);
System.out.println(str);
}
}
}

Iterator的并发修改的异常

在list集合迭代元素中,对元素进行判断,一旦条件满足就添加一个新元素

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Test1 {
public static void main(String[] args) {
// 创建List集合
List<String> list = new ArrayList<String>();
// 给集合中添加元素
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4"); // 迭代集合,当有元素为"abc2"时,集合加入新元素"ABC2"
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String str = iterator.next();
// 判断取出的元素是否是"abc2",是就添加一个新元素
if("abc2".equals(str)){
list.add("ABC2"); // 该操作会导致程序出错
}
}
// 打印容器中的元素
System.out.println(list);
}
}

当我们在遍历实现了 collection 接口与 iterator 接口的集合时( List 、 Set 、 Map), 我们可以通过遍历索引也可以通过迭代器进行遍历。

在我们使用迭代器进行遍历集合的时候,会获取到当前集合的迭代对象。在里面有封装了迭代器 iterator.remove() 方法与集合自带的 list.remove() 方法

如果我们调用迭代器象的 remove() 方法是没问题的,但是当我们调用集合自带的 remove() 方法时,就会产生 ConcurrentModificationException 并发修改异常。也就是说,当我们通过迭代器进行遍历集合的时候,是不允许集合本身在结构上发生变化的

解决办法

ListIterator 可以再迭代时对集合进行 add 、 set 、 remove 操作,而 Iterator 迭代器只能在迭代时对集合进行 remove 操作

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; public class Test1 {
public static void main(String[] args) {
// 创建List集合
List<String> list = new ArrayList<String>();
// 给集合中添加元素
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4"); // 迭代集合,当有元素为"abc2"时,集合加入新元素"ABC2"
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){
String str = listIterator.next();
//判断取出的元素是否是"abc2",是就添加一个新元素
if("abc2".equals(str)){
// 使用迭代器封装的add
listIterator.add("ABC2");
}
}
// 打印容器中的元素
System.out.println(list); // [abc1, abc2, ABC2, abc3, abc4]
}
}

ArrayList集合

ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合

LinkedList集合

LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而 LinkedList 提供了大量首尾操作的方法

image.png

Set接口

Set 继承于 Collectio n接口,是一个不允许出现重复元素,并且无序的集合,主要有 HashSet 、 LinkedHashSet 和 TreeSet

在判断重复元素的时候, Set 集合会调用 hashCode() 和 equals() 方法来实现

HashSet

import java.util.HashSet;

public class Test2 {
public static void main(String[] args) {
// 创建HashSetd对象
HashSet<String> hashSet = new HashSet<String>(); // 添加对象
hashSet.add("cuzz");
hashSet.add("uzi");
hashSet.add("faker");
hashSet.add("cuzz"); System.out.println(hashSet); // [uzi, cuzz, faker]
}
}

HashSet储存自定义类型的元素

保证 HashSet 集合元素的唯一,其实就是根据对象的 hashCode() 和 equals() 方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写 hashCode ()和 equals() 方法建立属于当前对象的比较方式

创建自定义 Student 对象

public class Student {
private String name;
private int age;
// 构造方法
public Student(String name, int age){
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} // 重新toString
public String toString(){
return "Student [name:" + name + " " + "age=" + age + "]";
} // 重写hashCode
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime*result + age;
result = prime*result + ((name == null) ? 0 :name.hashCode());
return result;
} // 重写equals
public boolean equals(Object obj){
if (this == obj){
return true;
}
if (!(obj instanceof Student)){
System.out.println("类型错误");
return false;
}
Student other = (Student) obj;
return this.age == other.age && this.name.equals(other.name);
}
}

创建 HashSet 集合,存储 Student 对象

import java.util.HashSet;

public class HashSetDemo {
public static void main(String[] args) {
// 创建HashSetd对象
HashSet<Student> hashSet = new HashSet<Student>(); // 添加对象
hashSet.add(new Student("cuzz",20));
hashSet.add(new Student("uzi", 21));
hashSet.add(new Student("faker", 22));
hashSet.add(new Student("cuzz", 20)); System.out.println(hashSet); // Student [name:faker age=22],
// Student [name:cuzz age=20],
// Student [name:uzi age=21]]
}
}

LinkedHashSet

LinkedHashSet 它是链表和哈希表组合的一个数据存储结构,可以保证元素存放时有顺序的

Java集合框架(二)的更多相关文章

  1. (Set, Map, Collections工具类)JAVA集合框架二

    Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...

  2. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  3. Java集合框架(二)

    Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...

  4. (二)java集合框架综述

    一集合框架图 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Ja ...

  5. Java集合框架源码(二)——hashSet

    注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...

  6. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  7. Java集合框架的总结

    本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ...

  8. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  9. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  10. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

随机推荐

  1. Spring-Security+Freemarker 开启跨域请求伪造防护功能

         CSRF简介--摘抄自<Spring实战(第4版)> 我们可以回忆一下,当一个POST请求提交到"/spittles"上时,SpittleController ...

  2. django-表单

    一.从Request对象中获取信息 1.URL相关的信息 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request. ...

  3. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  4. Ubuntu搭建Hadoop的踩坑之旅(一)

    本文将介绍如何使用虚拟机一步步从安装Ubuntu到搭建Hadoop伪分布式集群. 本文主要参考:在VMware下安装Ubuntu并部署Hadoop1.2.1分布式环境 - CSDN博客 一.所需的环境 ...

  5. Quartz基本使用

    1.Quartz概述:简单的说就是java的一个定时任务的框架,没有那么复杂的解释,跟前端的定时器一样.在了解它之前,首先熟悉几个概念. 2.基本概念 2.1 Job:表示一个工作,要执行的具体内容. ...

  6. 用eclipes写第一个HelloWorld

    打开 eclipes 后,首先点击左上角新建按钮,新建一个项目,如图: 选择 Java Project 选项: 如果没有java Project这个选项的话,选择次一个的 project 也可以,在跳 ...

  7. (2018干货系列五)最新UI设计学习路线整合

    怎么学UI全链路设计 全链路设计师是参与整个商业链条,为每个会影响用户体验的地方提供设计的可解决方案,最后既满足了商业目标,又提升了产品的用户体验和设计质量,与平面设计.UI设计彻底区分开来,是真正的 ...

  8. 草料Chrome浏览器插件,让二维码更好用

    安装插件草料chrome插件,是专为chrome核心的浏览器开发的一个二维码应用增强工具插件. 自动将地址栏链接生成二维码 以谷歌原生的chrome浏览器为例,插件安装成功后会在浏览器地址栏旁边出现一 ...

  9. directX根据设备类GUID查询所属的filter

    hr = m_pSysDevEnum->CreateClassEnumerator(*clsid, &pEnumCat, 0);    ASSERT(SUCCEEDED(hr));    ...

  10. faultString = "java.lang.NullPointerException : null"

    1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "E75F6AF8-5E0E-4184-3AF ...