一、垃圾回收机制
1、为什么要进行垃圾回收机制
如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。
2、哪些内存需要回收?
哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何找到这些对象?(如何判断一个对象是否可以被回收)
3、如何判断一个对象是否可以被回收
问:垃圾收集器有哪几种?
垃圾收集器底层原理剖析?
垃圾收集器的算法,优化?
(1)引用技术算法
这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。任何时刻计数值为0的对象就是不可能再被使用的。引用计数为 0 的对象可被回收。正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。
package com.baidu.GC;public class ReferenceCountingGC {private Object instance = null;private static final int _1MB = 1024 * 1024;/** 这个成员属性唯一的作用就是占用一点内存 */private byte[] bigSize = new byte[2 * _1MB];public static void main(String[] args) {ReferenceCountingGC objectA = new ReferenceCountingGC();ReferenceCountingGC objectB = new ReferenceCountingGC();objectA.instance = objectB;objectB.instance = objectA;objectA = null;objectB = null;System.gc();}
}
二 、JAVA跨平台原理
1、JAVA
Java是可以跨平台的编程语言,那我们首先得知道什么是平台,我们把CPU处理器与操作系统的整体叫平台。
C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关;
Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器。
在执行的时候,表面上我们调用的是Java.exe,实际上我们在调用java.exe的时候,会去动态调用JVM虚拟机,JVM将字节码文件一行一行的解释成为当前操作系统认识的可执行文件的格式,因此,java是一个“解释型”语言。
Java是编译型的语言,也是解释型的语言,现在明白了,编译型的语言是因为java的你可以说它是编译型的,因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有
而解释型因为java代码编译后不能直接运行,它是解释运行在JVM上的,而JVM的执行方式是把字节码文件一行一行的解释成当前平台认识的可执行文件,所以它是解释运行的,那也就算是解释类型的了。
2、C语言的跨平台原理
那么c语言是不是跨平台的语言呢,实际上我们所说的跨平台,是指编译后的文件是否可以跨平台,从这个角度来讲,c语言不是跨平台的,但是网上有很多人讲c语言是跨平台的语言,这里指的是因为不同平台有对应的编辑器,是源文件跨平台.
3、效率问题
我们回到两个语言跨平台的原理,java把程序先编译成字节码,然后通过对应的JVM进行一句一句的解释执行,而c语言,则直接通过对应平台的解释器翻译成直接可以在对应平台是执行的文件,从这可以看出,c语言的执行效率是快于java的。
三、JAVA的常用DOS命令
(1)控制命令台:
win+R
(2)切换盘符
C: D: E: //大小写都可以
(3)显示详细信息 dir
dir
(4)改变当前目录
cd
(5 ) 当前目录和上一层目录
cd . //当前目录
cd .. //上层目录
(6)清屏
cls
(7)补全命令 TAB
cd s+TAB
(8)创建/删除一个目录
md a // make dir 创建目录
rd a // remove dir 删除目录
(9)复制文件夹
copy demo.txt a\test.txt
(10)删除文件
del 文件名
四、JDK和JRE
JRE(Java Runtime Enviroment) 是 Java 的运行环境。。面向 Java 程序的使用者,而不是开发者。如果你仅下载并安装了 JRE,那么你的系统只能运行 Java 程序。
JDK(Java Development Kit) 又称 J2SDK(Java2 Software Development Kit),是 Java 开发工具包,它提供了 Java 的开发环境(提供了编译器 javac 等工具,用于将 java 文件编译为 class 文件)和运行环境(提 供了 JVM 和 Runtime 辅助包,用于解析 class 文件使其得到运行)。如果你下载并安装了 JDK,那么你不仅可以开发 Java 程序,也同时拥有了运行 Java 程序的平台。JDK 是整个 Java 的核心,包括了 Java 运行环境(JRE),一堆 Java 工具 tools.jar 和 Java 标准类库 (rt.jar)。
五、JAVA基本语法
1、变量
(1)变量的概念
在内存中分配一块地址,用来存储各种不同类型的数据。
(2)变量的类型
int a, b, c; // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte z = 22; // 声明并初始化 z
String s = "runoob"; // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x'; // 声明变量 x 的值是字符 'x'。
变量在声明时候可以没有初始值,但是在使用的时候必须赋予初始值。
JDK10之后,有一种变量声明方式,VAR,但需要赋值,会推断其属于什么类型。
var 变量 = 值
(3)变量的范围
①局部变量
局部变量是在方法、构造函数或块内部声明的变量,它们在声明的方法、构造函数或块执行结束后被销毁,局部变量在声明时需要初始化,否则会导致编译错误
public void exampleMethod() {int localVar = 10; // 局部变量// ...
}
②实例变量
实例变量是在类中声明,但在方法、构造函数或块之外,它们属于类的实例,每个类的实例都有自己的副本,如果不明确初始化,实例变量会被赋予默认值(数值类型为0,boolean类型为false,对象引用类型为null)。
public class ExampleClass {int instanceVar; // 实例变量
}
③静态或类变量
类变量是在类中用 static 关键字声明的变量,它们属于类而不是实例,所有该类的实例共享同一个类变量的值,类变量在类加载时被初始化,而且只初始化一次。
public class ExampleClass {static int classVar; // 类变量
}
④参数变量
参数是方法或构造函数声明中的变量,用于接收调用该方法或构造函数时传递的值,参数变量的作用域只限于方法内部。
public void exampleMethod(int parameterVar) {// 参数变量// ...
}
2、关键字
(1)48个关键字
(2)保留字
goto | const |
(3)特殊直接量
true | false | null |
3、八种基本数据类型
4、数据类型的转换
(1)自动转换
小的数据类型向大的数据类型转换,或者整数类型转换成浮点数类型,都是自动转换的。
byte->short->int->long
public class Main {public static void main(String[] args) {// 当文本光标位于高亮显示的文本处时按 Alt+Enter,// 可查看 IntelliJ IDEA 对于如何修正该问题的建议。System.out.println("Hello and welcome!");byte egg = 10;int x = egg;System.out.println(x);}
}
(2)强制转换
大的数据类型转换成小的数据类型则要强制转换。
long->int->short->byte
public class Main {public static void main(String[] args) {// 当文本光标位于高亮显示的文本处时按 Alt+Enter,// 可查看 IntelliJ IDEA 对于如何修正该问题的建议。System.out.println("Hello and welcome!");int egg = 10;byte x = (byte)egg;System.out.println(x);}
}
5、基本算数运算
加:+
减:-
乘:×
除法:/
求余(取模):%
注意:
JAVA默认的整数类型是INT
short a = 10;
short b = 20;
short c = (short)(a+b)
注意:
任何的数据类型和字符串使用+运算,+都表示连字符,最后得到的结果都是String类型。
注意:
自增自减
① i++ : 整个表达式结果是i,
i=10;
int j=i++; //先把i的值赋给j,i再+1
// j=10
②i-- :
i=10;
int j=i--; //先把i的值赋给j,i再-1
// j=10
③++i :
i=10;
int j=i++; //i先+1再把值赋给j
// j=11
④--i :
i=10;
int j=i--; //i先-1再把值赋给j
// j=9
public class Ari {public static void main(String[] args) {int i=10;int j=i++; //j=10 i=11int m=i+++j; //m=21 i=12 j=10int n=j--+m; //n=31,i=12,j=9,m=21System.out.println(i);System.out.println(j);System.out.println(m);System.out.println(n);}
}
6、关系运算符
< > == <= >= !=
import java.util.Scanner;
public class rel {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入两个数字比较:");int x=scanner.nextInt();int y=scanner.nextInt();boolean b=x>y;System.out.println(x+"是否大于"+y+":"+b);}
}
7、逻辑运算符
与运算 A&B :同时为真,则结果为真;
或运算 A|B :其中一个为真,则结果为真;
非运算 !A:A必须是boolean类型;
短路与运算 A&&B:和与运算的规则相同,但左侧表达式为False,则直接返回结果为False;如果左侧表达式为True,则右侧运算后返回结果;
短路或运算 a||B:和或运算的规则相同,但如果左侧表达式为True,则右侧不进行运算,直接返回True;如果左侧为False,则右侧计算后再返回结果;
异或运算 A^B:相同为False,不同为True。
注意:
如果要求右侧表达式,不管在什么情况下,都要计算到,则不能用短路。
8、按位运算符(效率高)
首先转换为二进制
按位与:
按位或 :
按位异或
按位取反:
9、移位运算符(效率高)
有符号位
左移位运算 y<<2:整体将二进制位向左侧移动移位,右侧补0,左移动1位,相当于乘2;(符号不影响)
右移位运算:使用>>符号表示,整体将二进制向右移位,左侧补0,右移动1位,相当于除以2。(符号不影响)
如果移动的位数超过所能表述的长度,则采用求余的方式计算;
如:如果移动32位时候,32%32=0;
如果移动33位的时候,33%32=1.
无符号位
无符号右移位运算:用>>>符号,不考虑正负数的问题;
正数移动和右移位相同。
负数移动不考虑最左侧负号的问题,意义不大。
10、赋值运算符
= :将右侧的值赋值给左侧变量。
+= :
-= :
……
<<= : 在变量自身上作左移运算 x<<=2
>>= : 在变量自身上作右移运算 x>>=2
>>>=: 在变量自身上做无符号右移运算 x>>>=2
……
11、条件运算符(三元运算符)
x?y:z
表达式1?表达式2:表达式3
x必须位boolean类型的值,如果x为True,则整个表达式取值为y,否则为z。
注意:
不允许 表达式1?表达式2:表达式3 单独存在。
int x=10;
int y=5;
int max=x>y?x:y;
12、优先级
13、从键盘接收数据
导入工具包
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入第一个数字");double x=scanner.nextDouble();System.out.println("请输入第二个数字");double y=scanner.nextDouble();System.out.println("输出结果");double z=x+y;System.out.println(z);}
}
14、字符类型
java虚拟机JVM,定义了boolean,但是没有专门的虚拟指令。
在JAVA语言中,对boolean值操作时替换成int类型数据,占4字节(32位),且只有一位是有效的。
布尔类型数组,转成byte数组,数据占1字节(8位)。
15、字符串和转义字符
String不是基本数据类型,是一种引用类型;
使用String来声明;
特殊的转义字符。
public class String_test {public static void main(String[] args){String x = "你好!\nJava!"; //String是一个类System.out.println(x);}}
16、字面量值和常量
字面量:表达的信息如字面所示,程序源码直接给出的一个值,如整数、浮点数和字符串。
常量:不可变的,字面值常量,定义的常量。
//使用final关键字来修饰,不可以重新被赋值
public class ConstTest {public static void main(String[] args) {final double pi=3.141526;}
}
17、编码风格
驼峰式编码风格
类名:
- 1个单词组成,首字母大写,后面全小写,如Student Teacher
- 2个或2个以上单词组成,每个单词首字母大写,其他小写,如TeacherName
变量名字:
- 1个单词组成,全小写 a b c name
- 2个或两个单词以上组成,第一个单词全部小写,后面每个单词首字母大写
- studentName studentFirstNanme
常量:
- 一个单词组成,全部大写,PI
- 2个或2个以上单词组成,全部大写,中间建议使用下划线分隔。USER_NAME
18、程序结构_分包概念