Java集合框架中的List

简介: Java集合框架中的List

List简介

任何集合框架都包含三大块内容:

对外的接口、接口的实现和对集合运算的算法。

接口:即表示集合的抽象数据类型,接口提供了让我们对集合中所表示的内容进行单独操作的可能。

实现: 也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。

算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算方法,如查找、排序等。

它和数组不同,数组既可以存储基本数据类型,也可以存储引用数据类型。而集合只能存储引用数据类型,比如你存入一个int型数据18放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型,如果存储基本数据类型,会被自动装箱。

它就像一个容器,专门用来存储java对象(实际上是对象名,即指向地址的指针),这些对象可以是任意数据类型,并且长度可变。其中,这些集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。

以下是类的关系图(该图用到了UML--统一建模语言):

一.List集合的特点

介绍:学习集合框架就是为了解的容器的数据结构

List集合方法:

实例化:   List list = new ArrayList();

增  

list.add("a");

list.add("b");

list.add("c");

System.out.println("目前集合中的元素:"+list);

//打印结果为:  目前集合中的元素:[a, b, c]

list.remove("a"); //根据元素删除

list.remove(0);//根据下标删除

list.set(1,"d");

//第一个参数是要修改的元素下标        1

//第二个参数是修改后的元素为什么    d

list.get(0);

//里面参数是想要获取的元素下标

二.List的三总遍历方式(fori,foreach,lterator)

fori循环

List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        for (int i = 0; i < list.size(); i++ ) {
            System.out.println(list.get(i));//根据下标查找
        }
//先实例化再增加元素最后循环输出

foreach循环

List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
         for (Object o : list) {
            System.out.println(o);
        }
//先实例化再增加元素最后循环输出

lterator循环(迭代器)

List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
Iterator it = list.iterator();//继承util包
     while (it.hasNext()) {
       System.out.println(it.next());
    }

三.List的子类LinkedList

堆栈 / 队列

package com.zking.list;
import java.util.LinkedList;
public class Demo01 {
  public static void main(String[] args) {
     LinkedList ll = new LinkedList();
          ll.add("卡卡西");
          ll.add("独孤贱");
          ll.add("爱德花");
   //两个类方法不能同时测试,需要分开测试
//          Duilie dl = new Duilie(ll);//实例化队列类调取输出方法
//          System.out.println(dl.pop());
//          System.out.println(dl.pop());
//          System.out.println(dl.pop());
//输出结果为: 卡卡西 独孤贱  爱德花
          DuiZhan dz = new DuiZhan(ll);//实例化堆栈类调取输出方法
          System.out.println(dz.pop());
          System.out.println(dz.pop());
          System.out.println(dz.pop());
//输出结果为:爱德花  独孤贱  卡卡西
  }
}
//类说明:队列类
//用于输出list集合的元素
//特点:先增加,先输出
class Duilie{
    LinkedList ll = null;
    public Duilie(LinkedList ll){
        this.ll = ll;
    }
    public void add(String a){
        ll.add(a);
    }
    public String pop(){
        return (String) ll.remove();
    }
}
//类说明:堆栈类
//用于输出list集合的元素
//特点:先增加,后输出
class DuiZhan{
    LinkedList ll = null;
    public DuiZhan(LinkedList ll){
        this.ll = ll;
    }
    public void add(String a){
        ll.add(a);
    }
    public String pop(){
        return (String) ll.removeLast();
    }
}

四.List的增长因子论证

List集合长度是可变的,数组长度是不可变的;

package com.zking.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
  public static void main(String[] args) throws Exception {
        List list = new ArrayList();//实例化
        //循环增加
        for (int i = 0; i < 100; i++) {
            System.out.print(i+"--");
            //每增加一次就查看当前list长度的变化
            list.add(i);
            //调用查看容量的方法
            listDataLength(list);
        }
    }
  //定义一个查看容量的方法
    public static void listDataLength(List list) throws Exception {
      //调用list集合定义好的类方法
        Field ed = list.getClass().getDeclaredField("elementData");
        ed.setAccessible(true);
        //调用查看的方法看list集合的数组容量
        Object[] o = (Object[]) ed.get(list);
        //每调用一次就查看一次容量长度
        System.out.println("List集合容量为:"+o.length);
    }
}

根据以上代码输出的结果判断:

1.List集合的初始容量为 10 。

2.如果增加的元素超过list集合的容量,list集合的增长因子 0.5 。

3.List集合如何进行优化呢,当代码中出现了多次add操作,涉及到了list集合容量多次改变,这是十分耗性能的操作,此时通过

设定初始化容量,即可优化性能。

五.List的子类ArrayList中的重复元素去重及其底层原理

1.ArrayList中字符串和数字去除重复增加

package com.zking.list;
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
     public static void main(String[] args) {
          List list = new ArrayList();
          list.add("a");
          list.add("b");
          list.add("c");
          System.out.println("目前集合容器中的元素:"+list);
          if (!list.contains("b")){
              list.add("b");
          }
          System.out.println("目前集合容器中的元素:"+list);
          List list2 = new ArrayList();
          list2.add(1);
          list2.add(2);
          list2.add(3);
          System.out.println("目前集合容器中的元素:"+list2);
          if (!list2.contains(2)){
              list2.add(2);
          }
          System.out.println("目前集合容器中的元素:"+list2);
      }
}

输出结果如图所示:

2.ArrayList中元素对象去除重复增加

package com.zking.list;
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
     public static void main(String[] args) {
          List list = new ArrayList();
          //增加元素对象
          list.add(new Person(1, "卡卡西"));
          list.add(new Person(2, "独孤贱"));
          list.add(new Person(3, "爱德花"));
          list.add(new Person(3, "爱德花"));
          //新定义一个集合
          List Newlist = new ArrayList();
          //循环list集合
          for (Object obj : list) {
            //判断如果新集合里有该元素对象就不增加,没有就增加
            if(!Newlist.contains(obj)) {
              Newlist.add(obj);
            }
      }
          System.out.println("没有去重的集合:");
          for (Object object : list) {
            System.out.println(object);
      }
          System.out.println("-----------------------------");
          System.out.println("去重后的集合:");
          for (Object obj : Newlist) {
            System.out.println(obj);
      }
      }
}
class Person{
  private int id;
  private String name;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Person(int id, String name) {
    super();
    this.id = id;
    this.name = name;
  }
  public Person() {
    super();
  }
  @Override
  public String toString() {
    return "Person [id=" + id + ", name=" + name + "]";
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Person other = (Person) obj;
    if (id != other.id)
      return false;
    if (name == null) {
      if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
      return false;
    return true;
  }
}

输出结果如图所示:

3.以上代码及图片可得出原理

  • ArrayList集合中去重原理是存储元素对象的equals方法返回值来决定的。
目录
相关文章
|
10天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
30天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
38 3
|
19天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
19天前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
27天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
43 1
Spring 框架:Java 开发者的春天
|
25天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
21天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
12 1
|
27天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
27天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
53 5
|
25天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
19 3