精华内容
下载资源
问答
  • Java创建List、Map等集合对象的同时进行赋值操作
    千次阅读
    2021-03-06 14:58:42

    问题简介

    在Java当中,若希望在创建数组的同时给数组赋值很简单,可以想下面这样:

    int[] num = {1,2,3};

    String strs = {"a", "b", "c"}

    但是,如果我们创建List集合,或者Map集合时,也想快速地为它赋初始值,应当如何做呢?

    解决方式

    方式1:调用函数

    请看如下代码:

    ArrayList list = new ArrayList<>(Arrays.asList("aa", "bb", "cc"));

      Arrays.asList(T... a) 方法的参数是一个可变长参数,也就是说他能够传入一个数组,也能够传入多个参数,而它的作用就是将传入的数组或多个数据封装成List集合返回,而上面的代码就是接收返回的List集合,并将其作为参数传入ArrayList的构造方法,创建一个新的ArrayList对象。

    说到这里有人可能要问了,为什么不能直接将asList方法的返回值赋给list参数,而要将它传入构造器创建新的对象呢?这不是脱裤子放屁——多此一举吗。当然不是,请看下面的代码:

    // 代码1

    List list1 = Arrays.asList("aa", "bb", "cc");

    list1.add("dd"); // UnsupportedOperationException

    // 代码2

    String[] str = {"a","b","c"};

    List list = Arrays.asList(str);

    str[0] = "e"; // list中的0号位置也一同改变

      上面有两段代码,看似没有问题,但是运行结果却和大家想象的有些不同。首先代码1,使用asList方法返回的创建的List对象,不允许进行修改操作,否则将会抛出一个UnsupportedOperationException;再来看代码2,我们将一个数组作为asList的参数,得到一个List对象,但是此时我们改变这个数组中元素的值,list对象的值也会发生改变,因为这个List对象底层引用的就是这个数组,并且和代码1一样,这个list也不能修改。

    但是,若我们将返回的List对象作为参数传入ArrayList的构造器中,这个问题就不会发生,因为ArrayList的构造器将会把传入的list中所有的元素复制一份,因此不会影响到原数组,且可以随意改变。

    方式2:匿名内部类

    这是一个非常机智的方式,就是看到了下面这行代码,我才忍不住写了这篇博客:

    List list = new ArrayList(){ {add("a"); add("b"); add("c");} };

    乍一看是不是有点懵逼,我们将这段代码展开来看,就会清晰很多:

    List list = new ArrayList() {

    {

    add("a");

    add("b");

    add("c");

    }

    };

    这下应该比之前容易理解了。这段代码就是创建了一个匿名内部类对象,且这个类继承自ArrayList,在这个匿名内部类中添加了一个非静态代码块,并在代码块中调用了三次add方法,为这个List对象赋值。

    我们知道,若我们想创建一个对象,可以直接new 构造方法,但是我们若想写一个匿名内部类,这个匿名内部类继承自某个类,只需在构造方法后面加上一对大括号。同时,非静态代码块会在构造方法执行前被执行,所以我们将赋值语句放在了代码块中,于是就有了上面这段代码。若还是看不明白,没关系,看下面这段代码十有八九就明白了,我们将上面的代码换另一种方式写出来:

    public class Test {

    public static void main(String[] args) {

    List list = new MyList();

    }

    }

    // 创建一个类继承自ArrayList

    class MyList extends ArrayList{

    // 在类的非静态代码块中编写赋值语句

    {

    add("a");

    add("b");

    add("c");

    }

    }

    以上代码就是最开始那句代码的完整版,创建一个MyList类(名字随意),继承自ArrayList,并编写一个非静态代码块调用三次add方法,这个代码块将会在构造方法执行前被执行,因此创建一个MyList对象后,它肯定已经有三条数据了。若到此时还没有听懂,可能就需要去了解一下匿名内部类,以及代码块的执行机制了。

    这种为集合赋值的好处就是,它可以用在任意一种集合类型上(Map,Set......),如下代码:

    // 使用此方法为map赋值

    HashMap map = new HashMap() {

    {

    put("a", 1);

    put("b", 2);

    put("c", 3);

    }

    };

    当然,这种方法也有一些弊端,就拿ArrayList来说,那就是这种方法得到的对象,它的类型并不是ArrayList,我们调用对象.getClass().getName()方法获取对象的类名,得到的是代码所在类的类名+$1(这里和匿名内部类的机制有关,就不详细叙述了)。所以在代码中,如果对对象的类型有着严格的要求,就需要谨慎考虑是否应该使用这种方式。

    博客总结

    在平常编写代码时,还是第一种方式使用的比较多,因为简单而且不容易产生问题;而第二种方,我个人建议还是少用(虽然我就是为第二种方式写的博客.....),因为在类型要求严格的程序中,可能会产生问题。当然,第二种方式真的非常机智(感叹),而且可以用在各种类型的集合上,学习一下还是很有帮助的。

    参考文献

    《Java核心技术 卷Ⅰ》

    更多相关内容
  • 首先,一个集合list包含了:定义List list; )、初始化( list = null; 或者List list = new ArrayList(); )和赋值list.add(字符串、对象。。); )。 list定义: List list; 此时list为未定义状态,不可以...

    首先,一个集合list包含了:定义( List list; )、初始化( list = null; 或者List list = new ArrayList(); )和赋值( list.add(字符串、对象。。); )。

    list定义:

    List list;

    此时list为未定义状态,不可以使用System.out.println();直接输出,不能使用isEmpty()等方法,输出结果如图。

    在这里插入图片描述

    list初始化:

    List list = null;

    此时的list没有指向地址,但可以进行输出打印,打印结果为null;不可以调用isEmpty()等方法,会报空指针异常错误,输出结果如图。

    在这里插入图片描述

    在这里插入图片描述
    List list = new ArrayList();

    此时list已经包含指向地址,可以进行打印输出和调用isEmpty()方法,输出结果如图。

    在这里插入图片描述

    赋值

    list.add(字符串、对象。。);

    为list集合赋值,此时list中的长度已经大于一,不在为empty空了。

    在这里插入图片描述

    小结:当list为null的时候,假如调用了size()方法,就相当于null.size();这就是所谓的NullPointException空指针

    展开全文
  • 怎样新建List并赋值

    2022-01-25 17:51:24
    List类型的集合添加集合元素是采用add方法, C.add(参数); 参数是要放进集合中的对象。 List<?> qm= new ArrayList<String>() { { this.add("One"); this.add("Two"); this.add("Three"); }...

    List 是个接口,不能new List<?>(),
    可以实例List的实现类例如ArrayList,
    给List类型的集合添加集合元素是采用add方法,
    C.add(参数); 参数是要放进集合中的对象。

    List<?> qm= new ArrayList<String>() {
        {
    	     this.add("One");
         	 this.add("Two");
         	 this.add("Three");
        }
        {
         	 this.add("four");
         	 this.add("five");
         	 this.add("six");
        }
    };
    System.out.println(qm);
    

    结果:
    在这里插入图片描述
    直接new List<>()报错如下图:
    在这里插入图片描述

    展开全文
  • javaList集合的两种赋值方式

    千次阅读 2021-02-05 20:11:19
    写在之前 在开发中难免会有...//将merchantDTO赋值给entity(相同的属性) BeanUtils.copyProperties(merchantDTO,entity); 使用mapstruct转换 首先在项目中引入依赖 <!-- MapStruct代码生成器,对象转换 -->
    写在之前

    在开发中难免会有entity,vo,dto之间的转换那么如何优雅快速的进行转换呢?当然你可以get在set显然不推荐这样做!

    对象转换

    使用BeanUtils工具类copyProperties方法

    像这样

    //将merchantDTO赋值给entity(相同的属性)
    BeanUtils.copyProperties(merchantDTO,entity);
    

    使用mapstruct转换

    首先在项目中引入依赖

    <!--       MapStruct代码生成器,对象转换 -->
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-jdk8</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${org.mapstruct.version}</version>
            </dependency>
    

    新建接口

    @Mapper//这里的mapper是包org.mapstruct.Mapper
    public interface AppCovert {
        AppCovert INSTANCE = Mappers.getMapper(AppCovert.class);
        /**
         * entity转dto
         */
        AppDTO entityTodto(App entity);
    
        /**
         * dto转entity
         * @param dto
         * @return
         */
        App dtoToEntity(AppDTO dto);
    }
    
    

    注:使用泛型支持所有类型的List转换
    使用

    //将entity转换为dto
    MerchantDTO merchantDTO = MerchantDetailConvert.INSTANCE.entityTodto(merchantInfo);
    

    List转换

    使用BeanUtils工具类

    集合转换是不是也想使用copyProperties方法?对你想的没错,想对了一半
    只不过要对copyProperties方法进行封装
    像这样

     /**
         * @param sources: 数据源类
         * @param target: 目标类
         * @return 赋值后的list
         */
        public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanCopyUtilCallBack<S, T> callBack) {
            List<T> list = new ArrayList<>(sources.size());
            for (S source : sources) {
                T t = target.get();
                BeanUtils.copyProperties(source, t);
                list.add(t);
            }
            return list;
        }
    

    使用

     List<Merchant> entity = new ArrayList<>();
            Merchant merchant = new Merchant();
            entity.add(merchant);
            List<MerchantDTO> ts = BeanCopyUtil.copyListProperties(entity, MerchantDTO::new);
    

    使用mapstruct转换

    定义接口

    @Mapper
    public interface AppCovert {
    AppCovert INSTANCE = Mappers.getMapper(AppCovert.class);
        /**
         * entityList转dtoList
         * @param app
         * @return
         */
        List<AppDTO> listEntityToDto(List<App> app);
    
    }
    
    

    使用

    List<App> apps = new ArrayList<>();
    List<AppDTO> appDtos = AppCovert.INSTANCE.listEntityToDto(apps);
    

    对比BeanUtils工具类,mapstruct对象转换显得比较繁琐!

    展开全文
  • java--新建list 并赋值

    千次阅读 2019-09-21 10:55:32
    数组初始化 时候的赋值 String[] strings = new String[]{ "one","two","three" ...list初始化时候的赋值 List<String> a = new ArrayList<String>() {//这个大括号 就相当...
  • 定义:原集合A、新集合B、以及数组arr。 需求:原集合A,递增取出数组中arr的元素,及[1]、[1,2]、[1,2,3]…[1,2,3,4,5]; 再将集合A插入到集合 B中,最终使得集合B:[[1],[1,2,],[1,2,3],[1,2,3,4],[1,2,3,4,5]]...
  • 1、需求描述: 在Java当中,若希望在创建数组的同时给数组... 但是创建一个List、Set、Map的同时该如何进行赋值操作呢? 2、解决方法: 1、方法一:调用函数方法 ArrayList<String> list = new Arra...
  • C# 如何给一个类中的LIST集合赋值

    千次阅读 2020-06-11 09:52:50
    首先定义一个类: 这个集合里面的字段。
  • Java 数组、List初始化赋值

    千次阅读 2021-04-15 19:38:12
    1 数组初始化赋值 ...2 List初始化赋值 //第一种初始化赋值方式(推荐) List<String> strList1=Arrays.asList(new String[]{"1","2"}); //第二种初始化赋值方式 List<String> strList2=new ArrayList
  • Java中怎样新建一个list并给其赋值

    千次阅读 2020-08-19 08:12:45
    如果想在新建一个list并赋值要怎么办。 注: 博客:https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 List<String> list= new ...
  • 1.在resource目录下创建jihe.properties文件 2.写代码 3.在浏览器中运行
  • import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import java.util.ArrayList;...import java.util.List; import java.util.UUID; import java.util.stream.Collectors; /** * d...
  • java创建List时候 初始化赋值

    万次阅读 多人点赞 2019-08-04 17:19:07
    在这之前 可能有的读者, 只知道数组初始化 时候的赋值。 String[] strings = new String[]{ "one","two","three" }; 当创建list时候,也许 你还会写过以下代码 正确的写法 ...
  • List初始化赋值的几种方式

    万次阅读 2021-02-05 10:24:06
    今天在修改sonar提出的bug,sonar对于list匿名内部类不支持使用。所以百度了一下,了解了list的其他几种初始化方式,现记录一下。 1.构造 List 后使用 List.add 初始化 List<String> stringList = new ...
  • 遍历集合,然后按照这个形式向list中的对象添加元素
  • I . 定义集合并初始化 II . 集合泛型用法 III . 集合添加元素 IV . 集合生成函数 V . 集合遍历 VI . 集合示例代码
  • axios获取后台list赋值给vue集合

    千次阅读 2019-12-05 16:24:30
    我是使用钩子函数获取后台数据,想将java list赋值给vue 集合,我发现需要如何拿到vue的集合,和如何插入数据,这个两个问题 代码 数据定义代码 export default { name: "userIfno", data() { return { ...
  • Java关于List对象集合的遍历、对象赋值和向前台传递 在前几天的编程过程中,发现前台需要的数据不完整。从数据库查出来的字段不够,如果再多表联查或者左联会有我不想要的重复数据,而且会使SQL更加复杂,不利于维护...
  • 结构体的定义、初始化和赋值

    千次阅读 2021-05-21 12:26:09
    描述结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量...
  • 最近在写代码的时候发现一个问题:我定义了两个List集合A,B,先对第一个集合A add数据进去,接着直接将A的数据赋值给B,结果后面我将集合A给clear掉,然后使用B集合的数据,结果报了数组越界异常。 最后发现集合B的...
  • python中list赋值

    千次阅读 2018-10-23 14:24:23
    1、直接用等号赋值,类似c中的引用   2、想要实现赋值的功能,需要使用.copy
  • java-使用for循环给list赋值

    万次阅读 2019-03-04 12:47:17
    最近在使用for循环给list赋值,最后发现list中的所有对象的值都变成了最后一个对象的值了,查资料才知道list在调用add()方法时,每次都只是保留的一个对象的引用,如果在for循环外面new list的对象,最后list集合...
  • 声明:ArrayList a, 仅仅只是声明了一个list变量,其未来作用相当于C++中的引用变量,亦或者相当于一个对象块的索引,但未为其分配具体的完整的对象所需要的内存空间,其所分配的空间仅仅只是"a"变量所需空间。...
  • 这是自定义的list ,你们可以用jdk中的list,都一个意思 MyArrayList list1 = new MyArrayList(); show1 s =new show1(); s.setId(1); s.setSoftware(“iphone”); show1 s1 =new show1(); s1.setId(2); s1....
  • JAVA List合并集合

    千次阅读 2021-03-04 07:43:39
    import java.util.ArrayList;...public class test {public static void main(String[] args) throws Exception {/*测试合并两个类型相同的list*/List list1 = new ArrayList();List list2 = new ArrayList(...
  • java数据集合赋值与读取

    千次阅读 2019-07-17 09:07:01
    读取list集合的值,这里的List中String是集合类型,也可以设置为对象类型 public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext context=new ...
  • List提供的方法中,提供了将一个类型的List转换成为另一个List类型的方法,如下:  //构造类1集合 TestClass1 test1 = new TestClass1(); List class1 = new List(); test1 .Name ="lhc";
  • 在C#中,类中定义list需要初始化,不然就会报空。 在调试的时候发现,编辑器的解释为get方法为null;所以有没有大神给小弟解惑一下~~~ 问题:new一个新的对象,调用对象中的list进行赋值,一直报错list为空! 解决...
  • 1. 集合定义什么是集合呢?定义集合是一个存放对象的引用的容器。在Java中,集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器,就会想起数组,那么集合和数组的区别是什么呢?(这里是重点,面试...
  • spring的集合属性赋值

    千次阅读 2018-01-29 19:53:16
    List集合属性赋值 Xml配置 集合属性赋值 -->  bean id="collectionProperty" class="cn.itcast.spring.demo8.CollectionProperty">  property name="list">  list>  value>abcvalue>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,591
精华内容 63,036
热门标签
关键字:

定义list集合并赋值