JAVAlist,javalist转数组

本文目录一览:

Java的List如何实现线程安全?

Java的List如何实现线程安全?

Collections.synchronizedList(names);效率最高,线程安全

Java的List是我们平时很常用的集合,线程安全对于高并发的场景也十分的重要,那么List如何才能实现线程安全呢 ?

加锁

首先大家会想到用Vector,这里我们就不讨论了,首先讨论的是加锁,例如下面的代码

public class Synchronized{

private ListString  names = new LinkedList();

public synchronized void addName(String name ){

names.add(“abc”);

}

public String getName(Integer index){

Lock lock =new ReentrantLock();

lock.lock();

try {

return names.get(index);

}catch (Exception e){

e.printStackTrace();

}

finally {

lock.unlock();

}

return null;

}

}

synchronized一加,或者使用lock 可以实现线程安全,但是这样的List要是很多个,代码量会大大增加。

java自带类

在java中我找到自带有两种方法

CopyOnWriteArrayList

CopyOnWrite 写入时复制,它使一个List同步的替代品,通常情况下提供了更好的并发性,并且避免了再迭代时候对容器的加锁和复制。通常更适合用于迭代,在多插入的情况下由于多次的复制性能会一定的下降。

下面是add方法的源代码

 public boolean add(E e) {

final ReentrantLock lock = this.lock; // 加锁 只允许获得锁的线程访问

lock.lock();

try {

Object[] elements = getArray();

int len = elements.length;

// 创建个长度加1的数组并复制过去

Object[] newElements = Arrays.copyOf(elements, len + 1);

newElements[len] = e; // 赋值

setArray(newElements); // 设置内部的数组

return true;

} finally {

lock.unlock();

}

}

Collections.synchronizedList

Collections中有许多这个系列的方法例如

主要是利用了装饰者模式对传入的集合进行调用 Collotions中有内部类SynchronizedList

static class SynchronizedListE

extends SynchronizedCollectionE

implements ListE {

private static final long serialVersionUID = -7754090372962971524L;

final ListE list;

SynchronizedList(ListE list) {

super(list);

this.list = list;

}

public E get(int index) {

synchronized (mutex) {return list.get(index);}

}

public E set(int index, E element) {

synchronized (mutex) {return list.set(index, element);}

}

public void add(int index, E element) {

synchronized (mutex) {list.add(index, element);}

}

public E remove(int index) {

synchronized (mutex) {return list.remove(index);}

}

static class SynchronizedCollectionE implements CollectionE, Serializable {

private static final long serialVersionUID = 3053995032091335093L;

final CollectionE c;  // Backing Collection

final Object mutex;     // Object on which to synchronize

这里上面的mutex就是锁的对象 在构建时候可以指定锁的对象 主要使用synchronize关键字实现线程安全

 /**

* @serial include

*/

static class SynchronizedListE

extends SynchronizedCollectionE

implements ListE {

private static final long serialVersionUID = -7754090372962971524L;

final ListE list;

SynchronizedList(ListE list) {

super(list);

this.list = list;

}

SynchronizedList(ListE list, Object mutex) {

super(list, mutex);

this.list = list;

}

这里只是列举SynchronizedList ,其他类类似,可以看下源码了解下。

测试

public class Main {

public static void main(String[] args) {

ListString names = new LinkedList();

names.add(“sub”);

names.add(“jobs”);

// 同步方法1 内部使用lock

long a = System.currentTimeMillis();

ListString strings = new CopyOnWriteArrayList(names);

for (int i = 0; i 100000; i++) {

strings.add(“param1”);

}

long b = System.currentTimeMillis();

// 同步方法2 装饰器模式使用 synchronized

ListString synchronizedList = Collections.synchronizedList(names);

for (int i = 0; i 100000; i++) {

synchronizedList.add(“param2”);

}

long c = System.currentTimeMillis();

System.out.println(“CopyOnWriteArrayList time == “+(b-a));

System.out.println(“Collections.synchronizedList time == “+(c-b));

}

}

两者内部使用的方法都不一样,CopyOnWriteArrayList内部是使用lock进行加锁解锁完成单线程访问,synchronizedList使用的是synchronize

进行了100000次添加后时间对比如下:

可以看出来还是使用了synchronize的集合工具类在添加方面更加快一些,其他方法这里篇幅关系就不测试了,大家有兴趣去试一下。

java中list后面加是什么意思?

这是泛型,保证List传入类型跟ArrayList传入类型一致;例如:ListString list = new ArrayListInteger();

以上代码List指定类型是String,而真正传入的Integer这样编译是不会通过的。

如果List指定了泛型,那么编译就会检测,如果不定义泛型,编译通过,运行不合理值会报错。

泛型(Generic type 或者generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。

用法:

实际上有两种List:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。次序是List最重要的特点:它保证维护元素特定的顺序。

List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用)。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。

以上内容参考:百度百科-java列表

java list集合什么意思

1、集合可以有list,vector等,其实map也是一个集合

2、这些集合有啥用呢,就好比你有一堆数据要存:

[name=’张三’

,

age=20,

address=’北京’]

[name=’李四’

,

age=15,

address=’湖南’]

[name=’王五’

,

age=18,

address=’甘肃’]等等,

这样一条一条的数据你就能够用集合来保存起来,放到一条集合中去

3、例如用list来保存,保存形式就如下:

list

=

{[name=’张三’

,

age=20,

address=’北京’],

[name=’李四’

,

age=15,

address=’湖南’]

[name=’王五’

,

age=18,

address=’甘肃’]};

这样的形式了,然后取值的时候你就可以根据list.get(i)来分别取值了。

4、如果要取到每一条里面的属性,那么可以配合map或者存储的是实体类对象,来分别取值就对了,非常的简单且实用

原创文章,作者:WPBBM,如若转载,请注明出处:https://www.506064.com/n/331967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
WPBBMWPBBM
上一篇 2025-01-20 14:11
下一篇 2025-01-20 14:11

相关推荐

  • MySQL字符串转数组详解

    一、MySQL字符串转数组是什么? MySQL字符串转数组是把字符串类型的数据转换为数组类型的数据。 在MySQL中,字符串类型的数据是非常常见的,但是有时需要将这些字符串类型的数…

    编程 2025-04-23
  • Vue对象转数组:一个实用的JS技巧

    Vue是目前最受欢迎的JavaScript框架之一,它被广泛应用于单页面应用程序开发、数据绑定、组件化开发等场景。在Vue的开发中,我们经常需要将其数据对象转换为数组,以便更方便地…

    编程 2025-04-22
  • 前端字符串转数组详解

    一、常用的字符串转数组方法 1、使用split方法将字符串按照指定分隔符转为数组 let str = “今天,天气,真好”; let arr = str.split(“,”); /…

    编程 2025-04-22
  • ES6对象转数组指南

    在Javascript编程过程中,经常需要进行数组和对象之间的转换。ES6以及后续版本提供了许多便捷的方法帮助开发者实现这样的转换。本文将围绕ES6对象转数组展开讲解,介绍常用的方…

    编程 2025-04-13
  • go字符串转数组详解

    一、什么是字符串 字符串是计算机编程中的一种数据类型,它表示一段字符序列,可以包含字母、数字、标点符号以及其他特殊字符。在Go中,字符串类型被定义为一个不可变的序列,即字符串中的每…

    编程 2025-04-13
  • Javalist取差集操作详解

    在Java编程中,javalist取差集操作是非常常见和实用的一个操作。具体来说,这个操作是指从一个列表中去掉另一个列表中的元素,即找到两个列表不同的部分。 一、常用的javali…

    编程 2025-02-27
  • JQ字符串转数组详解

    一、字符串转数组 将字符串转换成数组是开发过程中常用的操作之一。通过Jquery将字符串转换成数组十分简单,我们只需要使用原始的JavaScript split()函数,然后使用$…

    编程 2025-02-24
  • Javalist交集详解

    一、Javalist交集概述 Javalist交集是指两个或多个集合中共同拥有的元素。在Java中,我们可以使用Collections类的静态方法intersection来获取两个…

    编程 2025-02-11
  • PostgreSQL字符串转数字详解

    PostgreSQL是一款功能强大的关系型数据库,其内置了许多函数用于数据类型转换。其中常用的就是将字符串类型转换为数字类型。在这篇文章中,我们将从多个方面详细介绍如何使用Post…

    编程 2025-02-05
  • 详解javalist差集

    一、什么是javalist差集 在Java中,List是非常基础的数据类型,而javalist差集是List的一种操作。它可以用来比较两个List中的元素,返回一个只包含第一个Li…

    编程 2025-02-05

发表回复

登录后才能评论