Java 实例 - 基本类型int、long、double数组转化成List简便的方法

1. 方式一(最简单方式)

循环遍历

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<>() ;
for(int i = 0; i < ints.length; ++i) {
    intList.add(ints[i]) ;
}
intList.forEach(System.out::println);

//输出结果
1
2
3

调用 Arrays 类的静态方法 asList()

List<String> strings = Arrays.asList(new String[]{"123", "456"});
System.out.println("strings="+strings);
List<int[]> ints = Arrays.asList(new int[]{123, 456});
System.out.println("ints="+ints);

//输出结果
strings=[123, 456]
ints=[[I@4e515669]

这种写法有一点需要注意:基本类型>>集合,会把基本类型的数组当成一个整体结构(一个元素)存到集合中;

包装类>>集合,就不会出现基本类型转换成集合的这种情况

2. 方法二(Java 8 新特性)

使用 Java 8 的新特性,使用 Stream 流 进行转换;

想了解 Stream API 的使用可以看这篇文章 Stream APILambda 表达式详解

示例

//1.创建int数组
int[] ints = {1, 2, 3};
//2.调用 Arrays 类的静态方法 Stream() 把 ints 数组对象转换成流,这里要注意需要使用 boxed() 方法把IntStream 流转化成 Stream 流,因为转化成 Stream 流之后才能调用 collect() 收集方法获得List
List<Integer> intList = Arrays.stream(ints).boxed().collect(Collectors.toList());
//3.最后打印输出,这里使用到了 Lambda 表达式和方法引用
intList.forEach(System.out::println);

//输出结果
1
2
3

示例中调用 boxed() 方法的原因:

在这里插入图片描述

调用 Arrays 类的静态方法 stream ,如果传入一个int数组的话,调用的是一个重构方法,返回的是一个 IntStream 流对象,而如果想调用 collect() 收集方法获得List,就必须把 IntStream 流对象转换成 Stream<Integer> 对象,所以 boxed() 方法就起到了这个转换作用。
在这里插入图片描述

同样 long、double数组也是这样操作:

示例

long[] longs = {1L, 2L, 3L};
double[] doubles = {1.23, 2.23, 3.23};
List<Long> longList = Arrays.stream(longs).boxed().collect(Collectors.toList()) ;
List<Double> doubleList = Arrays.stream(doubles).boxed().collect(Collectors.toList());
longList.forEach(System.out::println);
doubleList.forEach(System.out::println);

int、long、double 都属于基本类型,String 数组转成 List,就不需要使用 boxed() 方法

String 不属于基本类型,所以调用 Arrays 类的静态方法 stream 返回的就是 Stream 对象

示例

String[] strings = {"666" , "888" , "999"} ;
List<String> stringList = Arrays.stream(strings).collect(Collectors.toList());
stringList.forEach(System.out::println);

//输出结果
666
888
999

在这里插入图片描述

3. 方式三(引入Jar包)

/**
 * int[]转Integer[]再转List
 * 方法三:需要导入apache commons-lang3  jar
 * <dependency>
 *   <groupId>org.apache.commons</groupId>
 *   <artifactId>commons-lang3</artifactId>
 *   <version>3.10</version>
 * </dependency>
 */
int[] ints = {1, 2, 3};
//int[]转Integer[]
Integer[] integers = ArrayUtils.toObject(ints);
//Integer[]再转List
List<Integer> integerList = Arrays.asList(integers);
//输出integerList
integerList.forEach(System.out::println);
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java测试题2》<br><br>一、 选择<br>1.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的 ? B<br>A ArrayList myList=new Object();<br>B List myList=new ArrayList();<br>C ArrayList myList=new List();<br>D List myList=new List();<br>2.paint()方法使用哪种类型的参数? A<br>A Graphics<br>B Graphics2D<br>C String<br>D Color<br>3.指出正确的表达式 D<br>A byte=128;<br>B Boolean=null;<br>C long l=0xfffL;<br>D double=0.9239d;<br>4.指出下列程序运行的结果 D<br>public class Example{<br>String str=new String("good");<br>char[]ch={'a','b','c'};<br>  public static void main(String args[]){<br>    Example ex=new Example();<br>    ex.change(ex.str,ex.ch);<br>    System.out.print(ex.str+" and ");<br>    Sytem.out.print(ex.ch);<br>  }<br>  public void change(String str,char ch[]){<br>    str="test ok";<br>    ch[0]='g';<br>  }<br>}<br>A good and abc<br>B good and gbc<br>C test ok and abc<br>D test ok and gbc<br>5.运行下列程序, 会产生什么结果 B<br>public class X extends Thread implements Runable{<br> public void run(){<br>  System.out.println("this is run()");<br> }<br> public static void main(String args[])<br> {<br>  Thread t=new Thread(new X());<br>  t.start();<br> }<br>}<br>A 第一行会产生编译错误B 第六行会产生编译错误C 第六行会产生运行错误D 程序会运行和启动6.要从文件" file.dat"文件中读出第10个字节到变量C中,下列哪个方法适合? A<br>A FileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();B FileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();C FileInputStream in=new FileInputStream("file.dat"); int c=in.read();D RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();7.容器被重新设置大小后,哪种布局管理器的容器中的组件大小不随容器大小的变化而改变? B<br>A CardLayoutB FlowLayout<br>C BorderLayout<br>D GridLayout<br>8.给出下面代码: C<br>public class Person{<br>  static int arr[] = new int[10];<br><br>  public static void main(String a[])<br>  {<br>   System.out.println(arr[1]);<br>  }<br>}<br>那个语句是正确的?<br>A 编译时将产生错误;<br>B 编译时正确,运行时将产生错误;<br>C 输出零;<br>D 输出空。<br>9.哪个关键字可以对对象加互斥锁? B<br>A transient<br>B synchronized<br>C serialize<br>D static<br>10.下列哪些语句关于内存回收的说明是正确的? B<br>A 程序员必须创建一个线程来释放内存;<br>B 内存回收程序负责释放无用内存<br>C 内存回收程序允许程序员直接释放内存<br>D 内存回收程序可以在指定的时间释放内存对象<br>11.下列代码哪几行会出错: c<br>1) public void modify() {<br>2) int I, j, k;<br>3) I = 100;<br>4) while ( I > 0 ) {<br>5) j = I * 2;<br>6) System.out.println (" The value of j is " + j );<br>7) k = k + 1;<br>8) I--;<br>9) }<br>10) }<br>A line 4<br>B line 6<br>C line 7<br>D line 8<br>二、多项选择<br>1.执行下列代码后,哪个结论是正确的 String[] s=new String[10]; BD<br>A s[10] 为 "";<br>B s[9] 为 null;<br>C s[0] 为 未定义<br>D s.length 为10<br>2.下面的表达式哪个是正确的?AE<br>A String s="你好";int i=3; s+=i;<br>B String s="你好";int i=3; if(i==s){ s+=i};<br>C String s="你好";int i=3; s=i+s;<br>D String s="你好";int i=3; s=i+;<br>E. String s=null; int i=(s!=null)&&(s.length>0)?s.length():0;<br>3.选出合理的标识符AC<br>A _sys1_lll<br>B 2mail<br>C $change<br>D class<br>4.哪个布局管理器使用的是组件的最佳尺寸( preferred size) AE<br>A FlowLayout<br>B BorderLayout<br>C GridLayout<br>D CardLayout<br>E.GridBagLayout<br>5.下列哪个方法可用于创建一个可运行的类?AE<br>A public class X implements Runable{ public void run(){ ......} }<br>B public class X implements Thread{ public void run(){ ......} }<br>C public class X implements Thread{ public int run(){ ......} }<br>D public class X implements Runable{ protected void run(){ ......} }<br>E.public class X implements Thread{ public void run(){ ......} }<br>6.下面哪个方法可以在任何时候被任何线程调用?DEF<br>A notify()<br>B wait()<br>C notifyAll()<br>D sleep()<br>E.yield()<br>F.synchronized(this)<br>7.构造BufferedInputStream的合适参数是哪个? AC<br>A BufferedInputStream<br>B BufferedOutputStream<br>C FileInputStream<br>D FileOuterStream<br>E. File<br>8.下列说法正确的是 BC<br>A java.lang.Clonable是类<br>B java.lang.Runnable是接口<br>C Double对象在java.lang包中<br>D Double a=1.0是正确的java语句<br>9.指出正确的表达式AB<br><br>B Double a=new Double(1.0);<br>C byte a = 340;<br>D Byte a = 120;<br>10.定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD<br>A double a=1.0;<br>A private class MyClass extends Object<br>B class MyClass extends Object<br>C public class MyClass<br>D public class MyClass extends Object<br>11.指出下列哪个方法方法public void add(int a){}为合理的重载方法。 CD<br><br><br>A public int add(int a)<br>B public void add(long a)<br>C public void add(int a,int b)<br>D public void add(float a)<br>12.如果下列的方法能够正常运行,在控制台上将显示什么? ACD<br><br>public void example(){<br>  try{<br>    unsafe();<br>    System.out.println("Test1");<br>    }<br>    catch(SafeException e)<br>    {System.out.println("Test 2");}<br>  finally{System.out.println("Test 3");}<br>  System.out.println("Test 4");<br>}<br>A Test 1<br>B Test 2<br>C Test 3<br>D Test 4<br>13.下列哪些情况可以终止当前线程的运行? ABD<br>A 抛出一个例外时。<br>B 当该线程调用sleep()方法时。<br>C 当创建一个新线程时。<br>D 当一个优先级高的线程进入就绪状态时。<br>三、 填空题<br>1.执行下列代码后的结果是什么? int x,a=2,b=3,c=4; x=++a+b+++c++;<br>2. 包包含了Collection的接口和类的API<br>.main方法的声明格式包括<br>4.下列程序中构造了一个SET并且调用其方法add(),输出结果是<br>public class A{<br>public int hashCode(){return 1;}<br>public Boolean equals(Object b){return true}<br>public static void main(String args[]){ Set set=new HashSet();<br>set.add(new A());<br>set.add(new A());<br>set.add(new A());<br>System.out.println(set.size());<br>}<br>}<br>5.下列程序的运行结果是<br>class A{<br>class Dog{<br>  private String name;<br>  private int age;<br>  public int step;<br>  Dog(String s,int a){<br>   name=s;<br>   age=a;<br>   step=0;<br>   }<br>  public void run(Dog fast){<br>  fast.step++;<br>  }<br>}<br><br>  public static void main (String args[]){<br>  A a=new A();<br>  Dog d=a.new Dog("Tom",3);<br>  d.step=25;<br>  d.run(d);<br>  System.out.println(d.step);<br>  }<br>}<br><br>答案::填空第1题<br>x=10,a=3,b=4,c=5<br>填空第2题<br>java.util<br>填空第3题<br>(public )(static )(void)(main)(String args[])<br>填空第4题<br>1<br>填空第5题<br>
1. 反射: Class 类的实例表示正在运行的 Java 应用程序中的类和接口; 枚举是一种类,注解(指的是注解Annotation)是一种接口; 每个数组都是 Class字节码类中的一个具体 对象 基本Java 类型(boolean、byte、char、short、intlong、float 和 double)和关键字 void 也表示为 Class 对象; 注意 : 1、 Class类 和它的实例的产生: Class的对象是已经存在的类型, 所以不能够直接new一个Class对象出来,是通过Class类中的一个方法获取到的。 例如:通过全限定路径类名 2、同一种类型不管通过什么方式得到Class的实例都是相等的;一个类型的字节码对象只有一份,在元空间。 3、Class的实例就看成是Java中我们学过的所有的数据类型在JVM中存在的一种状态(字节码对象) String.class int.class List.class int[].class 1.概念:通过一个全限定类名,获取字节码文件 2.作用: 1. 提高开发灵活度,提高程序的扩展性 2. 框架(提高开发效率的别人封装好的代码)底层都是使用反射技术。例如:Tomcat、Spring... 3. 缺点:破坏封装性,性能低下(以后,能不用反射技术就不用) 3. 使用:(重点) 1. 获取字节码文件 1. 1.1 Class clazz = Class.forName(全限定路径名) (最多使用)默认就是调用下面的方法 1.2 static 类<?> forName(String name, boolean initialize, ClassLoader loader) name:全限定路径名 initialize:表示是否初始化,默认是false loader:可以指定一个类加载器加载字节码文件 2. 全限定类名.class 3. 对象名.getClass() Class类中方法newInstance():创建当前字节码对象(只能调用无参且是public修饰的构造方法) 2. 根据字节码文件获取构造方法、普通方法、字段等 构造方法 Constructor[] constructors = clazz.getConstructors() 获取public修饰的构造方法数组 Constructor[] constructors = clazz.getDeclaredConstructors() 获取任意权限的所有造方法数组 Constructor constructor = clazz.getConstructor(Class 参数字节码)根据参数类型获取public修饰的指定的的构造方法 Constructor constructor = clazz.getDeclearConstructor(Class 参数字节码) 获取任意访问权限指定的构造方法 //通过构造方法对象去用构造方法创建对象 => 相当于new 一个对象 Object instance = constructor.newInstance(Object 实参);//可以创建任意访问权限的有参或者无参构造 普通方法 Method[] methods = clazz.getMethods() 获取public修饰的构造方法数组,有父类中的方法 Method[] methods = clazz.getDeclaredMethods() 获取任意访问权限所有造方法数组,并且都是自己的方法 Method method = clazz.getMethod(String methodName,Class... 参数字节码)根据方法名和参数类型获取指定的的方法 methodName:方法名 Class:形参类型。如果方法没有形参,则Class可变参数不用写 Method method = clazz.getDeclaredMethod(String methodName,Class... 参数字节码)根据方法名和参数类型获取指定的的方法 methodName:方法名 Class:形参类型。如果方法没有形参,则Class可变参数不用写 //通过普通方法对象调用执行方法 method.invoke(Object obj,Object... args); obj:对象。如果是对象的方法,就传入一个当前字节码创建的对象,如果是static方法,则写null args:就是具体实参 字段 Field[] fields = clazz.getFields() 获取public修饰的字段 Field[] fields = clazz.getDeclaredFields() 获取任意权限所有字段 Field field = clazz.getDeclaredField(String fieldName) 根据字段名获取任意访问权限的指定字段 Field field = clazz.Field(String fieldName)根据字段名获取public的指定字段 //通过当前的字段对象,给某一个字段赋值取值 field.get(Object obj);//如果是属于非static,就传入一个对象,如果是静态的,就传入null obj:对象 field.set(Object obj, Object value);//如果是属于非static,就传入一个对象,如果是静态的,就传入null obj:对象 value:值 String getName() 获取全限定类名(全限定,包含包名) Class类中方法 String getSimpleName() 获取类名简称 Class类中方法 Package getPackage() 获取包名 Class类中方法 T newInstance() 根据当前字节码创建对应的对象 Class类中方法 注意: 1. Class类中方法newInstance():创建当前字节码对象(只能调用无参且是public修饰的构造方法) 2. Constructor类中方法newInstance(Object 实参);//可以创建任意访问权限的有参或者无参构造 3. 私有化方法、字段、构造方法都必须破坏封装才能使用: public void setAccessible(boolean flag) true表示破坏封装,false是不破坏 是哪个private修饰的方法、字段、构造方法需要执行,就需要用这个对象破坏哪一个的封装 例如: //获取cn.itsource.reflect.User字节码文件 Class<?> clazz = Class.forName("cn.itsource.reflect.User"); //获取User的有String参构造 Constructor<?> constructor = clazz.getConstructor(String.class); //调用有参String构造,创建一个User对象 Object newInstance = constructor.newInstance("某文"); //获取private修饰的方法:testPrivate Method method2 = clazz.getDeclaredMethod("testPrivate"); method2.setAccessible(true);//破坏普通方法Method封装 //破坏封装后就可以执行了 Object invoke2 = method2.invoke(newInstance);//没有形参就不用写 System.out.println(invoke2); 4. 调用static方法、字段: 例如: Field field = clazz.getDeclaredField("country");//获取任意访问权限静态变量country field.set(null, "中国");//因为字段country是static修饰,所以不用对象调用,就传入null。字段country赋值:中文 Object object = field.get(null);//字段country取值 System.out.println(object); 2. 注解: 1.概念: 就是一个标签,有标签后,就具有某一些标签的特性。 本质就是跟类、接口、枚举平级的新结构 2.作用: 1. 帮助程序员校验代码 2. 可以提高开发效率和程序的扩展性 @Test @Before @After 3. 可以生成文档说明 api 操作步骤: 1.选中项目/代码,右键选中Export 2.输入Javadoc 3.第一个next(可以设置生成文档注释的目录),第二个next,设置字符集 如果是UTF-8编码,且有中文,请输入-encoding UTF-8 -charset UTF-8 4. 勾选一个生成完毕后,直接通过浏览器打开的选项 5. finish 3.使用:(重点) 1. 使用jdk或者别人定义好的标签 @ + 注解的名称 -- 比如@Override ->注解 2. 使用自定义的标签 1.JDK的元注解:就是专门用来声明其他注解的注解 作用:通过元注解了解其他注解的使用特点,还可以自定义注解 2.元注解: 1. @Target @Target 作用 用来限制被修饰注解的使用范围,即注解可以在类的哪些成员上使用 @Target 取值使用ElementType.() 1. CONSTRUCTOR:可以在构造器上使用注解 2. FIELD:可以在字段上使用注解 3. LOCAL_VARIABLE:可以在局部变量上使用注解 4. METHOD:可以在普通方法上使用注解 5. PACKAGE:可以在包上使用注解 6. PARAMETER:可以在参数列表上使用注解 7. TYPE:可以在类、接口(包括注解类型) 或enum上使用注解 例如:@Target(ElementType.METHOD)//意味着@Override只能在普通方法上使用 public @interface Override { } 2. @Retention

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值