J2EE集合框架之list

简介: J2EE集合框架之list

1.了解UML

1.1什么是UML:

UML 是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法,是开发面向对象软件和软件开发过程中非常重要的一部分。UML主要使用图形符号来表示软件项目的设计,使用UML可以帮助项目团队沟通、探索潜在的设计和验证软件的架构设计。以下我们将向您详细介绍什么是UML、UML的历史以及每个UML图类型的描述,辅之以UML示例。

1.2使用UML的目的:

  1. 为用户提供现成的、有表现力的可视化建模语言,以便他们开发和交换有意义的模型。
  2. 为核心概念提供可扩展性和特殊化机制。
  3. 独立与特定的编程语言和开发过程。
  4. 为了解建模语言提供一个正式的基础。
  5. 鼓励面向对象工具市场的发展。
  6. 支持更高层次的开发概念,如:协作、框架,模式和组件。
  7. 整合最佳的工作方法。

1.3UML图表:

UML图表主要分为结构性图表和行为性图表,结构性图表包括:类图、组件图、部署图、对象图、包图、复合结构图、轮廓图;行为性图表包括:用例图、活动图、状态机图、序列图、通讯图、交互概述图、时序图。

UML图表关系如图所示:

2.集合框架:

2.1什么是集合框架及集合框架的内容:

集合框架是为了表示和操作集合而规定的一种统一的标准体系结构

集合框架包括三大块内容:

(1)接口:表示集合的抽象数据类型,在图中虚线表示,如:Collect、list、Set、Map、lterator。

(2)实现:集合框架接口的具体表现。在图中虚线框表示,粗实现框表示最常用的实现,如:ArrayList、LinkedList、HashMap、HashSet。

(3)算法:在一个实现某个集合框架中的接口的对象身上完成某种有用的计算方法。

2.2集合框架体系图:

简化图:

集合框架关系图:

3.List集合:

3.1List 集合的特点:

不唯一:其元素以线性方式存储,集合中可以存放重复对象。
import java.util.ArrayList;
import java.util.List;
public class Test {
  public static void main(String[] args) {
    // 实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 打印输出集合
    System.out.println(list);
  }
}

输出结果(如图所示):

有序:存取元素的顺序一致
import java.util.ArrayList;
import java.util.List;
public class Test {
  public static void main(String[] args) {
    // 实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 打印输出集合
    System.out.println(list);
  }
}

输出结果:

3.2list集合的遍历方式:

3.2.1Iterator接口遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
  public static void main(String[] args) {
    // 多态的方式实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 输出查看集合
    System.out.println(list);
    // 使用Iterator接口遍历:
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {// 判断是否包含迭代元素
      // 有,则输出迭代元素
      System.out.println(it.next());
    }
  }
}

输出的迭代元素结果:(如图所示):

3.2.2 普通for循环遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
  public static void main(String[] args) {
    // 多态的方式实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 输出查看集合
    System.out.println(list);
    // 普通for循环遍历
    for (int i = 0; i < list.size(); i++) {// 集合下标从0开始,遍历长度小于集合的长度
      // 通过get方法传递索引获取集合中对应下标的数据信息
      System.out.println(list.get(i));
    }
  }
}

for循环输出结果:(如图所示):

3.2.3 增强for循环遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
  public static void main(String[] args) {
    // 多态的方式实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 输出查看集合
    System.out.println(list);
    // 增强for循环遍历
    for (String string : list) { // string接受集合数据,通过遍历一一打印输出
      // 输出集合数据
      System.out.println(string);
    }
  }
}

增强for输出的结果:(如图所示):

3.2.4 List集合自带的迭代器遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Test {
  public static void main(String[] args) {
    // 多态的方式实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 输出查看集合
    System.out.println(list);
//    list集合自带的迭代器遍历
    ListIterator<String> listit=list.listIterator();
    while(listit.hasNext()) {//判断是否包含list迭代元素
      //包含则输出集合元素数据
      System.out.println(listit.next());
    }
  }
}

list集合自带迭代器输出结果(如图所示):

3.2.5 Lambda遍历:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Test {
  public static void main(String[] args) {
    // 多态的方式实例化list集合
    List<String> list = new ArrayList<String>();
    // 向集合中添加元素
    list.add("木易");
    list.add("三金");
    list.add("君易");
    list.add("木易");
    // 输出查看集合
    System.out.println(list);
    //5、Lambda
    list.forEach(
        item -> System.out.println(item)
        );
  }
}

Lambda遍历结果(如图所示):

3.3 list集合子类的特点:

3.3.1 ArrayList:

底层数据结构我数组,查询修改数据快,增加修改慢。

3.3.2 LinkedList:

底层数据结构是链表,查询和修改慢,增删快

3.3.3 二者的区别:
  • ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
  • 对于随机访问,ArrayList优于LinkedList
  • 对于插入和删除操作,LinkedList优于ArrayList
  • LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

3.4 list集合增长因子论证:(list调优)

package com.YX;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class Demo {
      public static void main(String[] args) throws Exception {
          List list = new ArrayList();
          for (int i = 0; i < 100; i++) {
              System.out.print(i+"==");
              list.add(i);
              elementDataLength(list);
          }
      }
      public static void elementDataLength(List list) throws Exception {
          Field ed = list.getClass().getDeclaredField("elementData");
          ed.setAccessible(true);
          Object[] o = (Object[]) ed.get(list);
          System.out.println("当前List集合容量为:"+o.length);
      }
  }

按住ctrl点击如图所示的函数:

就会跳转至原方法中(如下图所示):

向集合中添加元素就是向elementData[size++]的数组中在对应下标添加。

上图所示的方法是为论证图下数组的长度变化

打印语句输出如图所示

总结:List底层结构是数组结构 它是一个’可变数组’,一旦超过默认数组长度,会自动扩容 增长因子为0.5。如图上所示,List默认长度10,当数据增加至11条时 长度由10增加至15。我们可以通过调控集合的默认长度和增长因子量来实现集合调优的效果。

3.5 list集合去重复:

案例1:创建对象是字符串(contains去重复)

打印结果:

contains比较的是字符串内容和字符串所在内存地址的数值,所以在一定程度上contains方法去重复具有缺陷,无法应用在字符串对象包含的内容,因为字符串对象是new关键字创建的,代表着开辟了新的内存空间。

解决方法:调用equals方法去重复。

案例2:调用equals方法去重复
package com.YX;
import java.util.ArrayList;
public class Demo3 {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add(new book(1, "西游记"));
    list.add(new book(2, "水浒传"));
    list.add(new book(3, "红楼梦"));
    if (!list.contains(new book(3, "红楼梦"))) {// contains去重复
      list.add(new book(3, "红楼梦"));
    }
    // 遍历输出集合
    for (Object obj : list) {
      System.out.println(obj);
    }
  }
}
class book {
  private int bid;
  private String bname;
  public book() {
    // TODO Auto-generated constructor stub
  }
  public book(int bid, String bname) {
    super();
    this.bid = bid;
    this.bname = bname;
  }
  @Override
  public String toString() {
    return "book [bid=" + bid + ", bname=" + bname + "]";
  }
}

contains遍历集合结果

调用equals方法,代码如下:

package com.YX;
import java.util.ArrayList;
public class Demo3 {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add(new book(1, "西游记"));
    list.add(new book(2, "水浒传"));
    list.add(new book(3, "红楼梦"));
    if (!list.contains(new book(3, "红楼梦"))) {// contains去重复
      list.add(new book(3, "红楼梦"));
    }
    // 遍历输出集合
    for (Object obj : list) {
      System.out.println(obj);
    }
  }
}
class book {
  private int bid;
  private String bname;
  public book() {
    // TODO Auto-generated constructor stub
  }
  public book(int bid, String bname) {
    super();
    this.bid = bid;
    this.bname = bname;
  }
  @Override
  public String toString() {
    return "book [bid=" + bid + ", bname=" + bname + "]";
  }
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + bid;
    result = prime * result + ((bname == null) ? 0 : bname.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    System.out.println("被调用");
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    book other = (book) obj;
    if (bid != other.bid)
      return false;
    if (bname == null) {
      if (other.bname != null)
        return false;
    } else if (!bname.equals(other.bname))
      return false;
    return true;
  }
}

equals打印结果:

目录
相关文章
|
4月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
4月前
|
安全
List集合特有功能
List集合特有功能
39 2
|
4月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
64 5
|
28天前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
39 0
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
3月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
25 3
|
4月前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
45 5
|
4月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
4月前
|
测试技术 索引 Python
Python接口自动化测试框架(基础篇)-- 常用数据类型list&set()
本文介绍了Python中list和set两种数据类型的使用,包括它们的创建、取值、增删改查操作、排序以及内置函数的使用,还探讨了list的比较函数和set的快速去重功能。
37 0