数据结构-数组

**

数组

**

1初始化数组

1.Java 数组初始化的两种方法:
静态初始化: 程序员在初始化数组时为数组每个元素赋值;
动态初始化: 数组初始化时,程序员只指定数组的长度,由系统为每个元素赋初值。

public static void main(String[] args) {
     //静态初始化数组:方法一
      String cats[] = new String[] {“Tom”,“Sam”,“Mimi” };
   //静态初始化数组:方法二
       String dogs[] = {“Jimmy”,“Gougou”,“Doggy”};
    //动态初始化数据
      String books[] = new String[2];
       books[0] = “Thinking in Java”;
       books[1] = “Effective Java”;

System.out.println(cats.length);
       System.out.println(dogs.length);
       System.out.println(books.length);
    }

Java数组是一种引用数据类型。数组变量并不是数组本身,而是指向堆内存中存放的数组对象。因此,可以改变一个数组变量所引用的数组。看下面这段代码:

 public static void main(String[] args) {
          //静态初始化数组:方法一
         String cats[] = new String[] { "Tom","Sam","Mimi"};
          //静态初始化数组:方法二
         String dogs[] = {"Jimmy","Gougou","Doggy"};
          //动态初始化数据
         String books[] = new String[2];
        books[0] = "Thinking in Java";
        books[1] = "Effective Java";
          cats = dogs;
          books = dogs;
       }

2.数组是否必须初始化
  对于这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,他能够指向实际的数组对象。
所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。

2 foreach

首先说一下foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版。
  再说一下foreach的书写格式:
     for(元素类型 元素名称 : 遍历数组(集合)(或者能进行迭代的)){
      语句
     }
  foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。
  我们看看下面的例子:

 1   public static void main(String[] args) {
 2         List<String> arr = new ArrayList<String>();
 3         arr.add("你好");
 4         arr.add("我好");
 5         arr.add("大家好");
 6         
 7         //foreach循环
 8         for(String str : arr){                      //这里的str就是为了获取每次循环的arr中的值
 9             System.out.println(str);               //就相当于 String str=arr[i]
10         }
11     }

但是相比较之下我们用for循环输入就略显麻烦

public static void main(String[] args) {
        List<String> arr = new ArrayList<String>();
        arr.add("你好");
        arr.add("我好");
        arr.add("大家好");
        
        //for循环
        for(int i=0;i<arr.size();i++){
            System.out.println(arr.get(i));    //要获取list中元素需要用get方法    
        }
    }

除了这种普通的集合还可以对像map这种键值对使用
  例如:

public static void main(String[] args) {
        Map<String,String> mapstr = new HashMap<String,String>();
        mapstr.put("王", "男");
        mapstr.put("李", "男");
        mapstr.put("张", "女");
        //entrySet方法是为了获取键值对的集合
        for(Map.Entry<String, String> s : mapstr.entrySet()){   //这里的Map.Entry<String, String>其实就是一个类型 用来表示键值对的类型
            System.out.println("key="+s.getKey());            //这里其实还是相当于 s=maostr.entrySet,只不过s存储的是键值对。
            System.out.println("value="+s.getValue());        //所以可以用get方法获取出来存储的键值对。
        }
    }

另外foreach不支持在循环中添加删除操作,因为在使用foreach循环的时候数组(集合)就已经被锁定不能被修改,否则会报出java.util.ConcurrentModificationException异常
  例如:

public static void main(String[] args) {
        List<String> arr = new ArrayList<String>();
        arr.add("你好");
        arr.add("我好");
        arr.add("大家好");
        
        //foreach循环
        for(String str : arr){                    
            System.out.println(str);            
            arr.add("1");                    //对arr进行添加    
        }
    }

关于不能添加删除原理以及如何在foreach中添加删除我们下篇再说。
  所以总结如下:
  **foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。
  foreach不能对数组或集合进行修改(添加删除操作),如果想要修改就要用for循环。
所以相比较下来for循环更为灵活。

3 自定义类型的数组 默认为null



增删改查

public class MyArray {

    private long[] arr;
    //表示有效数据的长度
    private  int elements;

    public MyArray(){
        arr = new long[50];
    }

    public MyArray(int maxsize){
        arr = new long[maxsize];
    }

    /**
      *功能描述:添加数据
      *@param:
      *@return:
      *@author: liuhaidong
      *@date:
      */
    public void insert(long value){
        arr[elements] = value;
        elements ++;
    }
    /**
      *功能描述:显示数据
      *@param:
      *@return:
      *@author: liuhaidong
      *@date:
      */
//    public void display(){
//        System.out.println("[");
//        for(long arrArray : arr){
//            System.out.println(arrArray+",");
//        }
//        System.out.println("]");
//    }
    public void display(){
        System.out.println("[");
        for(int i=0;i<elements;i++)
        {
            System.out.println(arr[i] +"");
        }
        System.out.println("]");
        System.out.println("当前elements个数为:"+elements);
    }
    /*
     * @Author liuhaidong
     * @Description 查找数据
     * @Date 10:28 2019/9/15 0015
     * @Param
     * @return
     **/
    public int search(long value){
        int i;
        for(i=0;i<elements;i++)
        {
            if(value ==arr[i]){
                break;
            }
        }
        if(i ==elements){
            return -1;
        }else {
            return i;
        }
    }

    /*
     * @Author liuhaidong
     * @Description 查找数据,根据索引来查
     * @Date 10:30 2019/9/15 0015
     * @Param
     * @return
     **/
    public long get(int index){
        if(index >elements || index <0)
        {
            throw new ArrayIndexOutOfBoundsException();
        }else {
            return arr[index];
        }
    }

    /*
     * @Author liuhaidong
     * @Description 删除数据
     * @Date 10:32 2019/9/15 0015
     * @Param
     * @return
     **/
    public void delete(int index){
        if(index >= elements || index <0){
            throw new ArrayIndexOutOfBoundsException();
        }else {
            for (int i =index;i < elements;i++){
                arr[i] = arr[i +1];
            }
            elements --;
        }
    }

    /*
     * @Author liuhaidong
     * @Description 更新数据
     * @Date 11:09 2019/9/15 0015
     * @Param
     * @return
     **/
    public void change(int index,int newvalue)
    {
        if(index >=elements || index <0){
            throw new ArrayIndexOutOfBoundsException();
        }else {
            arr[index] = newvalue;
        }
    }
    
    /*
     * @Author liuhaidong 
     * @Description 添加有序数据
     * @Date 11:22 2019/9/15 0015
     * @Param  
     * @return
     **/

    public void insertOrderedArray(long value){
        int i;
        for(i =0;i<elements;i++){
            if(arr[i] > value){
                break;
            }
        }
        for(int j =elements;j > i;j--){
            arr[j] = arr[j -1];
        }
        arr[i] = value;
        elements ++;
    }

    /*
     * @Author liuhaidong
     * @Description 二分查找数据
     * @Date 11:42 2019/9/15 0015
     * @Param
     * @return
     **/
    public int binarySearch(long value){
        int middle = 0;
        int low = 0;
        int pow = elements;

        while(true){
            middle = (pow +low) / 2;
            if(arr[middle] == value)
            {
                return middle+1;
            }else if(low >pow)
            {
                return -1;
            }else {
                if(arr[middle] > value){
                    pow = middle -1;
                }else {
                    low = middle +1;
                    }
                }
            }
        }

主函数

public class Main {

    public static void main(String[] args) {

//        MyArray myArray = new MyArray();
//        myArray.insert(13);
//        myArray.insert(14);
//        myArray.insert(15);
//        myArray.display();
//        myArray.change(0,17);
//        myArray.display();
        System.out.println(myArray.search(17));
        System.out.println(myArray.get(2));
//        myArray.delete(2);
//        myArray.display();

        MyArray myArray = new MyArray();
        myArray.insertOrderedArray(16);
        myArray.insertOrderedArray(13);
        myArray.insertOrderedArray(14);
        myArray.insertOrderedArray(15);
        myArray.insertOrderedArray(17);
        myArray.display();

        System.out.println(myArray.binarySearch(16));
    }
}

全部评论

相关推荐

03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务