皮皮网

【源码公益服】【怎么求源码】【-4的源码】java list 源码

时间:2024-11-30 02:59:21 分类:焦点 来源:mvvm源码

1.Java的List如何实现线程安全?
2.Java低代码:jvs-list (子列表)表单回显及触发逻辑引擎配置说明
3.如何在java中创建一个不可变的源码list
4.java编程中对list集合进行排序的问题?

java list 源码

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

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

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

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

       åŠ é”

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

       public class Synchronized{

       private List<String>  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 SynchronizedList<E>

       extends SynchronizedCollection<E>

       implements List<E> {

       private static final long serialVersionUID = -L;

       final List<E> list;

       SynchronizedList(List<E> 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 SynchronizedCollection<E> implements Collection<E>, Serializable {

       private static final long serialVersionUID = L;

       final Collection<E> c;  // Backing Collection

       final Object mutex;     // Object on which to synchronize

       è¿™é‡Œä¸Šé¢çš„mutex就是锁的对象 在构建时候可以指定锁的对象 主要使用synchronize关键字实现线程安全

          /

**

       * @serial include

       */

       static class SynchronizedList<E>

       extends SynchronizedCollection<E>

       implements List<E> {

       private static final long serialVersionUID = -L;

       final List<E> list;

       SynchronizedList(List<E> list) {

       super(list);

       this.list = list;

       }

       SynchronizedList(List<E> list, Object mutex) {

       super(list, mutex);

       this.list = list;

       }

       è¿™é‡Œåªæ˜¯åˆ—举SynchronizedList ,其他类类似,可以看下源码了解下。

       æµ‹è¯•

       public class Main {

       public static void main(String[] args) {

       List<String> names = new LinkedList<>();

       names.add("sub");

       names.add("jobs");

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

       long a = System.currentTimeMillis();

       List<String> strings = new CopyOnWriteArrayList<>(names);

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

       strings.add("param1");

       }

       long b = System.currentTimeMillis();

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

       List<String> synchronizedList = Collections.synchronizedList(names);

       for (int i = 0; i < ; 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

       è¿›è¡Œäº†æ¬¡æ·»åŠ åŽæ—¶é—´å¯¹æ¯”如下:

       å¯ä»¥çœ‹å‡ºæ¥è¿˜æ˜¯ä½¿ç”¨äº†synchronize的集合工具类在添加方面更加快一些,其他方法这里篇幅关系就不测试了,大家有兴趣去试一下。

Java低代码:jvs-list (子列表)表单回显及触发逻辑引擎配置说明

       子列表新增表单默认回显主列表关联字段

       1、子列表中进入新增页面配置

       2、源码切换到表单设置,源码选择回显设置,源码进入回显逻辑引擎。源码

       3、源码源码公益服在画布中拖入对象变量节点,源码使用对象节点在打开页面时回显字段数据。源码参数名使用表单关联字段字段名,源码使用公式获取点击的源码主列表的行数据id。

       二、源码列表关联列表,源码子列表底部按钮配置逻辑引擎

       1、源码怎么求源码在主列表中增加一个类型为“列表”的源码行内按钮,点击设计进入子列表设置页面。源码

       2、弹出的页面中可配置子列表多个设置。

       选择列表:可选择已存在的列表,或点击后面“+”号进行新列表页创建;也可点击编辑按钮对选择的子列表页进行编辑。子列表筛选条件在子列表页开启对应字段查询。

       弹框标题:可设置弹出页面左上角显示所点击行数据的哪一个字段,可调整弹出页面的宽度大小。

       数据过滤:设置主列表与子列表的关联关系。如果子列表行数据中的关联字段为下拉组件,那此处关联关系为子列表关联字段包含主列表-数据id,-4的源码比如:订单明细表订单-包含-订单表数据id;如果子列表行数据中的关联字段为单行文本组件或流水号组件,那此处关联关系为子列表关联字段等于主列表字段,比如:学生表班级ID-等于-班级表班级ID。

       查询条件:默认的查询条件,可设置不可编辑状态

       按钮设置:可新增设置子列表页底部按钮,可配置按钮逻辑引擎事件。设置底部按钮后,勾选弹出页面行数据的多选框再点击底部按钮,会保存多选框的选中状态。

       3、子列表行数据多选并修改处理方式:进入按钮逻辑引擎中,使用循环容器节点,opngl源码zip循环容器节点中设置通过公式获取勾选的行数据ID。此处获取到的行数据ID是字符串数组,需要使用函数转换为对象数组才能使用。

       使用集合函数中的“ARRTOARROBJ”函数,数组转对象数组,比如:将["aaa","bbb","ccc","ddd"]转换为对象数组,第二个参数为对象的键值。配置保存后,回到列表页触发一次底部按钮。

       回到逻辑引擎中,点击触发记录回溯触发的数据。

       点击循环容器节点中的结构定义,然后点击引用测试,win论坛源码自动解析传入节点的数据。此处自动解析的参数名“key”为上一步函数中自己设置的参数。

       点击切换到循环画布,在循环画布中拖入要处理的节点,此处使用更新模型节点,循环根据对象数组更新每一行数据。

       在线demo:frame.bctools.cn/

       开源地址:gitee.com/software-mini...

       列表类干货回顾

       Java低代码核心引擎:jvs-list(列表引擎)功能(三)按钮配置与数据权限配置

       Java低代码开发:jvs-list(列表引擎)功能(二)字段及样式配置

       Java低代码开发:jvs-list(列表引擎)功能(一)配置说明

如何在java中创建一个不可变的list

       在Java中创建一个不可变的List,可以使用Collections.unmodifiableList()方法。这个方法会返回一个不可变的视图,这意味着你不能在返回的列表上进行添加、删除或修改操作。

       首先,

       java

       List originalList = Arrays.asList("Apple", "Banana", "Cherry");

       List immutableList = Collections.unmodifiableList(originalList);

       在上述代码中,我们首先创建了一个原始的List,然后使用Collections.unmodifiableList()方法创建了一个不可变的List。

       现在,让我们详细解释一下这个过程:

       在Java中,List是一个接口,它继承自Collection接口,用于存储元素的有序集合。List可以存储重复的元素,并且它允许存储null值。Java中的List接口有许多实现类,如ArrayList、LinkedList等。

       当我们想要创建一个不可变的List时,我们可以使用Collections.unmodifiableList()方法。这个方法接受一个List参数,并返回一个不可变的视图。这个视图是一个新的List实例,它与原始的List有相同的内容,但是不能被修改。任何尝试修改这个不可变List的操作都会抛出UnsupportedOperationException异常。

       值得注意的是,unmodifiableList()方法返回的仅仅是原始列表的一个视图,它并不会创建一个全新的列表。这意味着,如果原始列表在创建不可变列表之后被修改,那么这些修改也会反映在不可变列表中。因此,要确保原始列表在创建不可变列表后不再被修改,以保证不可变列表的真正不变性。

       举个例子:

       java

       List originalList = new ArrayList>(Arrays.asList("Apple", "Banana", "Cherry"));

       List immutableList = Collections.unmodifiableList(originalList);

       // This will work fine

       System.out.println(immutableList);

       // This will throw UnsupportedOperationException

       immutableList.add("Orange");

       在这个例子中,我们试图向immutableList中添加一个元素。由于immutableList是一个不可变的List,所以这个操作会抛出UnsupportedOperationException异常。

java编程中对list集合进行排序的问题?

       编写Java程序处理列表集合排序问题。

       首先,定义学生类并实现Comparable接口。

       学生类应能比较大小,通常基于计算机考试成绩和笔试成绩。

       方法实现逻辑:如果计算机考试成绩相同,则以笔试成绩确定顺序。

       学生类代码示例:

       java

       public class Student implements Comparable {

        private int computerBasedScore;

        private int paperBasedScore;

        // 构造函数、getter和setter省略

        @Override

        public int compareTo(Student other) {

        if (this.computerBasedScore == other.computerBasedScore) {

        return Integer.compare(this.paperBasedScore, other.paperBasedScore);

        }

        return Integer.compare(this.computerBasedScore, other.computerBasedScore);

        }

       }

       创建测试类,初始化列表并排序。

       生成随机学生数据,加入列表。

       执行排序操作。

       查看排序结果。

       示例排序结果:

       java

       List studentList = new ArrayList>();

       // 添加个随机学生数据

       Collections.sort(studentList);

       排序后列表展示:

       java

       // 排序后的学生列表

       在上述示例中,所有学生的数据类型应统一为整型(int)而非Integer,避免可能的类型转换问题。

copyright © 2016 powered by 皮皮网   sitemap