byte
short
int
long
char
float
double
boolean
####面试
- JDK和JRE
JDK:java开发工具包,包含java运行时环境(jre),编译源码的编译器javac,java程序调试工具(jcon+sole)JRE:java运行时环境,包含java虚拟机和基础类库 ==和equals的区别
==:是比较运算符,在比较基础数据类型时,比较的是二者的值,相同时返回true;在比较对象时是比较的地址
equals是object基础根类自带的方法,在比较引用类型时如果不重写,与==的作用一样,也是比较的地址
equals返回true时,hashcode()也为true,但如果hashcode返回的是true,equals返回的不一定是true final:final是java中的一个保留关键字,可以声明成员变量、方法、类以及本地变量
- 修饰基本数据类型变量的时候,必须赋予初值而且不能改变;修饰引用变量时,该引用变量不能再指向其他对象final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。譬如String, Interger以及其他包装类。
被final修饰的类,并且它的成员方法都默认为final方法,字符串一旦创建就不能再修改String实例的值是通过字符数组实现字符串存储的使用“+”连接符时,JVM会隐式创建StringBuilder对象,这种方式在大部分情况下并不会造成效率的损失,不过在进行大量循环拼接字符串时则需要注意。 String、StringBuffer与StringBuilder之间区别
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量StringBuilder:可变类,速度更快,线程不安全 抽象类和接口
- 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,和普通类一样,同样可以拥有成员变量和普通的成员方法,抽象类和普通类的区别如下:
抽象方法的访问修饰符必须为public和protected。抽象类不能被实例化。如果一个类继承于抽象类,则子类必须实现父类的抽象方法,如果子类没有实现父类的抽象方法,则子类必须也是一个抽象类。 抽象类和接口区别如下:
一个类只能继承一个抽象类,而一个类可以实现多个接口。抽象类可以有构造方法,接口中不能有构造方法。抽象类中可以有成员变量,接口中没有成员变量。(被final修饰变成了常量)抽象类中可以有普通方法,接口中所有方法都必须是抽象的。抽象类中抽象方法的访问类型可以是public,protected,但接口中抽象方法的访问类型只能是public,并且默认为public abstract(省略则自动默认补全)。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
Iterable是一个超级接口,被Collection所继承。它只有一个方法: Iterator iterator() //即返回一个迭代器Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素 java容器
- list
List是有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。用户插入的顺序或者指定的位置就是元素插入的位置。它与Set不同,List允许插入重复的值。List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法(如下)来获取从列表中指定位置开始的列表迭代器。子类
ArrayList:底层是数组,它封装了一个动态的、增长的、允许再分配的Object[ ]数组linkedList:linkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢;另外,它还实现了Deque接口,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 set
无序性,确定性,单一性。所以可以很好的理解,Set是无序、不可重复的。同时,如果有多个null,则不满足单一性了,所以Set只能有一个null。set的子类
HashSet Map不是collection的子接口或者实现类。Map是一个接口
Map用于保存具有“映射关系”的数据。每个Entry都持有键-值两个对象。其中,Value可能重复,但是Key不允许重复(和Set类似)Map可以有多个Value为null,但是只能有一个Key为nullhashmap:treemap:TreeMap是一个红黑树结构,每个键值对都作为红黑树的一个节点。TreeMap存储键值对时,需要根据key对节点进行排序,TreeMap可以保证所有的key-value对处于有序状态。 同时,TreeMap也有两种排序方式:自然排序、定制排序(类似于上面List的重写CompareTo()方法)HashTable:键值对不允许为空
并发:是指多个线程任务在同一个CPU上快速地轮换执行,由于切换的速度非常快,给人的感觉就是这些线程任务是在同时进行的,但其实并发只是一种逻辑上的同时进行;并行:是指多个线程任务在不同CPU上同时进行,是真正意义上的同时执行。线程和进程:
进程:进程是具有一定功能的程序在一个数据结合上的运行过程,它是系统进行资源分配和调度管理的一个可并发执行的基本单位;每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位) 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) :守护线程最典型的应用就是 GC (垃圾回收器)java创建线程的方式
继承thread类实现runnable接口实现callable接口(利用futuretask执行任务) 死锁:
多个并发进程或线程因争夺系统资源而产生相互等待的现象当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。 死锁产生的四个必要条件
互斥: 某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。占有且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。不可抢占: 别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。循环等待: 存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。



