学习Java做的笔记,主要以基础内容为主,附带网上收集的一些基础题,为自己复习使用。
Java的基本程序设计结构
JVM JDK JRE分别是什么
Java开发工具包(JDK)
Java开发工具包是Java环境的核心组件,并提供编译、调试和运行一个Java程序所需的所有工具,可执行文件和二进制文件。针对不同的操作系统,它有不同的安装包,而且包含了完整的JRE。
Java虚拟机(JVM)
JVM是Java编程语言的核心。当运行一个程序时,JVM负责将字节码转换为特定机器代码。JVM也是平台特定的,并提供核心的Java方法,例如内存管理、垃圾回收和安全机制等。JVM 是可定制化的,我们可以通过Java 选项(java options)定制它,比如配置JVM 内存的上下界。JVM之所以被称为虚拟的是因为它提供了一个不依赖于底层操作系统和机器硬件的接口。这种独立于硬件和操作系统的特性正是Java程序可以一次编写多处执行的原因。
Java运行时环境(JRE)
JRE是JVM的实施实现,它提供了运行Java程序的平台。JRE包含了JVM、Java二进制文件和其它成功执行程序的类文件。JRE不包含任何像Java编译器、调试器之类的开发工具。如果你只是想要执行Java程序,你只需安装JRE即可,没有安装JDK的必要。
三者关系图
区别与联系
- JDK是用于开发的而JRE是用于运行Java程序的。
- JDK和JRE都包含了JVM,从而使得我们可以运行Java程序。
- JVM是Java编程语言的核心并且具有平台独立性。
两种自增的区别
1 | i++:Fetch i,copy i,increment i,return copy; |
自动装箱与自动拆箱
Java是面向对象的语言,任何的事物都使用了一个类进行描述,基本类型数据也是一类事物,所以Java对于基本类型的数据也使用了对应的类进行描述,这种描述基本类型变量的类称作:包装类。
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
基本数据类型设计出对应的包装类型的好处: 可以让基本数据类型也使用上方法,让功能变得更加强大。
功能一: 可以把字符串转成数字
功能二: 可以把数字转成制定进制格式的字符串
自动装箱: 自动把基本数据类型转成引用数据类型数据
1 | list.add(1);//new Integer(数据) |
自动拆箱: 自动把引用数据类型数据转成基本数据类型
Integer要注意的点
Integer类内部维护了一个静态的数组,该数组内部存储了-128-127这些数据,当创建一个Integer对象的时候,如果数据是落入到-128-127这个范围之内,那么会直接从数组中获取,而不会创建新的Integer的对象。
字符型常量和字符串常量区别
- 形式上:字符常量是单引号引起的一个字符;字符串常量是双引号引起的若干字符。
- 含义上:字符常量相当于一个整型值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放的位置)
- 占内存大小: 字符常量只占2个字节(char在Java中占两个字节);字符串常量占若干个字节(至少一个字符结束标志)
String StringBuffer StringBuilder区别
可变性
String类使用final关键字字符数组保存字符串,所以String对象是不可变的。
StringBuilder(since1.5)和StringBuffer(since1.0)的构造方法都是调用父类构造方法都是调用匪类构造方法AbstractStringBuilder实现的。因此它的长度是可变的,初始为16,当容量不够时,长度 乘2 再加 2。
线程安全性
String中的对象是不可变的,可以理解为常量,线程安全。
AbstracStringBuilder是StringBuilder和StringBuffer的公共父类,定义了一些基本操作。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,线程安全。
StringBuilder并没有对方法进行加锁,线程不安全。
性能
每次对String类型进行改变的时候,都会生成一个新的String对象,然后引用新对象。
Stringbuffer每次都会对StringBuffer对象本身进行操作,而不是生成新对象,并改变对象引用。
由于StringBuilder不是线程安全的,因此它的性能要比StringBuffer高一些。
三者使用
- String:操作少量数据
- StringBuilder:单线程操作字符串缓冲区下操作大量数据
- StringBuffer:多线程操作字符产缓冲区下操作大量数据
==和equals
==:它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址,准确的说是堆内存地址)
equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
- 类没有覆盖equals()方法,则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
- 类覆盖了equals()方法,一般,我们都覆盖equals()方法来比较两个对象的成员变量值,若他们的值相等,则返回true。
键盘输入的两种方式
通过Scanner
1
2
3Scanner input new Scanner(System.in);
String str = input.nextLine();
input.close();通过BufferedReader(这个是io流中的内容)
1
2BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String str = input.readLine();
Java只有值传递
在《Java核心卷Ⅰ》中4.5节详细介绍了Java的值传递。
在Java中,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。1
2double percent = 10;
harry.raiseSalary(percent);
不用管在raiseSalary()方法中的具体实现,在方法调用完成之后,percent的值还是10;