java中的I/O流分类?
答:按照流的流向来分,可以分为输入流和输出流。java的输入流主要由InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类。
字节流和字符流的区别,区别在于字节流和字符流所操作的数据单元不同:字节流操作的最小数据单元是8位的字节,而字符流操作的最小数据单元是16位的字符,字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
按照流的角色分,可以分为节点流和处理流。节点流是一种低级流,处理流是一种高级流,也被称为包装流。
JVM类加载机制?
要经过三步:装载(Load),链接(Link),初始化(Initializ)。
JDBC编程步骤是什么?
答:1 加载数据库驱动。通常我们使用Class类的forName静态方法来加载驱动
class.forName的作用
答:调用该方法返回一个以字符串指定类名的类的对象
2 通过DriverManager获取数据库连接
3 通过Connection对象创建Statement对象,Connection创建Statement的方法有三个:
createStatement()
prepareStatement(String sql)
prepareCall(String sql)
4 使用Statement执行SQL语句
5 操作结果集
6 回收数据库资源,包括关闭ResultSet,Statement,Connection
ArrayList和Vector的区别?
答: ArrayList是线程不安全的,当多条线程访问同一个ArrayList集合时,如果有超过一条线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。但Vector集合则是线程安全的,无须程序保证该集合的同步性。因为Vector是线程安全的,所以Vector的性能比ArrayList的性能要低。实际上,即使需要保证List集合线程安全,同样不推荐使用Vector实现类,Collections工具类可以将一个ArrayList变成线程安全的。
==和equals的区别
答:当使用==来判断两个变量是否相等时,如果2个变量是基本类型的变量,且都是数值型,则只要两个变量的值相等,使用==判断就将返回true,但对于两个引用类型的变量,必须它们指向同一个对象时,==判断才会返回true。==不可比较类型上没有父子关系的两个对象。
String的equals()方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过equals()比较将返回true
java 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。同步有两种实现方法,一个是在被调用的方法前加上Synchronized关键字,一个是wait()和notify()。
面向对象的基本特征:
答:三个基本特征:封装(Encapsulation),继承(Inheritance),多态(polymorphism)
string stringbuffer stringbulider的区别
答:String是固定长度的字符串,如果要发生变化必须重新生成新的实例;
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做,在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。两者的方法基本相同。
boolean Boolean的区别
答:boolean是基本的数据类型,Boolean是封装的数据类型,拥有对象的一些特性。
char型变量中能不能存储一个中文汉字?
答:可以。JAVA默认的编码是UNICODE.不是ASCII的char
现有程序可供测试:
但若理解成
s='me' 中放一个汉字,就不可以了,因为中文占16个字节,满了。
public class Test {
public static void main(String args[]) {
char s ='我';
System.out.print(s);
}
}
hashMap和hashTable的区别
答:1.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。2.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 3.值:只有HashMap可以让你将空值作为一个表的条目的key或value。
Error Exception RuntimeException区别
答:Error表示非常严重的、不可预期的异常情况,通常应用程序无需捕获并处理。Exception通常是一种设计或实现的异常,它是编译器可以“感知”的异常,所以程序被要求必须捕获并处理这些异常。RuntimeException与Error一样,也是无需捕获的,且就算在方法上throws了RuntimeException,调用该方法的语句也无需catch这些异常。Error和Exception都继承自Throwable类。所有的Checked Exception 均从java.lang.Exception 继承而来,而Runtime Exception 则继承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.Exception)。
Thread.sleep()和Object.wait()两者的共同点和不同点
答:其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题. 共同点:
他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点:
Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。