java map转list(java下一页)

admin 419 0

大家好,今天给各位分享java map转list的一些知识,其中也会对java下一页进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

一、java中,下面的List怎么放入map里面,求高手!

1、你首先要了解什么是Map,可以理解为Map是一堆key和value的映射集合(或者说一堆键值对的集合)。

2、 for(inti=0;i<list.size();i++){

3、}

然后你要用Map里的东西,可以使用map.get(1)这种形式获取,他和list.get(1);相等都为“c”。

4、然后你要用Map里的东西,可以使用map.get(1)这种形式获取,他和list.get(1);相等都为“c”。

5、另外建议初始化Map和List的时候,定义好所存的数据类型。

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

7、 Map<Integer, String> map= new HashMap<Integer, String>();

二、java arraylist怎么转化成数组

1、ArrayList list=new ArrayList();

2、String strings[]=(String [])list.toArray();

3、这样写代码个人觉得应该没什么问题,编译也没有问题。可是具体运行的时候报异常,如下:Exception in thread"main" java.lang.ClassCastException: [Ljava.lang.Object;

4、ArrayList list=new ArrayList();

5、String strings[]=new String[list.size()];

6、for(int i=0,j=list.size();i<j;i++){

7、对于这个现象我们可以这么解释:Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是[Ljava.lang.Object。把[Ljava.lang.Object转换成[Ljava.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

8、根据上面的解释,我们可以把这个问题归纳到下面这个模型:

9、这样子和刚才上面编译错误是一样的。如果我们修改一下这个代码,如下:

10、这样子就可以编译通过了。所以这个问题我们可以归结为一个Java转型规则的问题。下面谈一下Java数组对范型的支持问题。

11、JDK5中已经有了对范型的支持,这样可以保证在集合和Map中的数据类型的安全,可是,List的toArray方法返回的竟然是Object []让人很迷惑。个人感觉应该可以根据范型,直接返回相应的T []。仔细看了一下JDK的发现List转化为array有两个方法:

12、这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为Object类型。

13、这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为T类型。

14、List如此设计是因为Java编译器不允许我们new范型数组。也就是说你不能这么定义一个数组:

15、但是你却可以用T[]来表示数组,而且可以把数组强制转化为T[]。比如List中的public T[] toArray(T[] a)是这么实现的:

16、a=(T[])java.lang.reflect.Array.

17、newInstance(a.getClass().getComponentType(), size);

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

19、从上面代码中可以看到,因为你不知道这个数组的类型,你必须通过反射机制创建这个数组(a.getClass().getComponentType()方法是取得一个数组元素的类型)。

20、最终,List转换为Array可以这样处理:

21、ArrayList list=new ArrayList();

22、String[] strings= new String[list.size()];

23、反过来,如果要将数组转成List怎么办呢?如下:

24、List list= java.util.Arrays.asList(s);

三、java中如何map转换为数组

1、map.put("123",newfloat[]{11,11,11});

2、按照已有的代码,存进去的时候,new一个float数组,直接传值就可以。

3、Map sMap= new HashMap<String[], String>();

4、sMap.put(strs,"map的键值可以为数组");

5、System.out.println(sMap.get(strs));//---->map的键值可以为数组。

6、一个数组中的所有元素具有相同的数据类型(在C、C++、Java、pascal中都这样。但也并非所有涉及数组的地方都这样,比如在Visual Foxpro中的数组就并没这样的要求)。当然,当数据类型为 Variant时,各个元素能够包含不同种类的数据(对象、字符串、数值等等)。可以声明任何基本数据类型的数组,包括用户自定义类型和对象变量。

四、java里面<>的语法

这是JDK5的新特性,叫泛型,看看JDK5的文档吧

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

可以在集合框架(Collection framework)中看到泛型的动机。例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。

因为Map.get()被定义为返回Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:

String s=(String) m.get("key");

要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个String。但是有可能某人已经在该映射中保存了不是String的东西,这样的话,上面的代码将会抛出ClassCastException。

理想情况下,您可能会得出这样一个观点,即m是一个Map,它将String键映射到String值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

Java语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:

·类型安全。泛型的主要目标是提高 Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

Java程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或者“String到String的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作ClassCastException展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。

·消除强制类型转换。泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。

Integer i=(Integer) li.get(0);

List<Integer> li= new ArrayList<Integer>();

在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。

·潜在的性能收益。泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的JVM的优化带来可能。

由于泛型的实现方式,支持泛型(几乎)不需要JVM或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用Map类的例子,其中涉及一定程度的优化,即Map.get()返回的结果将确实是一个String:

String s=(String) m.get("key");

如果有人已经在映射中放置了不是String的其他东西,上面的代码将会抛出ClassCastException。泛型允许您表达这样的类型约束,即m是一个将String键映射到String值的Map。这可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,这个检查层可以防止有人将错误类型的键或值保存在集合中。

下面的代码示例展示了 JDK 5.0中集合框架中的Map接口的定义的一部分:

public interface Map<K, V>{

public void put(K key, V value);

*类型参数 K和 V在类级别的规格说明,表示在声明一个 Map类型的变量时指定的类型的占位符。

*在 get()、put()和其他方法的方法签名中使用的 K和 V。

为了赢得使用泛型的好处,必须在定义或实例化Map类型的变量时为K和V提供具体的值。以一种相对直观的方式做这件事:

Map<String, String> m= new HashMap<String, String>();

当使用Map的泛型化版本时,您不再需要将Map.get()的结果强制类型转换为String,因为编译器知道get()将返回一个String。

在使用泛型的版本中并没有减少键盘录入;实际上,比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型安全。因为编译器知道关于您将放进Map中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度。

在 Java语言中引入泛型的一个重要目标就是维护向后兼容。尽管 JDK 5.0的标准类库中的许多类,比如集合框架,都已经泛型化了,但是使用集合类(比如HashMap和ArrayList)的现有代码将继续不加修改地在 JDK 5.0中工作。当然,没有利用泛型的现有代码将不会赢得泛型的类型安全好处。

在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。形式类型参数与实际类型参数之间的关系类似于形式方法参数与实际方法参数之间的关系,只是类型参数表示类型,而不是表示值。

泛型类中的类型参数几乎可以用于任何可以使用类名的地方。例如,下面是java.util.Map接口的定义的摘录:

public interface Map<K, V>{

public void put(K key, V value);

Map接口是由两个类型参数化的,这两个类型是键类型K和值类型V。(不使用泛型)将会接受或返回Object的方法现在在它们的方法签名中使用K或V,指示附加的类型约束位于Map的规格说明之下。

当声明或者实例化一个泛型的对象时,必须指定类型参数的值:

Map<String, String> map= new HashMap<String, String>();

注意,在本例中,必须指定两次类型参数。一次是在声明变量map的类型时,另一次是在选择HashMap类的参数化以便可以实例化正确类型的一个实例时。

编译器在遇到一个Map<String, String>类型的变量时,知道K和V现在被绑定为String,因此它知道在这样的变量上调用Map.get()将会得到String类型。

除了异常类型、枚举或匿名内部类以外,任何类都可以具有类型参数。

推荐的命名约定是使用大写的单个字母名称作为类型参数。这与C++约定有所不同(参阅附录 A:与 C++模板的比较),并反映了大多数泛型类将具有少量类型参数的假定。对于常见的泛型模式,推荐的名称是:

* V——值,比如 List和 Set的内容,或者 Map中的值。

关于泛型的混淆,一个常见的来源就是假设它们像数组一样是协变的。其实它们不是协变的。List<Object>不是List<String>的父类型。

如果 A扩展 B,那么 A的数组也是 B的数组,并且完全可以在需要B[]的地方使用A[]:

Integer[] intArray= new Integer[10];

Number[] numberArray= intArray;

上面的代码是有效的,因为一个Integer是一个Number,因而一个Integer数组是一个Number数组。但是对于泛型来说则不然。下面的代码是无效的:

List<Integer> intList= new ArrayList<Integer>();

List<Number> numberList= intList;// invalid

最初,大多数 Java程序员觉得这缺少协变很烦人,或者甚至是“坏的(broken)”,但是之所以这样有一个很好的原因。如果可以将List<Integer>赋给List<Number>,下面的代码就会违背泛型应该提供的类型安全:

List<Integer> intList= new ArrayList<Integer>();

List<Number> numberList= intList;// invalid

numberList.add(new Float(3.1415));

因为intList和numberList都是有别名的,如果允许的话,上面的代码就会让您将不是Integers的东西放进intList中。但是,正如下一屏将会看到的,您有一个更加灵活的方式来定义泛型。

package com.ibm.course.generics;

public static void main(String[] args){

Integer[] integer= new Integer[5];

System.out.println(number[0]);// null

System.out.println(number[0]);

System.out.println(integer[0]);

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

// Type mismatch: cannot convert from List<Integer> to List<Number>

// List<Number> listObj= list;

List<Number> listObj= list;导致编译错误:Type mismatch: cannot convert from List<Integer> to List<Number>

而System.out.println(number[0]);和System.out.println(integer[0]);导致运行时异常:

Exception in thread"main" java.lang.ArrayStoreException: java.lang.Float

at com.ibm.course.generics.GenericsExample.main(GenericsExample.java:15)

上面的代码在 JDK 5.0上编译通过,但是如果试图用List<Integer>调用它,则会得到警告。出现警告是因为,您将泛型(List<Integer>)传递给一个只承诺将它当作List(所谓的原始类型)的方法,这将破坏使用泛型的类型安全。

如果试图编写像下面这样的方法,那么将会怎么样?

void printList(List<Object> l){

它仍然不会通过编译,因为一个List<Integer>不是一个List<Object>(正如前一屏泛型不是协变的中所学的)。这才真正烦人——现在您的泛型版本还没有普通的非泛型版本有用!

void printList(List<?> l){

上面代码中的问号是一个类型通配符。它读作“问号”。List<?>是任何泛型List的父类型,所以您完全可以将List<Object>、List<Integer>或List<List<List<Flutzpah>>>传递给printList()。

package com.ibm.course.generics;

public static void main(String[] args){

List<Integer> integer= new ArrayList<Integer>();

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

str.add(new String("Hello"));

str.add(new String("World"));

public static void printList(List<?> l){

上面的例子程序没有警告也没有编译错误。

前一屏类型通配符中引入了类型通配符,这让您可以声明List<?>类型的变量。您可以对这样的List做什么呢?非常方便,可以从中检索元素,但是不能添加元素(可以添加null)。原因不是编译器知道哪些方法修改列表哪些方法不修改列表,而是(大多数)变化的方法比不变化的方法需要更多的类型信息。下面的代码则工作得很好:

List<Integer> li= new ArrayList<Integer>();

System.out.println(lu.get(0));

为什么该代码能工作呢?对于lu,编译器一点都不知道List的类型参数的值。但是编译器比较聪明,它可以做一些类型推理。在本例中,它推断未知的类型参数必须扩展Object。(这个特定的推理没有太大的跳跃,但是编译器可以作出一些非常令人佩服的类型推理,后面就会看到(在底层细节一节中)。所以它让您调用List.get()并推断返回类型为Object。

另一方面,下面的代码不能工作:

List<Integer> li= new ArrayList<Integer>();

lu.add(new Integer(43));// error

在本例中,对于lu,编译器不能对List的类型参数作出足够严密的推理,以确定将Integer传递给List.add()是类型安全的。所以编译器将不允许您这么做。

以免您仍然认为编译器知道哪些方法更改列表的内容哪些不更改列表内容,请注意下面的代码将能工作,因为它不依赖于编译器必须知道关于lu的类型参数的任何信息:

List<Integer> li= new ArrayList<Integer>();

(在类型参数一节中)您已经看到,通过在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。

泛型类在多个方法签名间实施类型约束。在List<V>中,类型参数V出现在get()、add()、contains()等方法的签名中。当创建一个Map<K, V>类型的变量时,您就在方法之间宣称一个类型约束。您传递给add()的值将与get()返回的值的类型相同。

类似地,之所以声明泛型方法,一般是因为您想要在该方法的多个参数之间宣称一个类型约束。例如,下面代码中的ifThenElse()方法,根据它的第一个参数的布尔值,它将返回第二个或第三个参数:

public<T> T ifThenElse(boolean b, T first, T second){

注意,您可以调用ifThenElse(),而不用显式地告诉编译器,您想要T的什么值。编译器不必显式地被告知 T将具有什么值;它只知道这些值都必须相同。编译器允许您调用下面的代码,因为编译器可以使用类型推理来推断出,替代T的String满足所有的类型约束:

String s= ifThenElse(b,"a","b");

Integer i= ifThenElse(b, new Integer(1), new Integer(2));

但是,编译器不允许下面的代码,因为没有类型会满足所需的类型约束:

String s= ifThenElse(b,"pi", new Float(3.14));

为什么您选择使用泛型方法,而不是将类型T添加到类定义呢?(至少)有两种情况应该这样做:

*当泛型方法是静态的时,这种情况下不能使用类类型参数。

*当 T上的类型约束对于方法真正是局部的时,这意味着没有在相同类的另一个方法签名中使用相同类型 T的约束。通过使得泛型方法的类型参数对于方法是局部的,可以简化封闭类型的签名。

在前一屏泛型方法的例子中,类型参数V是无约束的或无限制的类型。有时在还没有完全指定类型参数时,需要对类型参数指定附加的约束。

考虑例子Matrix类,它使用类型参数V,该参数由Number类来限制:

public class Matrix<V extends Number>{...}

编译器允许您创建Matrix<Integer>或Matrix<Float>类型的变量,但是如果您试图定义Matrix<String>类型的变量,则会出现错误。类型参数V被判断为由Number限制。在没有类型限制时,假设类型参数由Object限制。这就是为什么前一屏泛型方法中的例子,允许List.get()在List<?>上调用时返回Object,即使编译器不知道类型参数V的类型。

五、java中map可以放在list里吗

一个List对象也无非是一个对象,在Map里存取放置都是一种方式,如果你确定取出来的是某类的对象,直接转型就可以了:

在JDK1.5以上提供了泛型,能够更好地控制类型,减少强行转型的次数。比如我们如果知道这些List里的元素永远是String的话,你就可以写

List<String> a= new ArrayList<String>;

HashMap<String,List<String>> b=new HashMap<String,List<String>>();

List<String> c= b.get("a");

最后一步不需要强行转型,而且如果在b.put("a",a);这一步如果你想往b里面放一个不是List<String>的东西,或者使用的key不是一个String,编译器就会抗议。

泛型学起来有一定难度,尤其是一些高级用法,写起来有时会觉得繁琐,但是我认为物有所值,能够帮助我们在编译期发现不少潜在问题,写出代码更强健。

六、java中Map可以有相同的value吗

1、map是可以放相同的value的,不过key值必须唯一。

2、得到一个空的list,然后放入了map中。

3、又得到一个空list,然后放入了map中。

4、"a"或者"b"取值时候,都会得到一个size为0的list的。

5、但注意这个时候你取出的list是List这样的类型,并未泛型化,需要进行强转来得到List<b>或List<a>。

6、希望帮助了你吧。最好自己动手试试。

关于java map转list和java下一页的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。