java数组与集合
来源:互联网 发布:淘宝好的布料店 编辑:程序博客网 时间:2024/05/21 21:35
1、拷贝之java.lang.System.arraycopy和java.util.Arrays.copyOf方法
Java数组的复制操作可以分为深复制和浅复制。一般对于引用类型的数组来说,需要在某些时候进行深复制。
首先来看一下两个方法实现的源代码,如下:
- public static <T> T[] copyOf(T[] original, int newLength) {
- return (T[]) copyOf(original, newLength, original.getClass());
- }
- public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
- T[] copy = ((Object)newType == (Object)Object[].class)
- ? (T[]) new Object[newLength] // 类型相同,则重新生成一个大小为newLength的数组实例
- : (T[]) Array.newInstance(newType.getComponentType(), newLength); // 类型不同,重新生成一个大小为newLength的新类型数组实例
- System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); //将原数组内容拷贝到新数组中,新数组取最小的数组长度
- return copy; // 返回新数组的引用
- }
而系统方法是一个本地方法,如下:
- public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
举个例子,如下:
- public class test11 {
- public static void main(String[] args) {
- String[] strArray = new String[] { "ab", "xy", "mn" };
- String[] copyArray = new String[2]; // 新数组大小比原数组小
- for (int i = 0; i < strArray.length; i++) {
- System.arraycopy(strArray, 0, copyArray, 0, strArray.length); // 调用系统方法进行深拷贝
- }
- printArray(copyArray);
- System.out.println(strArray == copyArray ? "浅拷贝" : "深拷贝");
- }
- public static void printArray(String[] array) {
- for (int i = 0; i < array.length; i++) {
- System.out.print(array[i] + " ");
- }
- }
- }
ab xy mn null 深拷贝
使用copyOf()方法,如下:
- public class test11 {
- public static void main(String[] args) {
- String[] strArray = new String[] { "ab", "xy", "mn" };
- String[] copyArray=new String[4];
- for(int i=0;i<strArray.length;i++){
- copyArray=Arrays.copyOf(strArray, strArray.length);
- }
- printArray(copyArray);
- System.out.println(strArray==copyArray?"浅拷贝":"深拷贝");
- }
- public static void printArray(String[] array) {
- for (int i = 0; i < array.length; i++) {
- System.out.print(array[i] + " ");
- }
- }
- }
如上输出:
ab xy mn 深拷贝
copyOf不会因为copyArray方法的大小而报错。因为copyOf 的返回值是在内部new 好的copy 数组,而该copy 数组new 的大小就等于newLength 。但是copyOf 方法最后也是调用System.arraycopy 的方法,不过由于之前已经对数组进行了处理,所以不会报出异常。
2、数组与List相互转换
可以使用Arrays类中提供的asList()方法,如下:
- List<String> list01 = Arrays.asList("Larry", "Moe", "Curly");
- String[] array ={"a","b","c"};
- List<String> list2 = Arrays.asList(array);
- String[] strs = (String[]) list01.toArray();
0 0
- Java集合与数组
- java数组与集合
- Java:集合与数组转换
- java之数组与集合
- Java:集合与数组转换
- java中的数组与集合的排序
- java中的数组与集合的排序
- Java中数组与集合的转换
- java 集合与数组的区别
- java中“集合”与“数组”转换
- java数组与集合的转换
- java笔记1:数组与集合
- java 集合与数组的互转
- java中数组与集合相互转换
- Java集合与数组的转换
- java基础之数组与集合
- 数组与集合 -- 数组
- 数组与集合
- Fragment的用法
- 把zxing导入到eclipse中
- 安卓常用实用功能代码片大全(长期更新)
- 5.3 Fish eat fish
- 用python爬虫抓站的一些技巧总结 zz
- java数组与集合
- 环境搭建(一)hadoop2.2.0 (ubuntu10.0.4)
- 手机app服务器端开发初期---工具选择
- Java深度历险(四)——Java垃圾回收机制与引用类型
- 推送注册
- jquery validate 单个校验+全部校验
- Team Foundation Server 的系统要求
- Java深度历险(五)——Java泛型
- Android项目中无法生成R文件的问题解决办法