Java基础查漏补缺


子曰:“ 温故而知新,可以为师矣!” ——《论语·为政篇》

Java概述篇

1 Java是解释性语言,针对字节码文件(.class)解释执行,这就大大提高了程序的可移植性,而非像C/C++一样需要编译成二进制文件执行。

2 jdk包含了JRE,javac.exe和java.exe以及Java其他所需工具,包括文档等。

3 浮点类型数据,float类型能保证的精度为6位,即有效数字范围是67位,而double类型是1516位。这是由于浮点数在计算机中的保存方式决定的。

4 Unicode字符集的范围是”\u0000 ~ \uffff”,\u表使用Unicode编码,后四位十六进制,占两字节,共包含65535个字符。

类与对象

1 switch语句所允许的类型有byte,short,int,long,char和String等引用类型。

2 访问修饰符:native修饰符,即本地修饰符,说明该方法是使用其他语言在程序外部编写的。

方法的重载/重写

重载:同一个类中相同方法名不同的参数列表(参数类型、顺序、个数不同)。

重写:子类重写父类中的方法,与重载都是多态的体现,但是子类重写的方法与父类的方法返回值类型相同,方法名相同,参数列表也相同(参数类型、顺序和个数)。

重写需要注意的是

1 重写方法的权限不能缩小原方法的权限,只能相同或扩大

2 不能重写被final、static修饰的方法

3 重写方法中不能抛出比父类更多的异常

方法参数传递方式

值传递:对于基本数据类型作参数时,使用值传递,即传递的是基本数据类型值的副本,与原数据具有不同的地址空间。即在方法中修改该参数时不影响原数据。

地址传递:对于实参引用传递,参数接收到的是地址,在方法中修改该引用后会影响原数据。

深入理解类及其成员

1 关于“句柄”的理解:在栈中定义的变量的值是一个堆内地址,该地址是数组或对象在堆中的存储位置,该堆内地址就是句柄。当超出栈中定义变量的作用域后,该栈中变量的空间会被释放(此刻堆中地址变成了不可达数组或对象),但是堆中的数组或对象仍存在,只会等待JVM自动回收机制回收。

继承、抽象类和接口以及多态

1 Object是顶级父类,它的equals方法实现

1
2
3
public boolean equals(Object object) {
return (this == object);
}

从这里来看所有对象调用equals方法比较都是地址,但是String类重写了该方法,变成了比较两个字符串的内容是否相同。因此String.equals()是比较内容是否相同,而 == 是比较地址是否相同。

2 接口中只能有常量、抽象方法和默认方法(java8新特性)三种成员。且不能用private,protected或default修饰。即只能public。

数组与集合

1 HashTable的键不能为空且具有唯一性,值可以为空。

异常和异常处理

一起看看Java异常

输入输出与文件管理

1 字节流的基本单位是字节,而字符流的单位是字符,一个字符是2~3(汉语)个字节。

2 InputStream/OutputStream更加适用处理图片,音视频等二进制文件。

3 “缓冲流”中的缓冲区是从内存分出的区域,是为了解决内存与磁盘的速度匹配问题。

4 序列化是指把需要持久化的对象用字节流的形式保存到外部文件中,反序列化就是拿出来恢复成对象。

数据库编程
JDBC

1 一般过程:加载驱动——>通过DriverManager创建链接对象——>通过该对象创建Statement接口引用——>通过该引用执行相应的sql语句——>(得到结果集ResultSet)——>释放资源

2 MySQL的URL写法:jdbc:mysql://主机名或IP:端口//数据库

多线程
流程:

修改t2.join方法被调用后应该进入等待队列,因为据join源码可知,join底层调用的是wait方法.

添加sleep、join、wait都会释放cpu资源,但是sleep和join不会释放锁,而wait会释放锁进入等待队列

1 多线程实现的两种方式,继承Thread和实现Runable接口,Thread实际上也实现了Runable接口。

2 匿名线程中run()方法只能调用一次

3 ReentrantLock可重入锁,遵循了有限等待原则

4 生产者消费者问题wait(),notify(),notifyAll().

网络编程