• 吴裕雄--天生自然数据结构与算法:java代码实现常用数据结构——数组


    1,数组【Array】
    特点:长度固定、查找方便【直接使用index查找即可】、增加、删除麻烦。
    public class Demo1_Array {
        public static void main(String[] args) {
            String [] array=new String[5];//需要初始化长度
            array[0]="hello";
            array[1]="world";
            array[4]="Mufasa";
    //        array[5]="right or not";//ArrayIndexOutOfBoundsException
            for(String str:array){
                System.out.print(str+"、");//hello、world、null、null、Mufasa、
            }
        }
    }

    ②对实例化数组进行扩容【利用Java反射机制】
    public class Demo1_Array2 {
        public static void main(String[] args) {
            String [] array={"hello","world",null,null,"Mufasa"};//实例化&赋值
            array = (String[])resizeArray(array,10);
            for(String str:array){
                System.out.print(str+"、");//hello、world、null、null、Mufasa、
            }
            System.out.println("
    新数组长度:" + array.length);
        }
    
        private static Object resizeArray(Object oldArray, int newSize) {//数组扩容!!!真麻烦,还利用反射机制来实现
            int oldSize = java.lang.reflect.Array.getLength(oldArray);//获取旧数组长度,向上转型!!!
    //        int oldSize =oldArray.length;//无法在此使用,因为array内容的是不定类型
            Class elementType = oldArray.getClass().getComponentType();//获取对象类别
            Object newArray = java.lang.reflect.Array.newInstance(elementType,newSize);//利用Java的反射机制实例化新数组
            int preserveLength = Math.min(oldSize, newSize);//判断是否需要copy数据
            if (preserveLength > 0)
                System.arraycopy(oldArray, 0, newArray, 0, preserveLength);
            return newArray;//oldArray切断索引成为垃圾由Runtime.getRuntime().gc();回收处理
        }
    }

    ③数组删除与增添,本质上是创建新的数值并且copy数值
    public class Demo1_Array4 {
        public static void main(String[] args) {
            String [] array=new String[5];//需要初始化长度
            array[0]="hello";
            array[1]="world";
            array[4]="Mufasa";
            array=drop(array,3);
            for(String str:array){
                System.out.print(str+"、");//hello、world、null、null、Mufasa、
            }
    
        }
        public static String[] drop(Object[] oldArray,int index){//删除指定位置上的元素
            int size= java.lang.reflect.Array.getLength(oldArray);
            if(index<0 || index>size) {
                throw new RuntimeException("删除索引范围有误");
            }else {
                Class elementType = oldArray.getClass().getComponentType();//获取对象类别
                Object newArray = java.lang.reflect.Array.newInstance(elementType,size-1);
                String[] newStringArray=(String[])newArray;
                int counter=0;
                for(int i=0;i<oldArray.length;i++){
                    if(i!=index){
                        newStringArray[counter]= (String) oldArray[i];
                        counter++;
                    }else {
                        continue;
                    }
                }
                return newStringArray;
            }
        }
    }

    ④数组添加元素,本质也是创建新数组长度+1拷贝,index后移、赋值
    public class Demo1_Array5 {
        public static void main(String[] args) {
            String [] array=new String[5];//需要初始化长度
            array[0]="hello";
            array[1]="world";
            array[4]="Mufasa";
            array=add(array,3,"添加字符串");
            for(String str:array){
                System.out.print(str+"、");//hello、world、null、null、Mufasa、
            }
    
        }
        public static String[] add(Object[] oldArray,int index,String str){//删除指定位置上的元素
            int size= java.lang.reflect.Array.getLength(oldArray);
            if(index<0 || index>size) {
                throw new RuntimeException("添加索引范围有误");
            }else {
                Class elementType = oldArray.getClass().getComponentType();//获取对象类别
                Object newArray = java.lang.reflect.Array.newInstance(elementType,size+1);
                String[] newStringArray=(String[])newArray;
                int counter=0;
                for(int i=0;i<oldArray.length;i++){
                    if(i!=index){
                        newStringArray[counter]= (String) oldArray[i];
                        counter++;
                    }else {
                        newStringArray[counter]= (String) oldArray[i];
                        counter++;
                        newStringArray[counter]=str;
                        counter++;
                    }
                }
                return newStringArray;
            }
        }
    }

    可以直接使用Java自带的类集框架中的ArrayList、Vector
    import java.util.List;
    import java.util.ArrayList;
    
    public class Demo1_Array6 {
        public static void main(String[] args) {
            List<String> array=new ArrayList<>();//需要初始化长度
            array.add("hello");
            array.add("world");
    //        array.set(2,"Mufasa");
            array.add("扩容!");
            System.out.println(array.size());
            for(String str:array){
                System.out.print(str+"、");//hello、world、null、null、Mufasa、
            }
        }
    }

  • 相关阅读:
    SSH 端口转发(本地转发与远程转发)
    树莓派修改分辨率
    再看ExpressionTree,Emit,反射创建对象性能对比
    Beyond Compare常用设置
    C#操作SqlServer MySql Oracle通用帮助类(默认支持数据库读写分离、查询结果实体映射ORM)
    Emit动态代理.NetCore迁移之旅
    红蓝对抗之邮件钓鱼攻击——用到了很多典型无文件攻击手段
    辗转相除法的证明
    下一个排列——这玩意考察的是单调栈
    Elkeid 规则引擎——数据向后传递是亮点,支持单事件规则和统计类规则;如果向后传递支持的话,理论上AB先后事件的关联分析可以做;自定义plugin类似udf
  • 原文地址:https://www.cnblogs.com/tszr/p/12209734.html
Copyright © 2020-2023  润新知