一周开发问题回顾(2023年08月07日-2023年08月13日)

news2024/11/23 22:58:02

一周开发问题回顾2023年08月07日-2023年08月13日

  • 1. Arrays.asList()与 new ArrayList()的区别
    • 1.1 Arrays
      • 1.1.1补充 ArrayList(Arrays.asList(array))
    • 1.2 ArrayList()
      • 1.2.1 创建ArrayList的几种方法
  • 2.Mysql中group by的使用方式
  • 3.画图
  • 4. 时间倒排
  • 5. 工厂+策略设计模式
  • 6.List注释 @Value
  • 7.在一个表中增加字段
  • 8.Java类的加载顺序
  • 9. 另一个策略+工厂
  • 10. @PostConstruct

1. Arrays.asList()与 new ArrayList()的区别

1.1 Arrays

Arrays.asList() 和 Arrays源码
在这里插入图片描述
在这里插入图片描述

Arraysjava.util包下的一个类

下面是Arrays.asList()的源码。

Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination with Collection.toArray. The returned list is serializable and implements RandomAccess.
This method also provides a convenient way to create a fixed-size list initialized to contain several elements:
           List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
       
Params:
a – the array by which the list will be backed
Type parameters:
<T> – the class of the objects in the array
Returns:
a list view of the specified array
@SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

Arrays.asList 方法,使用这个方法将会为数组创建一个固定长度(fixed-size)List 对象。这个方法只是对 array 数组进行了一次包装,以便于在程序中可以使用 List,在这个包装中没有数据被拷贝或者创建。
同时,我们也不能对新创建的 List 的长度进行修改,因为添加或者删除 List 中的元素是不被允许的。
然而,我们是可以对新创建的 List 中的数组中的元素进行修改的。需要注意的是,如果你对 List 中的元素数据进行了修改的话,那么对应 Array 的数据也被改动了。
在这里插入图片描述

补充:

参考 https://blog.csdn.net/weixin_45404202/article/details/120518876
https://cloud.tencent.com/developer/article/1860630
Arrays.asList(strs) removeAll引发得java.lang.UnsupportedOperationException异常


在这里插入图片描述

1.1.1补充 ArrayList(Arrays.asList(array))

与 Arrays.asList 方法一样,我们还可以使用 ArrayList<>(Arrays.asList(array)) 来从 Array 创建一个 List。

但是,与上面的方法不一样的是,使用这个方法创建的 List 是一个从老的 Array 中数据拷贝过来的,这个新的 List 与老的 Array 不相干,对新 List 中数据的操作不会影响到老的 Array 中的数据。

换句话说,使用这种方法创建的 List 是可以对 List 中的元素进行添加和删除操作的。
在这里插入图片描述

补充2:

List<String> timeList = Arrays.asList();
System.out.println(timeList);	
List<String> list = new ArrayList<>();
System.out.println(timeList.equals(list));


[]
true

Process finished with exit code 0

1.2 ArrayList()

Arrays.asList() 和 new ArrayList() 的区别(详解)

package java.util;
public class Arrays {
     /**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param <T> the class of the objects in the array
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
    
    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        @Override
        public int size() {
            return a.length;
        }

        @Override
        public Object[] toArray() {
            return a.clone();
        }
        .......
    }
}
  1. Arrays是一个java.util包中的一个类。通过调用asList()这个方法,获取到一个集合,asList()方法中的实现就是new ArrayList();。但是值得注意的是new的这个ArrayList不是java.util包中的ArrayList,而是Arrays中的这个内部类ArrayList。

  2. 内部类java.util.Arrays.ArrayList虽然也是继承了AbstractList这个抽象类,但是它并没有和java.util.ArrayList一样,去实现add()等方法,那这样的话,如果调用add()方法,其实就是调用父类AbstractList类当中的add()方法,但是AbstractList.add()就抛出了异常。

  3. 另外,Arrays.asList()拿到的集合是原本数组的引用,在初始化的java.util.Arrays.ArrayList的时候,将原本的数据存放到一个private并且final的数组中。

AbstractList源码:

/**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
public class Test {
    public static void main(String[] args) {
    
        String[] stringArray = new String[]{"A", "B", "C", "D"};
        List<String> stringList = Arrays.asList(stringArray);

        stringList.set(0,"E");

        Arrays.stream(stringArray).forEach((e)-> System.out.println(e));
        System.out.println("--------------");
        stringList.stream().forEach((e)-> System.out.println(e));
       System.out.println("--------------");
        stringList.add("F");
    }
}

在这里插入图片描述

  • Arrays.asList 返回的 ArrayList 是一个固定长度(fixed-size)List 对象,只对 Array 进行了包装,返回的是Array的引用(a = Objects.requireNonNull(array);),如list对元素修改,则也会改变Array 的值。
  • 没有实现 add 和 remove等 方法(不支持该操作,若操作后抛异常 java.lang.UnsupportedOperationException)。

new ArrayList()
List<String> list = new ArrayList();

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
 /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
}
  • ArrayList是java.util包中的类,如上述代码所示,ArrayList是继承了AbstractList这个抽象类,并且实现了List接口。
  • List接口的话,是集合的一个比较重要的接口。这里有一下集合的基本操作方法,比如说add,remove等一系列的操作。AbstractList这个抽象类,虽然实现了List接口,也实现了add,remove等方法,但都只是抛出UnsupportedOperationException()。具体的实现还是看ArrayList类。

1.2.1 创建ArrayList的几种方法

1. 使用默认构造函数:
```java
ArrayList<String> list = new ArrayList<>();
  1. 指定初始容量的构造函数:
ArrayList<String> list = new ArrayList<>(10);
  1. 使用Arrays.asList()方法将数组转换为ArrayList:
String[] array = {"apple", "banana", "orange"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(array));
  1. 使用Collections.addAll()方法将元素添加到ArrayList中:
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "apple", "banana", "orange");
  1. 使用双括号初始化(Double Brace Initialization):
ArrayList<String> list = new ArrayList<>() {{
    add("apple");
    add("banana");
    add("orange");
}};

2.Mysql中group by的使用方式

在这里插入图片描述

为啥SELECT * FROM tableName GROUP BY columnName语法报错?

多次group by

SELECT count(*), sum(price) 
FROM (
	SELECT dining_date, card_no, dining_type, dining_hall_id, price 
	FROM dining_logs
	WHERE staff_type=3 AND dining_date BETWEEN 20230101 AND 20230131 AND dining_hall_id <> 7
	GROUP BY dining_date, card_no, dining_type, dining_hall_id
) t

3.画图

项目的设计,画各种图需要时间此处只是补充资料 https://plantuml.com/zh/

4. 时间倒排

.sorted(Comparator.comparing(MoConfigDetailVo::getOpUpdatedAt).reversed())
				.collect(Collectors.toList());

5. 工厂+策略设计模式

首先定义一个策略模式接口

public interface Strategy {
	void process(T t, U u, V v);
}

然后创建接口的实现类,也就是不同的情况,每个策略实现的不同类。 这个实现类肯定有多个。

public class TStrategy implements Strategy {
	@Override
	public void process(T t, U u, V v) {
		实现业务逻辑
	}
}

最后建造一个工厂类

public class Factory {
	private static final Map<T, Strategy> STRATEGY_MAP;

	static {
		STRATEGY_MAP = new HashMap<>();
		STRATEGY_MAP.put(t, new TStrategy());
		STRATEGY_MAP.put(t, new SStrategy());
		STRATEGY_MAP.put(t, new UStrategy());
		STRATEGY_MAP.put(t, new VStrategy());
		STRATEGY_MAP.put(t, new WStrategy());
	}

	public static Strategy createStrategy(T t) {
		return STRATEGY_MAP.get(t);
	}
}

在实际的业务代码中

实现类如TStrategy strategy = Factory.createStrategy(t);
	if (strategy != null) {
	strategy.process(t, u, v);
	}

6.List注释 @Value

/**
 * id集合
 */
@Value("${id:11,1011,22,92,120}")
private List<Integer> ids;

7.在一个表中增加字段

ALTER TABLE  a  ADD COLUMN `b_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'B区id' AFTER `time`;

8.Java类的加载顺序

https://www.cnblogs.com/sxkgeek/p/9647992.html

9. 另一个策略+工厂

工厂

@Component
public class Factory {
	private static final Map<Integer,Class< ? extends Strategy>> STRATEGY_MAP = new HashMap<>(4);

	@PostConstruct
	public void init() {
		STRATEGY_MAP.put(Integer code, Atrategy.class);
		STRATEGY_MAP.put(Integer code, BStrategy.class);
		STRATEGY_MAP.put(Integer code, CStrategy.class);
		STRATEGY_MAP.put(Integer code, DStrategy.class);
	}

	public static Class< ? extends Strategy> createStrategy(Integer code) {
		return STRATEGY_MAP.get(code);
	}
}
public interface Strategy {
	void process(Entity record, Integer i, Vo res);
}

其中一个实现Strategy的类,因为是@Autowireddao所以需要注入spring容器管理。举例所以只写一个Strategy的实现

@Service
public class BStrategy implements Strategy {
	@Autowired
	private MoDao moDao;

	@Resource
	private Client hrClient;

	@Override
	public void process(MoEntity moRecord, Integer userGroup, MoDetailVo res) {
		LambdaQueryWrapper<Entity> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(Entity::getMoListId, moRecord.getId());
		queryWrapper.eq(Entity::getUserGroup, userGroup);
		queryWrapper.eq(Entity::getDiningDay, moRecord.getDiningDay());
		queryWrapper.eq(Entity::getMoTypeId, moRecord.getMoTypeId());
		queryWrapper.eq(Entity::getDiningShift, moRecord.getDiningShift());
		List<MoPeopleListEntity> records = moPeopleListDao.list(queryWrapper);

		if (records.isEmpty()) {
			return;
		}

	
		List<String> Ids = records.stream()
				.map(Entity::getUserId)
				.collect(Collectors.toList());

		
		Map<String, StaffInfo> staffMap = hrClient.fetchStaffByFeishuIds(Ids).stream()
				.collect(Collectors.toMap(StaffInfo::getId, e -> e));

		// 略...

		res.getPeople().getBlueCollar().addAll(peopleDetailList);
	}
}

在业务代码中,则通过SpringBeanUtil.getBean()spring容器中拿到对象,实现功能

Class<? extends Strategy> strategyClass = Factory.createStrategy(item.getCode());
			Strategy strategy = SpringBeanUtil.getBean(strategyClass);
			if (strategy != null) {
				strategy.process(moListRecord, item.getCode(), res);
			}
public class SpringBeanUtil implements ApplicationListener<ApplicationStartedEvent> {
    private static ApplicationContext applicationContext;

    public SpringBeanUtil() {
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    public String getActiveProfile() {
        return applicationContext.getEnvironment().getActiveProfiles()[0];
    }

    public void onApplicationEvent(ApplicationStartedEvent event) {
        synchronized(this) {
            if (applicationContext == null) {
                applicationContext = event.getApplicationContext();
            }

        }
    }
}

10. @PostConstruct

@PostConstruct是一个在Java中常用的注解,它用于指定一个方法在对象创建后立即执行。这个注解通常用于初始化资源、执行配置或进行其他一次性的操作。

使用@PostConstruct注解的方法将在依赖注入完成后被调用,但在对象被放入服务之前。它可以用于任何类或bean中,包括普通的POJO类、Spring管理的组件、EJBs等。

下面是一个示例,展示了如何在一个Spring组件中使用@PostConstruct注解:

@Component
public class MyComponent {

    @PostConstruct
    public void init() {
        // 在对象创建后进行初始化操作
        System.out.println("执行初始化操作");
    }
}

在上述代码中,MyComponent类被注解为一个Spring组件,并在init()方法上使用了@PostConstruct注解。当Spring容器创建并初始化MyComponent对象时,init()方法将被自动调用。

需要注意的是,@PostConstruct注解需要依赖于Spring或其他框架,以确保方法的正确调用。在纯Java环境中,@PostConstruct注解可能不会被识别和触发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三课-界面介绍SD-Stable Diffusion 教程

前言 我们已经安装好了SD&#xff0c;这篇文章不介绍难以理解的原理&#xff0c;说使用。以后再介绍原理。 我的想法是&#xff0c;先学会画&#xff0c;然后明白原理&#xff0c;再去提高技术。 我失败过&#xff0c;知道三天打鱼两天晒网的痛苦&#xff0c;和很多人一样试了…

<Vite>HMR实现原理

什么是HMR&#xff1f; HMR&#xff08;Hot Module Replacement&#xff09;是一种开发工具&#xff0c;也就是热更新。用于在应用程序运行时替换、添加或删除模块&#xff0c;而无需完全重新加载整个页面或重新启动应用程序。这可以极大地提高开发效率和调试体验。 HMR的优势 …

MyEverything项目测试

一、自动化测试用例 二、功能测试 测试环境&#xff1a;win10、IDEA 2020.3.3 2.1目录文件选择功能 测试步骤&#xff1a; 1、运行项目&#xff0c;点击"选择目录"按钮 2、选择目标文件夹 3、点击"选择文件夹按钮" 4、重复上面三个步骤一次 期望结…

【C语言】每日一题(错误的集合)

最近在牛客、力扣上做题&#xff0c;花费海量时间&#xff0c;苦不堪言&#xff0c;有时绞尽脑汁也想不出&#xff0c;痛定思痛&#xff0c;每日记录写的比较困难的题。 错误的集合 题目如上图所示 题主乍看之下觉得很简单&#xff0c;再看例子&#xff0c;不就是一个有序数组…

【npm run dev报错】无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

1.winX键&#xff0c;使用管理员身份运行power shell 2.输入命令&#xff1a;set-executionpolicy remotesigned 3.输入”Y“,回车&#xff0c;问题解决。 文章来源&#xff1a;无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。 - 前…

自制手写机器人

写字机器人模拟在画图板上写字效果 写了一套写字机器人代码&#xff0c;有多种字体可供选择&#xff0c;需要的朋友私信获取代码和软件

LNMP分离部署

目录 前言 搭建LNMP 一、安装Nginx 配置基础环境 更改配置 二、安装Mysql 配置基础环境 重置root用户密码 登录创建数据库和授权用户 三、安装PHP 配置基础环境 验证Nginx 拓展连接Discuz 总结 前言 基于生产环境&#xff0c;如果所有服务都安装在一台主机上&…

C++入门之语法

不想写std::怎么办 https://blog.csdn.net/CSDN_fzs/article/details/105678692 1 基础必会 1.3 变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内存 语法&#xff1a;数据类型 变量名 初始值; 示例&#xff1a; #include<iostream> usi…

面试总结-webpack/git

说说你对webpack的理解 webpack 是一个静态模块打包器&#xff0c;整个打包过程就像是一条生产线&#xff0c;把资源从入口放进去&#xff0c;经过一系列的加工&#xff08;loader&#xff09;&#xff0c;最终转换成我们想要的结果&#xff0c;整个加工过程还会有监控&#x…

Java获取指定文件夹下目录下所有视频并复制到另一个地方

import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption;public class VideoCopier {public static void main(String[] args) {// 指定源文件夹路径和目标文件夹路径String sourceFolderPath "path/to…

Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?

摘要 大语言模型能够通过上下文学习-只需要在推理阶段加入一些输入-标签的示例对&#xff0c;就能完成对新输入文本的预测。但是&#xff0c;对模型是如何学习&#xff0c;示例的哪些方面会影响最终的任务效果&#xff0c;我们知之甚少。在这篇纹章中&#xff0c;我们揭示了 正…

postman官网下载安装登录测试详细教程

目录 一、介绍 二、官网下载 三、安装 四、注册登录postman账号&#xff08;不注册也可以&#xff09; postman注册登录和不注册登录的使用区别 五、关于汉化的说明 六、使用示范 一、介绍 简单来说&#xff1a;是一款前后端都用来测试接口的工具。 展开来说&#xff1a;…

Redis集群(三十七)

部署搭建Redis主从复制、哨兵模式、集群部署 目录 一、Redis主从复制 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;缺点 &#xff08;四&#xff09;流程 &#xff08;五&#xff09;搭建 二、Redis哨兵模式 &#xff0…

单体版ruoyi代码生成增删改查

目录 拉取代码 打开代码&#xff0c;新建一个模块&#xff0c;模块放我们的项目后台数据库的curd代码。 我们的新模块引入ruoyi的通用模块 ruoyi的adm引入我们的项目依赖&#xff0c;引用我们的模型、service、mapper 将我们的模块注入父项目 打开ruoyi-adm配置MyBatis&…

UDS的DID(Data identification)

引言 DID是UDS中的一个重要概念&#xff0c;它代表着特定的数据标识符。DID用于标识和获取ECU中的特定参数数据&#xff0c;如传感器数据、状态信息等。通过使用DID&#xff0c;诊断工具可以准确地获取所需的数据&#xff0c;从而帮助诊断人员更好地了解车辆的状态和性能。 D…

芯片工程师求职题目之CPU篇(3)

1. 什么是cache(缓存)&#xff1f;它的工作原理是什么&#xff1f; Cache是少量的快速内存。它位于主存储器和中央处理器之间。每当CPU请求memory位置的内容时&#xff0c;首先检查cache中是否有此数据。如果数据存在于cache中&#xff0c;CPU直接从cache中获得数据。这是更快…

必备工具:Postman Newman 详解

目录 Postman Newman 是什么&#xff1f; Postman Newman 的作用 如何使用 Postman Newman&#xff1f; 第一步&#xff1a;安装 Node.js 第二步&#xff1a;全局安装 Newman 第三步&#xff1a;导出集合或环境变量为 JSON 格式 第四步&#xff1a;使用 Newman 运行测试…

IDEA部署配置Maven项目教程,IDEA配置Tomcat(2019.3.3)

一、前言 当涉及到软件开发和项目管理时&#xff0c;使用一个可靠的构建工具是非常重要的。Maven是一个广泛使用的构建工具&#xff0c;它为Java项目提供了一种简化的构建过程和依赖管理。 在本文中&#xff0c;我们将探讨如何部署Maven并开始使用它来构建您的项目。我们将介绍…

快递管理系统springboot 寄件物流仓库java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 快递管理系统springboot 系统有1权限&#xff1a;管…