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

2018-02-02  本文已影响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语句访问该二维数组,需要两层的循环嵌套。

上一篇下一篇

猜你喜欢

热点阅读