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方法返回值来决定的。
目录
相关文章
|
7小时前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
8 1
|
7小时前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
5 0
|
7小时前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
11 0
|
7小时前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
7小时前
|
存储 安全 Java
【JAVA基础篇教学】第八篇:Java中List详解说明
【JAVA基础篇教学】第八篇:Java中List详解说明
|
7小时前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
7小时前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
12 0
|
7小时前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
7小时前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
7小时前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
11 0