Java基础篇
JDK与JRE的区别
JDK:Java开发工具包,也叫JavaSDK,包含JRE拥有的一切,还有编译器(javac),能够创建和编译Java程序
JRE:Java运行环境,主要包含一些Java类库以及JVM,能够运行Java程序
Java语言特点
“一次编译,到处运行”:并不是说Java语言跨平台,而是JVM可以安装在不同的操作系统上,本身JVM也存在JRE中,所以与其说Java语言跨平台,
倒不如说是JVM跨平台
Java语言有垃圾回收机制,不用开发人员手动回收,这是较其他语言一个明显的特征
equals与==的区别
对于基本数据类型来说,==
比较的是值。对于引用数据类型来说,==
比较的是对象的内存地址
因为 Java 只有值传递,所以,对于 ==
来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只
是引用类型变量存的值是对象的地址。
equals() 作用不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类。equals分为两种情况
1.equals未覆盖Object父类,统一使用父类的equals,比较的是两个对象的内存地址是否相等
public boolean equals(Object obj) {
return (this == obj);
}
2.equals覆盖Object父类,根据定义的equals实现
重载和重写的区别
同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理(方法名必须一致,参数不同,参数个数、顺序、类型等不同)
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写,子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变(方法签名,返回类型必须与父类一致),比如常见的对equals()重写
Java集合框架
Java集合框架核心分为两大类:Collection
和Map
;其中Collection是单列集合,存储一个一个的对象,并继承Iterable接口。Map是双列集合,存储一对一对的数据(K-V)键值对。不过我们重点更关注它们的具体实现类,因为在开发中十分常用。
- ArrayList
线程不安全,效率高;底层使用Object[]数组存储数据 - LinkeArrayList
对于频繁插入,删除操作,效率比ArrayList高,底层使用双向链表存储 - Vector
Vector作为List最老的实现类(Jdk1.0出现),线程安全,效率低;底层使用Object[]数组存储数据
IO流以及原理
IO:Input/Output(输入/输出),数据的传输。常见的IO技术有:文件数据读取写入,网络通讯,Jdk直接提供IO抽象类位于java.io包下,核心为以下4个:InputStream/OutputStream(字节流),Reader/Writer(字符流),Java程序中操作文件流主要有以下几个步骤:
1.实例化File对象
2.根据File对象创建文件流
3.文件流的读写
4.关闭流
- 字节流
通常适用于处理图片,视频(jpg,avi,.mp3)等文件的数据操作
/**
* 字节流图片读写
*/
private static void testInputAndOutput() {
FileInputStream fr=null;
FileOutputStream fw=null;
try {
//1.实例化File对象
File f1 = new File("E:\\code\\myjava\\java-collection\\aa.jpg");
File f2 = new File("E:\\code\\myjava\\java-collection\\bb.jpg");
//2.根据File对象创建文件流
fr = new FileInputStream(f1);
fw = new FileOutputStream(f2);
//3.文件流的读写
int len;
byte[] buf = new byte[1024];
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
try {
fr.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 字符流
通常适用于处理文本文件(.txt,.java,cpp)的数据读写
/**
* 字符流文件读写
*/
private static void testReaderAndWriter() {
FileReader fr=null;
FileWriter fw=null;
try {
//1.实例化File对象
File f1 = new File("E:\\code\\myjava\\java-collection\\a.txt");
File f2 = new File("E:\\code\\myjava\\java-collection\\a1.txt");
//2.根据File对象创建文件流
fr = new FileReader(f1);
fw = new FileWriter(f2, true);
//3.文件流的读写
int len;
char[] buf = new char[10];
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
try {
fr.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲流的使用
本质也跟上面的字符流/字节流,提供文件的读写。主要是"包裹"在原有流上,能够提高读写效率,内部多维护了一个缓冲区。实际开发中推荐优先使用缓冲流,包括有:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。以BufferedInputStream为例,默认的缓冲区大小为8192字节:
//构造BufferedInputStream
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
//根据默认的缓冲区大小进行实例化
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
缓冲流实现文件的拷贝
/**
* 缓冲字节流
*/
public static void testBufferedInOut(){
FileInputStream fr=null;
FileOutputStream fw=null;
BufferedInputStream bi=null;
BufferedOutputStream bo=null;
try {
//1.实例化File对象
File f1 = new File("E:\\code\\myjava\\java-collection\\aa.jpg");
File f2 = new File("E:\\code\\myjava\\java-collection\\cc.jpg");
//2.根据File对象创建文件流
fr = new FileInputStream(f1);
fw = new FileOutputStream(f2);
bi=new BufferedInputStream(fr);
bo=new BufferedOutputStream(fw);
//3.文件流的读写
int len;
byte[] buf = new byte[1024];
while ((len = bi.read(buf)) != -1) {
bo.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流,使用缓冲流,关闭外层流即可
try {
bi.close();
bo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
更新中…