JAVA基础知识的总结
1.JAVA的特点:
- 简单易学
- 面向对象(继承,封装,多态)
- 可靠性
- 安全性
- 编译与解释并存
- 支持多线程
- 支持网络编程并且很方便
2,什么是JDK,JVM,JRE
JVM 是java虚拟机,JVM针对不同系统有特定的实现,目的是使用相同;的字节码,它们都会给出相同的结果。
字节码是什么?
在Java中,JVM可以理解的代码就是字节码,(也就是扩展名为.class的文件)
它不面向任何特定的,处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释性语言执行效率低的问题,同时又保留了解释性语言客一直的特点。所以Java程序在运行时比较搞笑,而且,由于字节码并不针对一种特定的机器,因此,Java程序无需重新编译便可以在多种不同操作系统的计算机上运行。
JDK 是Java Development Kit 的缩写,它是功能齐全的Java SDK,它拥有JRE所拥有的一切,还有编译器javac和工具Java多次和jdb,它能够创建和编译程序。
JRE是Java运行时环境。他是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),java类库,java命令和其他的一些基础构件
Open JDK 和 oracle JDK 的区别,一个开源,一个是开源版本的商业版,后者性能更好。
3.Java 和 c++ 的区别
- 都是面向对象的语言
- Java不提供指针来直接访问内存,程序内存更加安全
- Java的类是单继承的,c++支持多继承,java中接口是可以多继承的
- Java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放不用的内存
- 在C语言中,字符串或字符数组最后都会有一个额外的字符‘ ’来表示结束。但是Java语言没有结束符这一概念
4.Java中常见的关键字
访问控制 | private | protected | public | ||||
---|---|---|---|---|---|---|---|
类,方法和变量修饰符 | abstract | class | extends | final | implements | interface | native |
new | static | stricfp | synchronized | transient | volatile | ||
程序控制 | break | continue | return | do | while | if | else |
for | instanceof | switch | case | default | |||
错误处理 | try | catch | throw | throws | finally | ||
包相关 | import | package | |||||
基本类型 | boolean | byte | char | double | float | int | long |
short | null | true | false | ||||
变量引用 | super | this | void | ||||
保留字 | goto | const |
5.continue、break、return的区别
continue:指跳出当前的这一次循环,继续下一次循环
break: 指跳出整个循环,继续执行循环下面的语句
return一般有两种用法:
return
: 直接使用retrun结束方法执行,用于没有返回值函数的的方法return value
: return 一个特定值,用于有返回值函数的方法
6.Java泛型是什么?什么是类型擦除?介绍一下常用的通配符
Java泛型(generics)是在JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制雨荨程序员在编译时监测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说
类型擦除
。List<Integer> list = new ArrayList<>();
list.add(12);
//这里直接添加会报错
list.add("a");
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//但是通过反射添加,是可以的
add.invoke(list, "kl");System.out.println(list)
泛型一般有三种使用方式:泛型类,泛型接口,泛型方法。
1.泛型类:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{
private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; }
}
如何实例化泛型类:
Generic<Integer> genericInteger = new Generic<Integer>(123456);
2.泛型接口
public interface Generator<T> { public T method(); }
实现泛型接口:
class GeneratorImpl<T> implements Generator<String>{ @Override public String method() { return "hello"; } }
3.泛型方法:
public static < E > void printArray( E[] inputArray ) { for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); }
使用泛型方法:
// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray( intArray ); printArray( stringArray );
常见的通配符:
T,E,K,V,?
- ? 表示不确定饿Java类型
- T 表示具体的一个java类型
- K V 分别代表java键值中的Key Value
- E 代表 Element
7.==和equals的区别
基本数据类型==比较的是值,引用数据类型==比较的是内存地址
,因为Java只有值传递,所以==的实质最终还是比较值,只是引用类型变量存的是对象的地址。- equals方法用于判断两个对象是否相等,不能用于比较基本数据类型变量。
String类中的equals方法是被重写过的,因为Object类的equals方法中是比较对象的内存地址,而String的equals方法比较的对象的值
8.hashcode()和equals()的区别
hashcode()
的作用是获取哈希码,也称为散列码,它实际上返回的是一个int整数
,这个哈希码的作用是确定该对象在哈希表中的索引位置。hashcode()定义在JDK的Object类中,这就意味着Java中的任何类都包含有hashcode()函数。Object的hashcode方法是本地方法,也就是用c语言或者c++实现的,该方法通常用来将对象的内存地址转换为整数之后返回为什么重写equals时候必须重写hashcode方法?
如果两个对象相等,则hashcode一定是相同的。此时equals方法结果为true。
但是,如果两个对象有相同的hashcode值,他们也不一定相同
9.基本数据类型
Java中一共有8中基本数据类型
- 6中数字类型:byte、short、int、long、float、double
- 1种字符类型:char
- 1种布尔型:boolean
- 对应的包装类分别为: Byte、Short、Integer、Float、Double、Character、Boolean
10.自动拆箱和装箱
装箱是通过调用包装类的valueOf方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。
Integer i = new Integer(xxx) 和 Integer i = xxx 这两种方式的区别:
第一种方式不会触发自动装箱机制,而第二种会触发;
在执行效率和资源占用上的区别。第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况
11.Java为什么只有值传递?
按值调用表示方法接收的是调用者提供的值,而引用调用表示方法接收的是调用者提供的变量地址。一个方法可以传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java程序设计语言总是采用按值调用,也就是说方法得到饿是所有参数值的一个拷贝,也就是说方法不能修改传递给它的任何参数变量的内容。
java中方法参数的使用情况
一个方法不能修改一个基本数据类型的参数
一个方法可以改变一个对象参数的状态
一个方法不能让对象参数引用一个新的对象
12.深拷贝和浅拷贝
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝,
- 深拷贝: 对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
13.多线程
简述线程、程序、进程的基本概念。以及他们之间的关系是什么?
线程
与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
程序
是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
进程
是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令的执行着,同时,每个进程还占有某些系统资源。换句话说,当程序在执行时,将会被操作系统载入内存中。线程市金城划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一个进程中的线程极可能会互相影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时只需一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
14.IO操作为什么要分字节流和字符流呢?
字符流是由Java虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以IO刘就提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。
15.BIO、NIO、AIO有什么区别
- BIO同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲以作品系统处理不了的连接或请求,但是,当面对十万甚至是百万级别的连接的时候,这种方式便无能为力
- NIO:同步非阻塞的I/O模型,在java1.4中引入了NIO框架,对于java.nio包,提供了Channel,Selector,Buffer等抽象,NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的基于通道的IO操作方法。NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载,低并发的应用程序,可以使用同步阻塞IO来提升开发速率和更好的维护性;对于高负载、高并发的应用,应使用NIO的非阻塞模式来开发。
- AIO也就是NIO2。在java 7中引入了NIO的改进版NIO 2,它是异步非阻塞的IO模型。异步IO是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会阻塞在哪里,当后台处理完成,操作系统会通知项羽的线程进行后续的操作。AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好是,得到通知,接着就由这个线程自进行IO操作,IO操作本身是同步的。(AIO还没有广泛使用)