精华内容
下载资源
问答
  • 您不能分配列表< Number>到List< Integer>...如果您被允许这样做,则允许以下内容:List numbers = new ArrayList();numbers.add(1.1); // add a doubleList ints = numbers;Integer fai...

    您不能分配列表< Number>到List< Integer>类型的引用因为List< Number>允许除Integer之外的数字类型.如果您被允许这样做,则允许以下内容:

    List numbers = new ArrayList();

    numbers.add(1.1); // add a double

    List ints = numbers;

    Integer fail = ints.get(0); // ClassCastException!

    类型List< Integer>正在保证它包含的任何内容将是一个整数.这就是为什么你被允许从其中获得一个整数,而不是投射.如您所见,如果编译器允许将另一类型的列表(例如Number)分配给List< Integer>那个保证会被打破.

    分配列表引用一个类型,例如List或列表扩展号>是合法的吗?意思是“给定类型的某些未知子类型”(在“?”的情况下,类型为“Object”,“Number”).

    既然?表示您不知道List将接受什么特定类型的对象,添加任何东西但不为null是合法的.但是,您是否允许从其中检索任何对象,这是使用的目的?扩展X有界通配符类型.请注意,相反的是一个?超X有界通配符类型…一个列表超级整数>是“至少是整型的超类型的一些未知类型的列表”.虽然您不知道确切地知道什么类型的列表(可以是List< Integer>,List< Number>,List< Object>),但您可以确定,无论它是什么,都可以添加一个整数.

    最后,新的ArrayList()不合法,因为当您创建像ArrayList这样的参数化类的实例时,必须给出一个特定的类型参数.你可以真正使用你的例子中的任何东西(Object,Foo,没关系),因为你直接将它分配给一个ArrayList参考.

    展开全文
  • JAVA泛型ArrayList<E>.add

    2019-12-09 21:03:51
    import java.util.ArrayList; import java.util.Iterator; public class test <T> { public ArrayList<T> list=new ArrayList<>(); private Iterator<T> it =list.iterator(); ...
  • 先右转大佬博客:java泛型,再接下面。首先准备几点:1.定义泛型方法需要在返回值前加上泛型参数。就是public T method(T a){...}这样2.类的参数是E,即Arraylist,与泛型方法public T[] toArray(T[] a)中的参数T...

    先右转大佬博客:java泛型,再接下面。

    首先准备几点:

    1.定义泛型方法需要在返回值前加上泛型参数。就是public T method(T a){...}这样

    2.类的参数是E,即Arraylist,与泛型方法public T[] toArray(T[] a)中的参数T不同,注意!

    3.父类对象能够显式强制转换为子类对象的前提:该对象本质上是子类(或子类的子类)的对象。

    Object o=new String("sss");//o是一个子类对象String的引用

    String s=(String)o;//不出错

    o=new Object();//o不是子类对象的引用

    s=(String)o;//出错

    懂得都懂,大意就是子类对象变成父类对象后,父类对象才能使用强制转换变回子类对象

    4.数组也是对象,由jvm提供定义和初始化。但Object[]类型与String[]类型之间无继承关系(例子)。

    但是他们有协变(java少有的特例支持),使得数组对象也能像父类子类一样转换。一样的举例:

    Object[] o=new String[]{"sss"};

    String[] s=(String[])o;//不出错

    o=new Object[]{};

    s=(String[])o;//出错

    上面看完,讲讲为什么public T[] toArray(T[] a)写成这样。(以Arraylist list举例)

    由于泛型被擦除,实际Arraylist的储存结构就是一个Object[] 数组对象。因此另一个重载方法public Object[] toArray()直接就把该Object[] 返回。

    问:为什么不直接public E[] toArray()这样返回呢?

    首先看大佬博客分析,这里E被擦除后就等同是Object,分析class文件中可看出方法实际返回仍是Object[]而并非String[],最后是由编译器偷偷分析list对象的声明,再马上追加强制转换(String[])到结果上(这个过程用户感觉不到)。

    所以这样结果就是方法返回Object[]对象,编译器尝试把Object[]强制转换为String[]对象,根据上面提醒过的注意事项,这样的转换是不能进行的。(同理,你肯定试过String[] strs=(String[]) Arraylist.toArray();然后发现出错,其实就是和上面所说的编译器做一样的事情)。所以只要不是Arraylist,就肯定会有类型转换错误的提示。

    问:所以加个参数T[] a就能解决了吗?

    是的,主要思路:Object[]中数组元素实际上都是String对象(因为你用add()的时候都是add一个String进去),只要把元素逐个强制转换为String,再加入到一个String[] strs里面,然后返回(Object[])strs,最后编译器追加强制转换(String[])到结果上时,就不会出错(子类->父类->子类,没问题)。

    这个a最主要目的就是通过a.getClass()获取类型信息,来让方法知道去把Object强制转换成String。其次是空间足够时直接用来放转换出来的String对象。源码:

    public T[] toArray(T[] a) {

    if (a.length < size)

    // Make a new array of a's runtime type, but my contents:

    return (T[]) Arrays.copyOf(elementData, size, a.getClass());

    System.arraycopy(elementData, 0, a, 0, size);

    if (a.length > size)

    a[size] = null;

    return a;

    }

    想知道a.getClass()可以怎样提供信息的,右转java反射:java反射

    展开全文
  • JAVA泛型数组ArrayList详解

    千次阅读 2018-11-20 17:13:48
    下面来解释一下泛型数组ArrayList泛型数组来解释一下这个原理): java没有增加泛型类之前: 在java增加泛型类之前,泛型设计是通过继承实现的。ArrayList类只维护一个Object引用的数组: public class ...

    泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集String和File对象分别设计不同的类。下面来解释一下泛型数组ArrayList(泛型数组来解释一下这个原理):

    java没有增加泛型类之前:

    在java增加泛型类之前,泛型设计是通过继承实现的。ArrayList类只维护一个Object引用的数组:

    public class ArrayList{
        private Object[] elementData;
        ...
        public Object get(int i ){...}
        public void add(Object o){...}
    }

    那么问题来了,ArrayList的get和set方法必须进行类型转换,例如:

    ArrayList arr = new ArrayList();
    String name = (String)arr.get(0);

    而且可能出现错误:

    arr.add(new File("..."))

    上述代码编译和运行都不会报错,然而如果我们把它get取出来之后强制转化为String类型,就会产生一个运行时出错误。

    增加泛型类之后: 

    声明数组:

    ArrayList<Integer> arr = new ArrayList<>();

    这样他维护的实力类型就确定了,都是Integer类型。

    ArrayList的一大优点是,他的大小可变,当他的存储空间不能在存储新的数据时,他会自动创建一个新的更大的数组,把当前数组的值拷贝过去,原来的比较小的空间就等待GC回收空间了。 

    ArrayList的一些方法:

    ArrayList<E>()  //都遭一个空数组列表
    ArrayList<E>(int initialCapacity)    //指定数组长度
    void ensureCapacity(int capacity)    //查看是够有足够的空间
    void trimToSize()     //将数组列表的存储容量消减到当前尺寸

     

    展开全文
  • 一、说明Java 提供一个类可以解决数组的动态长度的问题,它就是 ArrayList 类,即泛型数组列表,也就是所谓的动态数组。使用 ArrayList 可以实时地添加元素而不用去管长度的问题。ArrayList 属于集合类库,实现了 ...

    一、说明

    Java 提供一个类可以解决数组的动态长度的问题,它就是 ArrayList 类,即泛型数组列表,也就是所谓的动态数组。使用 ArrayList 可以实时地添加元素而不用去管长度的问题。

    ArrayList 属于集合类库,实现了 List 接口。

    二、基本使用

    1.声明

    ArrayList 是一个采用 类型参数 的 泛型类。需要用尖括号将类名括起来加在后面,以指定数组列表保存的元素对象类型。注意尖括号内只能是类,不能是基本数据类型,如要存储基本数据类型,可使用对象包装器(Integer 等)

    ArrayList arrList = new ArrayList(); //声明和构造一个用来保存 String 类型的动态数组

    2.元素的添加与移除

    使用 add 方法将元素添加到数组列表中,分为默认的末尾添加和指定顺序添加。使用索引添加时,索引后面的元素都会往后移一位。

    arrList.add("first");//添加到末尾

    arrList.add(3,"third");// 通过索引添加到第三位,原本在第三位及后面的元素顺次后移

    使用 remove 方法删除指定位置元素,其后的元素将顺次前移,删除的元素将通过返回值返回。

    String s = arrList.remove (3);//删除第三个元素,s = third

    对数组实施插入和删除操作的效率很低。

    3.获取数组长度

    使用 size 方法获取数组列表的实际元素长度 ,相当于数组的 length 方法。

    4.访问数组列表元素

    ArrayList 的元素只能通过 set(替换元素) 和 get(获取元素) 方法访问。注意,使用 set 方法设置元素时,只能替换已经存在的元素。

    5.将 ArrayList 转换为数组

    使用 toArray 方法将 ArrayList 转换为数组。

    String [] arr = new String[arrList.size()];

    arrList.toArray(arr);

    三、扩展使用

    1.长度问题

    如果能够预估数组的元素数量,可以预先设置数组大小,先分配固定空间。有两种方法预设,分别是构造时传入参数和 ensureCapacity 方法。

    ArrayList aList = new ArrayList<>(100);

    ArrayList bList = new ArrayList<>();

    bList.ensureCapacity(100);//要在数组使用前调用

    两种方法均为数组分配100个对象的空间。

    ArrayList 的初始分配空间和数组不同,ArrayList只是预留空间,其内没有元素。

    如果添加时元素超过100个,会再次分配100个空间。这意味着如果有102个数,ArrayList的实际占用空间是200个对象的空间。

    在长度确定之后,可以使用 trimToSize 方法将容量削减到当前尺寸。但再次添加时又会增加100个空间。

    2.ArrayList 还有一些不常用的方法,如 isEmpty 判断是否为空、addAll 添加集合等,使用时参考官方文档。

    展开全文
  • packagePlan.GenericDemo;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importorg.junit.Test;publicclas...
  • Java泛型ArrayList(1)

    千次阅读 2018-07-22 23:20:41
    Java 5之后,Java中引入了泛型,参数化类型的概念。允许程序在创建集合时指定集合元素的类型。 public class Genericc { public static void main(String[] args) { List &lt;String&gt; list = new ...
  • packagePlan.GenericDemo;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importorg.junit.Test;publicclas...
  • Java泛型_ArrayList

    2008-11-30 14:58:00
    import java.util.*;public class ArrayListTest{ public static void main(String[] args) { ArrayList staff = new ArrayList(); staff.add(new Employee("Guos",1000.
  • 先把代码贴出来public class Test01 {public static void main(String[] args) throws Exception{[color=red]ArrayList[/color] arr1=new ArrayList();[color=red]ArrayList[/color] arr2=new ArrayList();//下面...
  • *java泛型泛型避免了强转import java.util.ArrayList;import java.util.Iterator;public class GenericDemo {/*** 泛型:JDK1.5版本以后出现的新特性,用于解决安全问题的,是一个类型安全机制。* 好处:* 1.将运行...
  • Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型参数化类型:ArrayList中的E称为类型参数...
  • Java泛型(拓展ArrayList、HashMap)

    千次阅读 2018-10-02 13:50:14
     Java中有泛型这个概念,最开始可能一脸懵逼,因为泛型听起来很高大上的样子,其实Java中的泛型就是C++中的模板类(Template),这样在Java泛型中就可以很轻松的建立各种自定义类型的List了,有没有觉得很舒服。...
  • java 泛型参数_Java泛型

    2021-02-12 09:34:24
    一、概述Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制...
  • Java中,解决这个问题最简单的方式是使用JavaArrayList类。 下面声明和构造一个保存Employee对象的数组列表。 ArrayList<Employee> staff = new ArrayList<Employee>(); 在Java SE7中,可以省去...
  • Java 泛型数组列表 ArrayList (动态数组)的使用 https://www.jianshu.com/p/a4974f3f4393
  • Java-泛型-ArrayList

    2020-07-24 21:17:23
    Java ArrayList ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下: import java....
  • Java知识点总结(Java泛型)@(Java知识点总结)[Java, Java泛型][toc]泛型泛型就是参数化类型适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是“模版”优点:使用泛型时,在实际使用之前类型...
  • package com.test.xiti; import java.util.*; import com.test.tools.*; /*  * javac DataOnlyTest.java -d ./  * java com/test/xiti/DataOnlyTest  */  class Apple{ private static long counter; priva
  • Java 泛型泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的(运行阶段泛型没用)使用泛型的...导致集合中存储的元素缺乏多样性import java.util.ArrayList;import java.util.Iterator;import java.ut...
  • 泛型(generics)前言出现的原因:想让一个类可以用于所有类型,但是我们在以前定义的时候,只能定义...import java.util.ArrayList;import java.util.List;public class GenericTest {public static void main(Strin...
  • ArrayListJava泛型

    千次阅读 2016-06-12 17:58:59
    ArrayListJava泛型 一、知识点 1、Java 泛型 2、Java 多态 3、Java ArrayList源码 二、个人理解 1、泛型更形式面向对象思想多态的扩展,它的使用范围更多的针对于类类型的参数、方法参数、方法返回值等等...
  • java泛型特点_Java泛型

    2021-03-01 09:14:53
    使用泛型的优缺点:优点:避免了类型转换的的麻烦,存储什么类型,取出什么类型;把运行异常,提升到了编译期缺点...)不能把ArrayList向上转型为ArrayList使用泛型时,把泛型参数替换为需要的class类型:List list ...
  • 虽然 Java 中允许在运行时确定数组的大小。int size = ...;...在 Java 中,解决这个问题最简单的方法是使用 Java 中另外一个类,名为 ArrayListArrayList 类类似于数组,但在添加或删除元素时,它能够自动地...
  • 一、泛型概述:1.来源:1.5jdk出现的新特性;用于解决安全问题,是一个安全机制;//下面代码,编译不...3.关键字:public classTest {public static voidmain(String[] args) {ArrayList arrayList= newArrayList...
  • java泛型 null_Java泛型

    2021-03-08 09:15:17
    1、什么是泛型泛型就是 参数类型化 ,... 明确类型 避免类型转换如,没有泛型前,从List中取数据都是Object类型的 需要强制转换为确定的类型public static void main(String[] args) {List myList = new ArrayList()...
  • 因为java泛型并不是在java诞生之初就加入的,在很长的一段时间里,java是没有泛型的,在需要泛型的地方,统统都采用协变的方式,也就是采用Object,比如ArrayList类,元素的类型就是Object。为了兼容原来的代码,...
  • 泛型的本质是什么什么是泛型泛型是一种模板技术,就好比排序,所有...结合这种概念,就有了泛型集合,好比ArrayList集合的实现,无论对于什么数据类型,其算法结构都是一样的,于是从JDK5后有了泛型集合。泛型有什...
  • java泛型extends和super详解首先,Java有泛型这一个概念,是为了初衷是为了保证在运行时出现的错误能提早放到编译时检查。有了这个前提,再来看看题主的问题。// 编译会报错// List extends Fruit> appList2 = ...
  • java泛型 简书_java泛型

    2021-03-17 23:56:22
    人物素描名字:泛型特点:区别于形式参数把值作为参数,它可以将类型(类或接口)作为参数,以便通过对相同的代码传入不同的泛型,实现不同的效果外貌:通常由尖括号<>包括,如:List list=new ArrayList();使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,137
精华内容 2,454
关键字:

java泛型arraylist

java 订阅