commons-collections使用介绍之List

在上一篇博客中介绍了commons-collections中的Bag相关内容,这一篇将为大家介绍List相关的实现类。

CursorableLinkedList

CursorableLinkedListList的一种实现,提供了一个列表迭代器并且允许修改列表。CursorableLinkedList支持所有可选列表的操作。它继承自AbstractLinkedList,提供了stack/queue/dequeue的操作。这个类的主要功能是能够在同一时间修改列表和迭代器。listIterator()cursor()方法都提供了访问一个继承自ListIteratorCursor实例。游标允许更改列表时并发修改迭代器。需要注意的是,iterator()方法和子列表不会提供这种光标行为。CursorableLinkedList不是线程同步的。

使用示例:

package com.gujin.collections;

import java.util.Iterator;

import org.apache.commons.collections.list.CursorableLinkedList;
import org.apache.commons.collections.list.CursorableLinkedList.Cursor;
import org.junit.Test;

public class CursorableLinkedListTest
{
   @Test
   public void test()
   {
      CursorableLinkedList linkedList = new CursorableLinkedList();
      linkedList.add("center");
      linkedList.addFirst("first");
      linkedList.addLast("last");
      System.out.println(linkedList);
      Cursor cursor = linkedList.cursor();
      if (cursor.hasNext())
      {
         Object o = cursor.next();
         System.out.println("使用游标移除元素:" + o);
         cursor.remove();
      }
      cursor.close();
      System.out.println(linkedList);
      Iterator<?> iterator = linkedList.iterator();
      if (iterator.hasNext())
      {
         Object o = iterator.next();
         System.out.println("使用迭代器移除元素:" + o);
         iterator.remove();
      }
      System.out.println(linkedList);
   }
}

运行结果:

[first, center, last]
使用游标移除元素:first
[center, last]
使用迭代器移除元素:center
[last]

FixedSizeList

FixedSizeList修饰另一个列表防止添加/删除并且固定列表大小。add、remove、clear和retain操作是不被支持的,set方法是允许的但是不会影响列表大小。

使用示例:

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.list.FixedSizeList;
import org.junit.Test;

public class FixedSizeListTest
{
   @Test
   public void test()
   {

      ArrayList<String> src = new ArrayList<String>();
      src.add("11");
      src.add("22");
      src.add("33");
      src.add("44");
      FixedSizeList fixedSizeList = (FixedSizeList) FixedSizeList.decorate(src);
      System.out.println(fixedSizeList);
      System.out.println("列表最大长度:" + fixedSizeList.maxSize());
      // 更改列表指定索引位置元素
      fixedSizeList.set(0, "55");
      System.out.println(fixedSizeList);
      // 移除元素,不被支持
      // fixedSizeList.remove(0);
   }
}

运行结果:

`[11, 22, 33, 44]
列表最大长度:4
[55, 22, 33, 44]

GrowthList

GrowthList修饰另一个列表,可以使其在因set或add操作造成索引超出异常时无缝的增加列表长度,可以避免大多数的IndexOutOfBoundsException

使用示例:

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.list.GrowthList;
import org.junit.Test;

public class GrowthListTest
{
   @Test
   public void test()
   {
      ArrayList<String> src = new ArrayList<String>();
      src.add("11");
      src.add("22");
      GrowthList growthList = (GrowthList) GrowthList.decorate(src);
      System.out.println(growthList);
      // 索引超出,自动增长
      growthList.set(3, "44");
      System.out.println(growthList);
   }
}

运行结果:

[11, 22]
[11, 22, null, 44]

LazyList

LazyList修饰另一个列表,当调用get方法时,如果索引超出列表长度,列表会自动增长,我们可以通过一个工厂获得超出索引位置的值。LazyListGrowthList都可以实现对修饰的列表进行增长,但是LazyList发生在get时候,而GrowthList发生在setadd时候,我们也可以混合使用这两种列表。

使用示例:

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.Factory;
import org.apache.commons.collections.list.LazyList;
import org.junit.Test;

public class LazyListTest
{
   @Test
   public void test()
   {
      ArrayList<String> src = new ArrayList<String>();
      src.add("11");
      src.add("22");
      Factory factory = new Factory()
      {
         @Override
         public Object create()
         {
            return "new";
         }
      };
      LazyList lazyList = (LazyList) LazyList.decorate(src, factory);
      System.out.println(lazyList);
      // 获得超出索引位置的元素,自动增长
      System.out.println(lazyList.get(3));
      System.out.println(lazyList);
   }
}

运行结果:

[11, 22]
new
[11, 22, null, new]

PredicatedList

PredicatedList修饰另一个列表,在执行add的时候对添加元素进行校验,校验不通过则抛出IllegalArgumentException异常。commons-collections已经为我们提供了一些验证的实现:

类名说明
AllPredicate多个断言组合,如果断言数组为空则允许所有元素,否则只有当所有断言都为真才允许添加
AndPredicate两个断言组合,当断言都为真时允许添加,否则不允许
AnyPredicate多个断言组合,如果断言数组为空则不允许所有元素,否则只要有一个断言为真则允许添加
EqualPredicate如果添加的元素和断言中的元素相等(equals),则允许添加
ExceptionPredicate总是会抛出一个FunctorException异常
FalsePredicate不允许添加任何元素
IdentityPredicate如果添加的元素和断言中的元素为同一个(==),则允许添加
InstanceofPredicate允许添加指定类型的实例
NonePredicate多个断言组合,如果断言数组为空则允许所有元素,否则只要有一个断言为真则不允许添加,
NotNullPredicate元素不为null则允许添加
NotPredicate断言为真则不允许添加
NullIsExceptionPredicate元素为null,则抛出一个FunctorException异常,否则断言为真则允许添加
NullIsFalsePredicate元素为null,则不允许添加,否则断言为真则允许添加
NullIsTruePredicate元素为null或断言为真允许添加
NullPredicate仅允许添加null元素
OnePredicate多个断言组合,如果断言数组为空则不允许所有元素,否则只有一个断言为真时允许添加
OrPredicate两个断言组合,当断言有一个为真时允许添加,否则不允许
TransformedPredicate对元素进行变换后断言为真则允许添加
TransformerPredicate对元素进行变换后,变换结果为真则允许添加
TruePredicate允许添加所有元素
UniquePredicate不允许添加重复元素

使用示例:

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.functors.NotNullPredicate;
import org.apache.commons.collections.list.PredicatedList;
import org.junit.Test;

public class PredicatedListTest
{
   @Test
   public void test()
   {
      PredicatedList predicatedList = (PredicatedList) PredicatedList.decorate(
            new ArrayList<String>(), NotNullPredicate.INSTANCE);
      predicatedList.add("123");
      // 抛出异常
      // predicatedList.add(null);
   }
}

SetUniqueList

SetUniqueList实现了一个不允许重复元素的列表,有点和Set类似。

使用示例:

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.list.SetUniqueList;
import org.junit.Test;

public class SetUniqueListTest
{
   @Test
   public void test()
   {
      SetUniqueList setUniqueList = SetUniqueList
            .decorate(new ArrayList<String>());
      setUniqueList.add("11");
      setUniqueList.add("11");
      setUniqueList.add("22");
      System.out.println(setUniqueList);
   }
}

运行结果:

[11, 22]

SynchronizedList

SynchronizedList修饰另一个列表,使其可以在多线程环境下同步。和Vector类似。

TransformedList

TransformedList修饰另一个列表,在addset的时候对元素进行转换后在执行相关操作。

package com.gujin.collections;

import java.util.ArrayList;

import org.apache.commons.collections.functors.StringValueTransformer;
import org.apache.commons.collections.list.TransformedList;
import org.junit.Test;

public class TransformedListTest
{
   @Test
   public void test()
   {
      TransformedList transformedList = (TransformedList) TransformedList
            .decorate(new ArrayList<String>(),
                  StringValueTransformer.getInstance());
      // 添加时会将其转换为字符串
      transformedList.add(new Integer(20));
      System.out.println(transformedList.get(0).getClass());
      System.out.println(transformedList);
   }
}

运行结果:

class java.lang.String
[20]

TreeList

TreeList实现了优化的快速插入和删除任何索引的列表。这个列表内部实现利用树结构,确保所有的插入和删除都是O(log n)。

TypedList

·TypedList·修饰了另一个列表,使其只能添加指定类型的实例,修饰后的列表本质上就是使用InstanceofPredicate断言的PredicatedList

UnmodifiableList

UnmodifiableList修饰另一个列表,使列表不允许被修改。

### 回答1: commons-collections是Apache Commons项目中的一个子项目,提供了一组扩展和增强了Java集合框架的工具类。commons-collections 4.1 是该项目的一个版本。 commons-collections 4.1jar是一个Java归档文件(jar),其中包含了commons-collections 4.1版本的源代码和编译后的类文件。通过将该jar文件添加到Java项目的类路径中,开发人员可以使用commons-collections提供的丰富功能来简化集合操作的编写。 该jar文件可以通过将其下载到本地计算机,然后在项目中导入jar包来使用。导入后,开发人员可以使用 commons-collections提供的各种集合类和算法,如List、Set、Map、Queue、Bag等,来处理和操作集合数据。通常,通过导入commons-collections jar包后,开发人员可以直接使用其提供的类,而不需要自己编写复杂的集合操作代码。 commons-collections的jar文件具有良好的移植性,可以在不同的Java平台上使用,例如Java SE、Java EE等。它还具有广泛的应用范围,可用于各种Java项目,包括Web应用程序、桌面应用程序、企业应用程序等。 总结来说,commons-collections 4.1jar是一个包含了commons-collections 4.1版本源代码和编译后的类文件的Java归档文件,它为开发人员提供了丰富的集合操作工具类,可以简化和加速Java项目中的集合操作。 ### 回答2: commons-collections4.1.jar 是一个开放源代码的 Java 类库,它提供了一组实用的集合类和算法,以增强 Java 标准库中集合类的功能。 commons-collections4.1.jar 包含了各种实现了 List、Set、Queue、Map 等接口的集合类,比如 ArrayList、LinkedList、HashSet、TreeSet、HashMap 等。这些集合类提供了更多的功能与选项,满足了不同场景下的需求。 此外,commons-collections4.1.jar 还提供了一些扩展的数据结构,如 MultiHashMap、MultiValueMap 等。这些数据结构允许一个键对应多个值,提供了更灵活的数据存储方式。 commons-collections4.1.jar 还包含了一些实用的算法,如排序、查找、遍历等。通过这些算法,我们可以更方便地对集合进行操作和处理。 commons-collections4.1.jar 提供了一些实用的工具类,如 Predicate、Transformer、Comparator 等。这些工具类可以帮助我们更方便地进行集合操作,比如筛选、映射、比较等。 总之,commons-collections4.1.jar 是一个非常实用的 Java 类库,提供了丰富的集合类、算法和工具,能够大大提高开发效率,简化代码编写。无论是在开发大型应用程序还是小型项目中,都可以通过引入 commons-collections4.1.jar 来充分利用其提供的功能和特性。 ### 回答3: commons-collections4.1.jar是Apache Commons项目的一部分,是一个Java集合框架库。该库提供了一组扩展和增强了Java集合框架的类和接口。 commons-collections4.1.jar包含了一些实用的类和接口,可以用于处理各种不同类型的集合。它提供了许多方便的方法和工具类,可以简化集合操作的开发过程。 该库包含的一些主要功能有: 1. 扩展集合类:commons-collections4.1.jar提供了一些扩展了Java集合类的类,例如改进了性能和功能的List、Set、Map等。 2. 集合工具类:该库还提供了一些实用的集合工具类,例如CollectionUtils和ListUtils等,可以方便地对集合进行操作和处理。 3. 各种集合实现:commons-collections4.1.jar还提供了一些特殊的集合实现,例如CircularFifoQueue、ListOrderedMap等,可以满足不同场景下的需求。 4. 强大的迭代器包装器:该库还提供了一些强大的迭代器包装器,例如TransformedIterator和FilterIterator等,可以对集合的元素进行处理和过滤。 通过使用commons-collections4.1.jar,开发者可以更高效地处理和操作集合,减少开发时间和工作量。这个库已经在许多Java项目中得到了广泛使用,并且由于其丰富的功能和高效的性能而受到开发者的青睐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值