ArrayList LinkedList Vector
1.ArrayList:底层用数组实现的List
特点:查询效率高,增删效率低 轻量级 线程不安全
2.LinkedList:底层用双向循环链表 实现的List
特点:查询效率低,增删效率高
3.Vector: 底层用数组实现List接口的另一个类
特点:重量级,占据更多的系统开销 线程安全
Hashtable和HashMap不同之处。
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
3.hashMap允许空键值,而hashTable不允许。
String StringBuffer StringBuilder
1.String 字符串常量,是不可变类,任何对String的改变都会引发新的String对象的生成
2.StringBuffer 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区
3.StringBuilder 字符串变量(非线程安全)
sleep和wait的区别
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
2.sleep方法没有释放锁,不出让系统资源,而wait方法释放了锁,出让系统资源,使得其他线程可以使用同步控制块或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用.
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
final,finally,finalize的区别
1.final—修饰符(关键字)
final可以修饰类,这样的类不能被继承。
final可以修饰方法,这样的方法不能被重写。
final可以修饰变量,这样的变量的值不能被修改,是常量。
2.finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
3.finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
抽象类和接口
接口是特殊的抽象类,以下三个方面比较
1.属性:抽象类可以有普通成员变量,接口不行;
2.方法:抽象类有非抽象的方法和构造方法,并且修饰符可以是私有的,接口只能是抽象的方法,并且修饰符是public
3.关系:只能继承一个抽象类,但能实现多个接口。
equals和==的区别
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
堆和栈
1.堆是存放对象的,但是对象内的临时变量是存在栈内存中
2.栈是跟随线程的,有线程就有栈,堆是跟随JVM 的,有JVM 就有堆内存。
类变量和实例变量
1.静态变量是类变量,非静态变量是实例变量
2.静态变量存在方法区中,实例变量存在堆内存中。
OutOfMemoryError:java heap size”和”OutOfMemoryError: PermGenspace”
1.“heap size” 是说申请不到新的内存了,这个很常见,检查应用或调整堆内存大小。
2.“PermGen space”是因为永久存储区满了,这个也很常见,一般在热发布的环境中出现,是因为每次发布应用系统都不重启,久而久之永久存储区中的死对象太多导致新对象无法申请内存,一般重新启动一下即可。
&和&&
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式.
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作.
Error和Exception
Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
Exception:表示可恢复的例外,这是可捕捉到的。
Java提供了两类主要的异常:runtime exception和checked exception。
运行时异常与一般异常
异常表示程序运行过程中可能出现的非正常状态.
运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
局部变量和成员变量
成员变量:作为类的成员而存在,直接存在于类中。
局部变量:作为方法或语句块的成员而存在,存在于方法的参数列表和方法定义中。
1.成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及static修饰;两者都可以定义成final型
2.成员变量存储在堆,局部变量存储在栈
3.存在时间不同
4.成员变量有默认值
静态变量与实例变量,
成员变量又分成俩中类型:实例变量和静态变量。
1.语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
2.程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
字节流和字符流
1.字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
2.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
3.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
4.字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。
5.如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
6. InputStream是所有字节输入流的祖先,OutputStream是所有字节输出流的祖先
7. Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
应用服务器和web server
应用服务器处理业务逻辑,web服务器是用于处理HTML文件的。应用服务器通常会包含web服务器。
应用服务器:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
Overload 和Override 的区别。
方法的重写Overriding 和重载Overloading 是Java 多态性的不同表现。
重写Overriding 是父类与子类之间多态性的一种表现,重载Overloading 是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。
Comparator或Comparable
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。要实现compareTo方法。
Comparator要实现compare方法,可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。