Java_Basic

基础知识

JDK:Java Development Kit,即Java开发包

JRE:Java Runtime Environment,即运行Java字节码的虚拟机,而Java源码编译为Java字节码就需要JDK

简单来说二者关系即:JRE=JVM+Runtime Library,JDK=JRE+Compiler+debugger+etc

一个简单的java代码

1
2
3
4
5
6
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
//定义了一个名为Hello的public类,里面有一个静态的方法实现了一个打印的操作

要运行这个程序需要经过source code->byte code->Run on JVM这样的流程,即源码->字节码->虚拟机运行

Java程序的基本结构

作为面向对象的语言,Java程序的基本单位是类,类名必须以英文字母开头,有字母,下划线,数字组成,一般以大写字母开头

在上面的代码中可以看到定义类时有一个public关键字,这是访问修饰符,public即该类是公开的

在类的内部可以定义方法,如上面的main,也有访问修饰符,方法命名与类相同,但一般以小写字母开头

Java中的变量以及数据类型

基本类型

基本类型直接储存在栈内存中,他们的值是实际的数据

  • 整型:byte,short,int,long
  • 浮点数类型:float,double
  • 字符:char
  • 布尔:boolean

其中,byte占一个字节,short和char两个,int和float四个,long和double八个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//整型定义
int i3 = 2_000_000_000; // 加下划线更容易识别
long n1 = 9000000000000000000L; // long型的结尾需要加L
long n2 = 900; // 没有加L,此处900为int,但int类型可以赋值给long
int i6 = 900L; // 错误:不能把long型赋值给int

//浮点数定义
double d = 1.79e308;//double末尾不加f
float f1 = 3.14f;//float需要加f
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
float f3 = 1.0; // 错误:double类型不能赋值给float

//字符类型定义
char a = 'n'//使用单引号,字符串使用双引号

引用类型

引用类型储存在堆内存中,实际上储存的是地址

除去基本类型外其他的都是引用类型,最常见的就是String

1
String s = "n1ng"

定义变量时如果加上final修饰符就变成了常量,而常量在定义时进行初始化后就不可以再次赋值

var关键字

在定义变量的时候如果类型的名字很长,可以用var关键字来省略变量类型

1
var sb = new StringBuilder();

运算

整数和浮点运算:略

布尔运算

关系运算符的优先级

1
2
3
4
5

> , >= , < , <=
== , !=
&&
||

三元运算符

1
2
b?x:y
即如果b则返回x,否则返回y

字符和字符串

Java在内存中使用unicode来表示字符,不论是英文还是中文都是一个char

1
2
3
4
5
6
7
//可以直接将char赋值给int,值为unicode编码
int a1 = 'A';//此时a1的值为'A'的unicode编码
int a2 = '啊';//此时a2的值为'啊'的unicode编码

//也可以通过转义字符'\u'+unicode编码来表示一个字符
char b1 = '\u0041';//即0x41,表示'A'

前面提到String类型需要用双引号来包裹,如果字符串中本来就含有双引号那么就需要用转义字符”\“来表示

1
String c1 = "n1ng\"n2ng"

因为“\”是转义字符,所以两个“\”,即\表示\,常见的转义字符有

1
2
3
\n,换行
\r,回车
\u####,unicode编码的字符

字符串的连接可以用+号直接连接,数据类型会自动转化,多行字符串连接时可以用”””…”””来表示(Text Blocks),如

1
2
3
4
5
6
String s = """
select * from
users
where id > 100
order by name
""";

多行字符串的每行之前的共同的空格会被删掉,末尾其实还有一个\n,如果不需要就把最后的三个引号紧跟着最后的字符

字符串一个不可变的类型

1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args) {
String s = "hello";
System.out.println(s); // 显示 hello
s = "world";
System.out.println(s); // 显示 world
}
}

这段代码运行后可以发现,虽然两次输出的s是不同的,但其实并不是hello被修改成了world,而是重新创建了一个字符串hello,然后再使s指向hello

1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args) {
String s = "hello";
String t = s;
s = "world";
System.out.println(t); // t是"hello"
}
}

通过这个例子就能发现”hello”其实并没有被修改

需要注意的是,想要比较字符串是否相同时需要用equals方法而不能用==

常用的方法有:

  • splilt(),分割字符串
  • join(),拼接字符串
  • format()静态方法和formatted()方法,传入参数替换占位符生成新的字符串//String s =”Hello %s”;s.formatted(“n1ng”);String.format(s,”n1ng”)
  • valueOf(),将其他类型转换为字符串,String.valueOf(123)
  • parsexxx(),将字符串转换为其他类型,如parseInt(),parseBoolean()
  • toCharArray(),String转换为char[]//char[] n1ng = “n1ng”.toCharArray();String s = new String(n1ng);

数组

数组也是引用类型

实际上字符串在String内部是通过char[]数组表示的

1
2
3
4
5
6
7
8
//定义
int[] d1 = new int [5];//默认初始为0,布尔类型则为false

int[] d2 = new int[] {1,2,3,4,5};

int [] d3 = {1,2,3,4,5};

String[] e1 = {"abc","def"}

字符串数组中存储的是每个字符串的地址

StringBuilder

StringBuilder是一个可变对象,可以预分配缓冲区,在往StringBuilder中添加字符时不会再像普通的String那样创建新的临时对象

1
2
3
4
5
6
7
8
9
10
StringBuilder sb = new StringBuilder(1024);
for(int i = 0;i < 100; i++){
sb.append(",");
sb.append(i);
}
for(int i = 0; i < 100; i++){
sb.append(",").append(i);//也可以进行链式操作
}

String s = sb.toString();

StringJoiner

方便实现使用分隔符拼接数组这里需求

1
2
3
4
5
6
String[] names = {"n1ng","n2ng","n3ng"};
StringJoiner sj = new StringJoiner(", ","Hello ", "!");//以", "为分隔符,开头为"Hello ",结尾为"!"
for(String name : names){
sj.add(name);
}
String s = sj.toString();

同时也提供了一个静态方法join(),在不需要指定开头和结尾的情况下更加方便

1
2
String[] names = {"n1ng","n2ng","n3ng"};
var s = String.join(",",names);

包装类型

定义一个包装类可以将基本类型变为引用类型

1
2
3
4
5
6
7
8
9
public class Interger{//将int包装为Integer
private int value;
public Integer(int value){
this.value = value;
}
public int intValue(){
return this.value;
}
}

此时int和Interger可以相互转换

1
2
3
Integer n1 = null;
Integer n2 = new Integer(100);
int n3 = n2.intValue();

Java核心库为每种基本类型都提供了对应的包装类型

基本类型 对应的引用类型
boolean java.lang.Boolean
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
char java.lang.Character

枚举类

让编译期能够自动检查某个值在枚举的集合内,可以使用enum来定义枚举类

1
2
3
enum WeekDay(){
SUN,MON,TUE,WED,THU,FRI,SAT;//WeekDay.SUN这样调用即可
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3049155267@qq.com

💰

×

Help us with donation