美文网首页
《Java核心技术卷 I》之 Java的基本程序设计结构

《Java核心技术卷 I》之 Java的基本程序设计结构

作者: 含笑小基石 | 来源:发表于2018-02-02 15:07 被阅读0次
    Java的基本程序设计结构

    一个简单的Java应用程序

    public class Test {
        public static void main(String[] args) {
            System.out.println("Hello world");
        }
    }
    

    注释

    java的注释方式有三种:

    1. //
      注释内容从//到本行结束
    2. /* */
      包裹较长的注释
    3. /** 开头,*/结束
      用于自动生成文档

    数据类型

    java有8种基本数据类型

    1. 整型(4种)
    类型 存储要求 取值范围
    byte 1字节 -2^7 —— 2^7-1
    short 2字节 -2^15 —— 2^15-1
    int 4字节 -2^31 —— 2^31-1
    long 8字节 -2^63 —— 2^63-1
    1. 浮点型(2种)
    类型 存储要求 取值范围
    float 4字节 1位符号,8位指数,23位小数
    double 8字节 1位符号,11位指数,52位小数
    1. 字符型(1种)
      char类型表示单个字符

    2. 布尔型(1种)
      boolean 有两个值:true 和 false。 (Java的boolean和整型不能互换)


    变量

    java是强类型语言,所以每一个变量都有自己的类型。

    1. 全局变量
      jvm在heap中申请内存,有初始化的值
    2. 局部变量
      jvm在stack中申请内存,没有初始化的值
    3. 常量
      由final修饰,只能赋值一次
    4. 类常量
      由static final修饰,可以在一个类的多个方法中使用,范围权限为public可以再其他类的方法中使用

    (题外话:无论是全部变量还是局部变量,最好是由我们程序员去确定一个初始值,以免出现不可预测的bug,当然jvm不给局部变量赋初始值,跟其作用域及生命周期有一定关系,可以从效率的角度去理解)


    运算符

    优先级从上到下排列:

    类型 存储要求 取值范围
    后缀 () [] . (点操作符) 左到右
    一元 ++ -- !〜 从右到左
    乘性 * /% 左到右
    加性 + - 左到右
    移位 >> >>> << 左到右
    关系 >> = << = 左到右
    相等 == != 左到右
    按位与 左到右
    按位异或 ^ 左到右
    按位或 l 左到右
    逻辑与 && 左到右
    逻辑或
    ll 左到右
    条件 ?: 从右到左
    赋值 = += -= *= /= %= >>= <<= &= ^= l= 从右到左
    逗号 左到右

    字符串

    字符串String的特性

    1. String类是final的,不可被继承。
    2. String类是的本质是字符数组char[], 并且其值不可改变。
    3. String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。
    4. String对象可以通过“+”串联。串联后会生成新的字符串。
    5. Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。

    字符串类型

    1. String
      String 类的操作是产生新的String对象,所以效率慢,适用于在字符串不经常变化的场景;
    2. StringBuilder
      StringBuilder是一个字符数组的扩容,效率高,内部方法没有加锁,所以线程不安全,适用于单线程字符串频繁操作的场景;
    3. StringBuffer
      StringBuilder是一个字符数组的扩容,效率高,内部方法加了锁,所以线程安全,适用于多线程字符串频繁操作的场景;
      (题外话:StringBuilder和StringBuffer的命名实在不能顾名思义,要通过查和记才能知道谁是线程安全的,这也体现出命名的一个重要性)

    这里提供几个记StringBuilder和StringBuffer的方法:

    1. Builder是建筑的意思,可以联想到豆腐渣工程,所以StringBuilder是不安全的;
    2. Buffer的开头读"爸",可以记那个爸爸是安全的,所以StringBuffer是安全的;
    3. 打游戏的人都知道Buff,有了buff加成所以是安全的,所以StringBuffer是安全的;

    String类中 ==和equals()的区别

    1. ==是判断两个变量或实例是不是指向同一个内存空间,即引用是否相同
    2. equals是判断两个变量或实例所指向的内存空间的值是不是相同 ,即内容是否相同
      简单讲就是,==判断是否是同一个东西,equals()判断东西是不是长得一样

    拓展:
    Java 语言里的 equals()其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个对象是相同的。所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要去看定义。

    所有类的父类Object中对equals()的定义如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    而String类中就对equals()方法进行了复写:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }
    

    在java中,只有基本类型不是对象,例如数值,字符和布尔类型。
    所以用equals来比较对象,并且一般要实现重写,比如String类。
    “==”是操作符,用来比较基本类型。


    输入输出

    1. 读取输入:Scanner in = new Scanner(System.in)
    2. 系统标准输入:System.in
    3. 格式化输出:System.out

    控制流程

    1. 块作用域:
    {...}
    
    1. 条件语句:
    if(condition) {
        ...
    } else if(condition){
        ...
    } else {
        ...
    }
    
    1. 循环语句:
    while(condition) {
        ...
    }
    ---------------------
    // 循环体一定会执行一次
    do {
        ...
    } while(condition);
    

    4.确定循环语句:

    for(initialization; condition; update) {
        ...
    }
    
    1. 多重选择语句:
    // 如果没有break语句,将执行下一个case
    switch(choice) {
        case 1:
            ...
            break;
        case 2:
            ...
            break;
        default:
            ...
            break;
    }
    
    1. 中断控制语句:
    break; 
    continue;
    

    大数值

    1. BigInteger
    2. BigDecimal

    数组

    定义:数组是一种数据结构,用来存储同一类型的集合。
    声明:int[] a; | int a[];
    初始化:int[] a = new int[100];

    for each遍历循环

    // 适用于数组,集合类对象和实现了Iterable接口的类对象
    for(value : collection) {
        ...
    }
    

    数组初始化及匿名数组

    int[] a = {1, 2, 3}; // 在声明时初始化数组
    new int[] {1, 2, 3}; // 初始化一个匿名数组,可以作为方法的数组参数
    

    数组拷贝

    int[] luckyNumbers = smallPrimes; // 两个变量将引用同一个数组
    int[] luckyNumbers = Arrays.copyOf(smallPrimes, smallPrimes.length()); // 将数组的值拷贝到一个新的数组
    

    命令行参数
    main方法接收一个String[] 参数args,这里便是命令行参数
    数组排序:

    Array.sort(numbers); // 优化的快排
    

    多维数组&不规则数组
    Java其实没有多维数组,只有一维数组,所以多维数组又被称为“数组的数组”

    int[][] magicSquare = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    

    要用for:each语句访问该二维数组,需要两层的循环嵌套。

    相关文章

      网友评论

          本文标题:《Java核心技术卷 I》之 Java的基本程序设计结构

          本文链接:https://www.haomeiwen.com/subject/qpcezxtx.html