疯狂java讲义第四章笔记(部分)

数组作为引用类型的运行机制

内存中的数组

  1. 数组引用变量只是一个引用,相当于一个指针,指向内存中的数组的对象。
  2. 数组的对象被存储在堆(heap)中,数组引用变量如果是一个局部变量,则它保存在栈(stack)内存中。
  3. 访问数组元素采用p[index]
  4. 如果想回收数组的内存,把数组引用变量赋值为null,则切断了数组引用变量与实际数组对象的关系。数组的对象就变成了垃圾。

只要类型相互兼容,就可以让一个数组变量指向另一个实际的数组。
注意:
这种操作并不是在改变数组的长度。数组的长度是不可改变的(大声说三遍)。数组应该看成是两个部分:数组引用变量和数组的对象。数组的长度指的是数组的对象的长度。让一个数组变量指向另一个实际的数组,是将数组引用变量这个指针指向了另一个数组,但是之前的数组的对象的长度并不会改变,只是变成了垃圾等待被回收。

Paste_Image.png

基本类型数组的初始化

定义数组引用变量,在栈内存中有一个空引用
动态初始化数组后,开辟了内存空间,数组元素被赋默认值
动态遍历数组之后,数组元素的值直接储存在内存中。


Paste_Image.png
Paste_Image.png

引用类型数组的初始化

引用类型数组的数组元素是引用,塔指向另一块内存,这块内存存储了有效值。

Paste_Image.png
Paste_Image.png

如图所示

  1. 首先当定义一个Person[] students;时,是在栈内存中开辟一块区域。
  2. 当给数组动态赋值时,students=new Person[2];在内存里面开辟两块区域,并系统默认赋值为null。
  3. Person zhang=new Person();
    zhang.age=12;
    .....
    在栈内存中开辟一块区域给新生成的对象 zhang
    lee同理
  4. students[0]=zhang;把张赋值给了students[0];
    这时,students[0]和zhang能够访问到的东西完全相同。

没有多维数组

一维数组的定义是 type[] arrName,其中type是数组元素的类型,如果想要一个数组元素类型是int型数组的数组,那么就可以表示成int[][] arrName.扩展到全部java就是type[][] arrName.

动态初始化

Paste_Image.png

静态初始化

一维数组的静态初始化

intArr1=new int[]{2,3,4};
intArr2={1,2,3};
String[][] str1=new String[]{new String[3],new String[]{"hello"}};
String[][] str2={new String[3],new String[]{"hello"}};

Java8增强的工具类:Arrays

public class  ArraysTest 
{
    public static void main(String[] args) 
    {
        int[] a=new int[]{3,4,5,6};
        int[] a2=new int[]{3,4,5,6};
        System.out.println("如果a和b是否相等"+Arrays.equals(a,a2));
        int[] b=Arrays.copyOf(a,6);
        System.out.println("b的数组是"+Arrays.toString(b));
        Arrays.fill(b,2,4,1);
        Systemm.out.println("b的数组是"+Arrays.toString(b));
        //System.out.println("Hello World!");
    }
}

p101之后再次阅读

数组的应用举例

数组的用途:如果程序中有多个类型相同的变量,而且它们具有逻辑的整体性,则可以把它们定义成一个数组。

浮点数转人民币读法(课后习题版)

(小白初学java,代码不当之处请大家多多指出。我自己都觉得编的太差)

import java.util.Arrays;
public class  Num2Rmb
{
    private String[] hanArr={"零","壹","二","三","四","五","六","七","八","九","十"};
    private String[] unitArr={"千","百","十","元"};
    private String[] unitXiaoArr={"角","分"};
    /**
    *把一个浮点数分解成整数部分和小数部分字符串
    *@param num 需要被分解的浮点数
    *@return 分解出来的整数部分和小数部分,第一个数组元素是整数部分,第二个数组元素是小数部分
     */
    private String[] divide(double num)
    {
         long zheng=(long)num;
         //小数部分变成一个两位数
         long xiao=Math.round((num-zheng)*100);
         //用两种方法把整数转换为字符
         return new String[]{zheng+"",String.valueOf(xiao)};
     }
     /**
     *把分割好的字符串数组转化为汉字字符串
     *@param numStr 需要转换的字符串数组
     *@return 转换成的汉字字符串
     */
     private String toHanStr(String[] numArr)
    {
         String result="";
         //整数与小数的长度
         int zhengLen=numArr[0].length();
         int xiaoLen=numArr[1].length();
         for(int i=0;i<zhengLen;i++)
        {
             //把char型数字转换成int型数字,因为ASCII码差48,
             //因此char型数字减去48就得到int型数字
             int numZheng=numArr[0].charAt(i)-48;
             //如果数字不是0,则需要添加单位
             if(numZheng != 0)
            {
                 result+=hanArr[numZheng]+unitArr[i];
                 
            }//如果最后一个数字是0,则加上“元”,直接跳出循环
            else if((numArr[0].charAt(zhengLen-1)-48)==0)
            {
                result+=unitArr[3];
                break;
            }
            //如果前一位不得0则打印汉字0
            else if((numArr[0].charAt(i-1)-48)!=0)
            {
                result+=hanArr[numZheng];
            }
            
         }
         //小数部分变成汉字
         for(int i=0;i<xiaoLen;i++)
        {
             int numXiao=numArr[1].charAt(i)-48;
             //只要不是0,就变成汉字加上单位
             if(numXiao!=0)
            {
                 result+=hanArr[numXiao]+unitXiaoArr[i];
             }else//如果是0.就只变成汉字
            {
                 result+=hanArr[numXiao];

             }

         }
         return result;
     }

    public static void main(String[] args) 
    {
        
        Num2Rmb nr=new Num2Rmb();
        System.out.println(Arrays.toString(nr.divide(23671125.123)));
        System.out.println(nr.toHanStr(nr.divide(1006.333)));

        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,500评论 1 51
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,483评论 0 3
  • 三九天的日子里,冰冷穿透裤管侵袭着肌肤,令人想起曾经一个人坚持的那些冰冷的“苦日子”:流着泪,咬着牙,忍着痛……现...
    忆如斯阅读 908评论 1 2