一个简单的Java应用程序
public class Test {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
注释
java的注释方式有三种:
- //
注释内容从//到本行结束 - /* */
包裹较长的注释 - /** 开头,*/结束
用于自动生成文档
数据类型
java有8种基本数据类型
- 整型(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 |
- 浮点型(2种)
类型 | 存储要求 | 取值范围 |
---|---|---|
float | 4字节 | 1位符号,8位指数,23位小数 |
double | 8字节 | 1位符号,11位指数,52位小数 |
-
字符型(1种)
char类型表示单个字符 -
布尔型(1种)
boolean 有两个值:true 和 false。 (Java的boolean和整型不能互换)
变量
java是强类型语言,所以每一个变量都有自己的类型。
-
全局变量
jvm在heap中申请内存,有初始化的值 -
局部变量
jvm在stack中申请内存,没有初始化的值 -
常量
由final修饰,只能赋值一次 -
类常量
由static final修饰,可以在一个类的多个方法中使用,范围权限为public可以再其他类的方法中使用
(题外话:无论是全部变量还是局部变量,最好是由我们程序员去确定一个初始值,以免出现不可预测的bug,当然jvm不给局部变量赋初始值,跟其作用域及生命周期有一定关系,可以从效率的角度去理解)
运算符
优先级从上到下排列:
类型 | 存储要求 | 取值范围 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | ++ -- !〜 | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | >> = << = | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | l | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | ||
ll | 左到右 | |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= l= | 从右到左 |
逗号 | , | 左到右 |
字符串
字符串String的特性
- String类是final的,不可被继承。
- String类是的本质是字符数组char[], 并且其值不可改变。
- String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。
- String对象可以通过“+”串联。串联后会生成新的字符串。
- Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
字符串类型
-
String
String 类的操作是产生新的String对象,所以效率慢,适用于在字符串不经常变化的场景; -
StringBuilder
StringBuilder是一个字符数组的扩容,效率高,内部方法没有加锁,所以线程不安全,适用于单线程字符串频繁操作的场景; -
StringBuffer
StringBuilder是一个字符数组的扩容,效率高,内部方法加了锁,所以线程安全,适用于多线程字符串频繁操作的场景;
(题外话:StringBuilder和StringBuffer的命名实在不能顾名思义,要通过查和记才能知道谁是线程安全的,这也体现出命名的一个重要性)
这里提供几个记StringBuilder和StringBuffer的方法:
- Builder是建筑的意思,可以联想到豆腐渣工程,所以StringBuilder是不安全的;
- Buffer的开头读"爸",可以记那个爸爸是安全的,所以StringBuffer是安全的;
- 打游戏的人都知道Buff,有了buff加成所以是安全的,所以StringBuffer是安全的;
String类中 ==和equals()的区别
- ==是判断两个变量或实例是不是指向同一个内存空间,即引用是否相同
- 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类。
“==”是操作符,用来比较基本类型。
输入输出
- 读取输入:Scanner in = new Scanner(System.in)
- 系统标准输入:System.in
- 格式化输出:System.out
控制流程
- 块作用域:
{...}
- 条件语句:
if(condition) {
...
} else if(condition){
...
} else {
...
}
- 循环语句:
while(condition) {
...
}
---------------------
// 循环体一定会执行一次
do {
...
} while(condition);
4.确定循环语句:
for(initialization; condition; update) {
...
}
- 多重选择语句:
// 如果没有break语句,将执行下一个case
switch(choice) {
case 1:
...
break;
case 2:
...
break;
default:
...
break;
}
- 中断控制语句:
break;
continue;
大数值
- BigInteger
- 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语句访问该二维数组,需要两层的循环嵌套。
网友评论