新手区 数组--学习 java 归纳(4)

wuming · 2015年03月28日 · 最后由 wuming 回复于 2015年03月30日 · 1184 次阅读

又是一个月过去了,学习 java 的进程在缓慢的进行。这一次学习了数组,里面的算法对初学者来说还是有点难度,所以我足足学了两遍,敲了两遍代码。
数组是同一种类型数据的集合。可以将它比作一个容器,当要操作的数据比较多的时候,可以先将期存入到数组中。好处是可以对这些数据进行编号。方便操作。容器是程序语言中非常重要的概念。计算机语言无非是为了操作数据。数据多了就需要存储。那么容器就成了最常用的要素。
数组常用的是一维数组和二维数组。还有三维四维,据说爱因斯坦才能四维,五维,咳咳~~。


我们写个简单的一维数组的例子:
先初始化:

int[] arr=new int[5];

再输出:

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

这里是初始化一个最多为五个数的数组,可以输出的是 arr[0~4].
再分析下一维数组的内存。JVM 虚拟机的内存主要有四个区,栈区,堆区,静态区,代码区。主要是栈区和堆区。
栈区存放函数的参数值,局部变量的值等,在超过这个变量的作用域时就会被系统自动释放掉存在于 JVM 内存中的资源。
优点:存取速度比堆快
缺点:栈中的数据大小与生存周期是确定的,无灵活性。
堆区是存放由 new 创建的对象和数组,JVM 不定时的查看这个对象,如果没有引用指向这个对象就回收。
优点:可以动态分配 JVM 内存
缺点:要在运行时分配 JVM 内存,速度慢

以上说明了存放的位置,像 int[] arr=new int[5],其中 int[] arr 存放在栈区,new int[5] 存放在堆区。
接着是数组的算法,这个对于初学者来说有些难以理解,要多练习。
首先是数组的 length 属性,可以获取数组的长度,这个非常常用。还有一个就是给数组从小大排序:Arrays.sort(数组名)。

算法一:求最大值.思路是假设第一个是最大值,然后第一个跟第二个对比,要是第一个小于第二个,那么最大值就等于第二个。然后第二个再跟第三个第四个第五个第 i 个比。直到必出最大的,然后挑出来。

public class Max{
          public static void main(String[] args){
              Scanner in=new Scanner(System.in);
              int[] arr=new int[5];
              for(int i=0;i<arr.length;i++){
              System.out.println(请输入第+(i+1)+"个学生的成绩");
              arr[i]=in.nextInt();
}
             int max=arr[0];
             for(int i=0;i<arr.length;i++){
             if(max<arr[i]){
             max=arr[i];
}

}
System.out.println("");
}
}

算法二:数组复制。不能直接 arrB=arrA,而是要在 for 循环下=。

public class Copy{
          public static void main(String[] args){
              int[] arrA={1,2,3,4,5,6,7,8};
              int arrB=new int[arrA.length];
              for(int i=0;i<arr.length;i++){
                  arrB[i]=arrA[i];
}
              for(int i=0;i<arrA.length;i++){
                 System.out.println(arrB[i]);
}
}
算法三:数组查找。在数组中查找,主要是循环查找是否equals。

```java
public class Find{
          public static void main(String[] args){
              Scanner in=new Scanner(System.in);
              System.out.println("请输入你要找的学生的姓名:");
              String name=in.next();
              String[] arr={"张三","李四","王五"};
              boolean flag=false;
             for(int i=0;i<arr.length;i++){
               if(name.equals(arr[i])){
                  flag=true;
                    break;
}
}
               if(flag==true){
                       System.out.println("找到了");

}else{
                     System.out.println("查无此人");
}
}

算法四:数组插入。将一个值插入到 arr.length-1 的位置上去。因为数组是从 0 开始的。

public class Insert{
          public static void main(String[] args){
              Scanner in=new Scanner(System.in);
              int[] arr={23,44,56,33,53,77};
              System.out.println("请输入你要插入的值:");
              int num=in.next();
             arr[arr.length-1]=num;
             for(int i=0;i<arr.length;i++){
             System.out.println(arr[i]);
}
}

算法五:冒泡排序。用的是嵌套循环的方法,第 1 个数和第 2 个对比,第 1 个数要是比第 2 个大,那么它们进行替换。接着再对比第 2 个数第 3 个数,一直到第一轮比完,外嵌套循环比完一次,接着内嵌套循环比第二次,从第 2 个数开始往后对比。一直到外嵌套循环也比完,再进行输出。

public class maopao{
          public static void main(String[] args){
              int[] arr={23,44,56,33,53,77};
            for(int i=0;i<arr.length-1;i++){  
             for(int j=0;j<arr.length-1;j++){
                 if(arr[j]>arr[j+1]){
                    int t=arr[j];
                    arr[j]=arr[j+1];
                   arr[j+1]=t;
}
}
}
             for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
}
}
}

算法六:选择排序。冒泡排序是一次一次的比,选择排序是比完一个,就把第一轮比完的最大数挑出来,放在一旁,再进行第二轮对比。比一轮就少一个数。所以选择排序比冒泡排序效率更高。

public class xuanze{
          public static void main(String[] args){
              int[] arr={23,44,56,33,53,77};
            for(int i=0;i<arr.length-1;i++){  
             for(int j=i+1;j<arr.length;j++){
                 if(arr[j]>arr[j+1]){
                    int t=arr[j];
                    arr[i]=arr[j];
                   arr[j]=t;
}
}
}
             for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]); 
}
}
}

算法总算完了,接着是二维数组。



最后,for 循环结合数组的增强型 for 循环,在自动化常常会用到。。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

赞. 读了一遍, 我也重温了下 java. 每次遇到语法问题, 我都得去 google 一番.

@seveniruby 谢谢赞。。我也是打算写在这里以后忘记了可以回过头来温习。

#2 楼 @woshizh 动手练习很重要, 可以辅助记忆. 加深理解.

不练习 两天就忘记了。

@lihuazhang @seveniruby 深有体会两天就忘记是啥意思~~不过不是每天都有时间去写这个,还有很多要学的~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册