Java基本程序设计结构编程入门(上)

Java是强类型的语言,学习Java,首先要学习这门程序设计语言的基础概念在程序中的实现方式.

一、数据类型:

在Java中一共有八种基础数据类型,四种整型,两种浮点型,一种表示Unicode编码的字符char类型,还有一种是表示真值的Boolean类型

  • 1、整型
    类型 存储需求 范围
    byte 1字节 -128~127(-2的7次方到2的7次方-1)
    short 2字节 -32768~32767(-2的15次方到2的15次方-1)
    int 4字节 -2147483648~2147483647(-2的31次方到2的31次方-1)
    long 8字节 -9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
  • 2、浮点类型
    类型 存储需求 范围
    float 4字节 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)
    double 8字节 1.797693e+308~ 4.9000000e-324

double类型表示的数值精度是float类型表示数值精度的两倍,double也称为双精度数值,在实际应用中,大多数情况都是使用double,float可以在存储单精度的时候使用.

  • 3、char类型
    char类型的值要用单引号括起来,在Java中,char类型描述了UTF-16编码中的一个代码单元,在实际开发中,除非需要处理UTF-16代码单元,否则不建议在程序中使用char类型,建议使用字符串类型
  • 4、boolean类型
    boolean类型只有两个值:true和false,用来表示真和假,作为逻辑判断,整型和布尔不能互相转换

数据类型的级别从高到低为:byte,short,char(三个平级) -> int ->float -> long -> double
类型之间的转换:从低级别到高级别由系统自动转换,把高级别赋值给低级别的变量时,强制转换

每个基本数据类型都有相应的包装类型,int -> Integer ,double-> Double,float -> Float,short-> Short, long -> Long,boolean -> Boolean,char -> Character,byte -> Byte.基本数据类型和他们各自的包装类之间会有拆箱和装箱的操作,把int类型变量转换为Integer类型叫做装箱,反之则为拆箱.装箱操作都为valueOf()方法,而拆箱基本都是基本数据类型加上Value作为拆箱方法,例如intValue,longValue等等.

二、变量和常量:

  • 1、变量:
    变量是内存中开辟的一块存储区域,用于记录和存储不断变化的数据的值,每个变量都有自己的类型,变量类型位于变量名称之前,变量在使用前必须用赋值语句进行显示的初始化.
    • 空间开辟构成要素: 变量名称,变量类型,变量第一次的初始化值
    • 作用: 方便运算
    • 特点: 变量空间可以重复使用
    • 作用域: 从变量的定义的位置开始,到变量所在的大括号结束
  • 2、常量:
    在Java中,常用final关键字表示常量,常量也是一块存储区域,在定义常量时会进行一次赋值,之后一直到常量的生命周期结束,该常量的值都不会被改变及被第二次赋值,也就是常量只能赋值一次,习惯上,常量为全大写.

三、运算符:

  • 1、算数运算符:
    +,-,*,/表示加减乘除,当参与/运算的两个数都是整数时表示整数除法,否则表示浮点除法.求余操作用%,例如15%2等于1,当整数被0除时将会产生一个异常,浮点数被0除时则会得到无穷大或者NaN结果.
  • 2、结合赋值运算符:
    例如x+=2 就等于 x = x+2,一般要把运算符放到=号左边,%= ,*=
  • 3、自增自减运算符:
    自增和自减运算符有两种形式,一种是"前缀"式,一种是"后缀"式,n++,n--,++n,--n.这两种的写法的区别就在于n++的方式是变量先进行计算再进行自增,++n的方式则是变量先进行自增再计算
  • 4、关系和boolean运算符:
    boolean运算符的结果只有两种,要么是false,要么是true.如:5==7 结果为false,还可以用!=检测不相等,3!=9结果为true,
    Java中>,<,>=,<=大于,小于,大于等于,小于等于以及!来表示的逻辑非运算符.
    && , || ,|,&,^
    • &只有两边为true结果才为true,否则为false
    • |只要两边都为false结果是false,否则为true
    • ^:异或:两边结果一样,就为false,两边结果不一样,就为true
    • &&和&的区别: &表示无论左边结果是什么,右边都参与运算,&&短路与,如果左边为false,那么右边不参与运算
    • | 和|| 区别: |两边都参与运算,||短路或,左边为true,右边不参与运算
  • 5、位运算符:
    << , >> , >>>
    <<,>>运算符将位模式右移或者左移,>>>运算符会用0填充高位

四、字符串:

在实际开发中,几乎没有一个项目不使用String字符串,String字符串用双引号" "进行定义,也可以使用+号对两个字符串进行连接.
String之所以可以存储字符串主要原因是其中定义了一个数组,字符串中每个字符都是保存在数组中.在jdk1.9之前String保存的是字符数组,从jdk1.9开始,String保存的是字节数组.
1.9前源码:

private final char value[];

1.9开始源码:

private final byte[] value;
  • 1、字符串比较:
    示例:
        String str = "abc";
        String str1 = new String("abc");
        System.out.println(str == str1);

运行结果:false
实际上两个相等的值比较出来却是false,原因就在于==,==比较的是两个数值是否相等,而对于两个对象则比较的是两个对象的内存地址是否相等,很显然,str和str1的内存地址是不相等.我们想要的是内容相等就返回true,在这里就需要用equals,equals比较的是两个对象的内容是否相等.把上面程序==改为equals.

        String str = "abc";
        String str1 = new String("abc");
        System.out.println(str.equals(str1));

运行结果:true

  • 2、字符串常量:
    字符串常量是String类的匿名对象.任何用双引号定义的字符串常量实际上都是String类的匿名对象.在字符串的比较中需要注意一个问题,用户输入的字符串要放在equals后面.也就是字符串常量要放在前面,示例:
        String str = null;
        System.out.println(str.equals("abc"));
    
    运行结果:java.lang.NullPointerException
    在输入的数据为null时,程序会抛空指针异常.下面换一种写法,
         String str = null;
         System.out.println("abc".equals(str));
    
    运行结果:false
    两种方式只是位置不同,结果为什么会不同,其原因就在于,equals方法中提供了一个可以规避null的判断,所以把字符串常量写在前面的时候永远都不会出现空指针,因为字符串常量是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象.
  • 3、字符串实例化的方式:
    • 直接赋值给String对象
    • 利用new关键字(构造方法实例化)
     //直接赋值
      String str =  "aaa"; 
      //new关键字赋值
      String str1 = new String("aaa");

区别:
第一种实例化是直接在堆内存中开辟一块内存存放aaa,在上面已经说明,字符串常量是String的匿名对象,所以str对象则在栈内存中指向这块堆内存.只会产生一个实例化对象,会自动保存到对象池,可以实现字符串对象的重用.
第二种方式是先在堆内存中开辟内存存放aaa,在new的过程中在不同的堆内存地址开辟空间并存放aaa,在栈内存中的str1指向的是后面开辟的堆内存空间,产生两个实例化对象,不会自动保存到对象池,不可以重用.

    //直接赋值
     String str =  "aaa";
     //new关键字赋值
     String str1 = new String("aaa");
     //结果为false
     System.out.println(str == str1);

所以,str == str1的结果为false,==比较的是两个对象的内存地址或者是数值
接下来定义一个新的对象str2,str == str2结果为true.这里结果为true,具体的原因在直接赋值的过程中,涉及到了共享设计的概念,在jvm中有对象池,当创建对象时,会将当前对象的匿名对象入池保存,当以同种方式再次创建对象,会先从池中查找是否存在与当前对象匿名对象内容相等的对象,若已经存在,则不会开辟新的空间,而是直接指向已有的地址.所以结果为true

      //直接赋值
      String str =  "aaa";
      //new关键字赋值
      String str1 = new String("aaa");
      //结果为false
      System.out.println(str == str1);
      String str2 = "aaa";
      //结果为true
      System.out.println(str == str2);

使用构造方法来实例化对象不会在对象池中保存,如果想要入池可以调用intern()方法.如下:

     //直接赋值
     String str = "aaa";
     //new关键字赋值
     String str1 = new String("aaa");
     //结果为false
     System.out.println(str == str1);
     String str2 = "aaa";
     //结果为true
     System.out.println(str == str2);
     String str3 = new String("aaa").intern();
     //结果为true
     System.out.println(str == str3);
  • 4、常量(对象)池:
    对象池的主要目的是实现数据的共享处理,String对象池里面的内容主要是为了重用,而重用实际就是共享.常量池可以两种:
    1.静态常量池:在程序(.class)加载中自动将当前程序中的字符串,普通的常量,类和方法的信息等等进行分配
    2.运行时常量池:当一个程序加载之后,将class文件中的常量池载入到内存中,并保存在方法区中.
    看以下案例:
         String str1 = "ab";
         String str2 = "abc";
         String str3 = str1 + "c";
         //结果false
         System.out.println(str3 == str2);
         String str4 = "ab" + "c";
         //结果true
         System.out.println(str4 == str2);
    

以上的结果表明,如果是常量相加,JVM会进行优化,直接编译成结果,如果是变量加常量,会new一个StringBuilder对象append,最后通过StringBuilder的toString方法生成一个新的字符串对象.所以str3与str2的地址不相同.还有一个原因就是静态常量池和运行时常量池的区别,由于str4的"ab","c"都是常量数据,所以在加载的时候会自动处理相应的连接,处理好的连接刚好在静态常量池中存在,str4直接指向的对象的地址也就和str2是同一个地址,而str3中str1是一个变量,程序在加载的时候并不确定str1的内容,因为在字符串连接的时候str1采用的是变量,变量是可以被修改的,所以它不认为最终的str3结果就是需要的结果,str3存储在运行时常量池中.

  • 5、字符串的修改
    字符串内容不可修改
    在String类中存储的是数组,而数组最大的缺点就是长度不可变,当创建了一个字符串之后,会自动的进行数组空间的开辟,开辟内容的长度是固定的.
  • 6、String常用方法:
    1. boolean equals(Object anObject) 字符串比较,相等返回true
    2. boolean equalsIgnoreCase(String anotherString) 字符串忽略大小写比较,相等返回true
    3. int length() 返回字符串长度
    4. String replace(char oldChar, char newChar) 返回一个新的字符串,新值替代旧值
    5. String substring(int beginIndex, int endIndex)
    6. String substring(int beginIndex) 返回新的字符串,开始下标和结束下标或者开始下标
      等等......
      上篇到这里结束,若有错误和补充欢迎指出
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容