您的位置:首页 > 编程语言 > Java开发

Java基础知识一

2016-07-18 18:04 267 查看
1 Java中的8种基本类型、长度和封装类型

System.out.println("Byte: " + Byte.SIZE/8);                 // 1
System.out.println("Character: " + Character.SIZE/8);       // 2
System.out.println("Short: " + Short.SIZE/8);               // 2
System.out.println("Integer: " + Integer.SIZE/8);           // 4
System.out.println("Float: " + Float.SIZE/8);               // 4
System.out.println("Long: " + Long.SIZE/8);                 // 8
System.out.println("Double: " + Double.SIZE/8);             // 8
System.out.println("Boolean: " + Boolean.toString(false));  //单独使用时4个字节,在数组中1个字节
2 谈一谈“==”和“equals”的区别

“==”用来比较两个基本类型的数值是否相等或者是两个对象是否是同一个对象,也就是在内存中的首地址是否一样。equals用于比较两个独立对象的内容是否相同。

注意:当equals()方法被重写时,通常有必要重写hashCode()方法,以维护hashCode()方法的常规协定,该协定规定相等对象必须有相等的哈希码,如下:

1)当obj1.equals(obj2)==true,obj1.hashCode()==obj2.hashCode()必须为true;

2) 当obj1.hashCode()==obj2.hashCode()为false时,obj1.equals(obj2)必须为false。

如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。

hashcode适用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆。

3 Java中4种引用及其应用场景

从JDK1.2开始将对象的引用分成四种级别:强引用、软引用、弱引用和虚引用。

强引用:通常new的对象返回的是强引用,垃圾回收器绝不会回收它,当内存空间不足时,JVM宁可抛出OutOfMemoryError使程序异常中止,也不会回收强引用。

软引用:如果内存空间足够,垃圾回收器不会回收它,如果内存不足,就会回收它。如果软引用所引用的对象被垃圾回收,JVM就会把这个软引用加入到与之关联的引用队列中。可用于图片缓存中,内存不足时不再使用BitMap。

弱引用:弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。也可用于图片缓存。

虚引用:就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚 引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

4 Object中定义了哪些方法

getClass():返回一个对象的运行时类;

hashCode():返回一个对象的哈希码值;

equals():判断两个对象的内容是否相等;

clone():创建并返回此对象的一个副本;

toString():返回一个对象的字符串表示;

notify():唤醒在此对象监视器上的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在实现做出决定时进行。

notifyAll():唤醒在此对象监视器上的所有线程。

finalize():当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法,子类重写finalize()方法,以配置系统资源或执行其他清除。

wait():导致当前线程等待,直到其它线程调用此对象的notify()或notifyAll()唤醒它,或者超出指定的时间量。

5 ArrayList、LinkedList、Vector的区别

ArrayList:内部采用数组进行存储,支持高效随机访问,允许每个元素为null,没有同步,支持动态调整大小;

LinkedList:内部采用链表来存储元素,支持快速插入/删除元素,允许null元素,没有同步,不支持高效率随机访问;

Vector:可以看作线程安全版的ArrayList,使用时必须捕获异常。

6 String、StringBuilder、StringBuffer的区别

String :不可变的字符序列,若要向其中添加新字符,需要创建新的String对象;

StringBuilder:可变字符序列,使用append()、insert()等添加新字符(不用创建新对象);

StringBuffer:可看作线程安全的StringBuilder。

7 Map、Set、List、Queue、Stack的特点和用法

Map<K,V>:Java中存储键值对的数据类型都实现了这个接口,表示“映射表”,支持两个核心操作get(Object Key)和put(K k,V v),分别用来获取键对应的值,以及向映射表中插入键值对。

Set<E>:实现了这个接口的集合类型不允许出现重复的元素,代表数学意义上的“集合”,它所支持的核心操作有add(E e)和remove(Object o)和contains(Object o) 分别用于添加元素、删除元素以及判断元素是否在集合中。

List<E>:Java集合框架中的列表类型都实现了这个接口,表示一种有序序列,支持get(index)\add(E e)等操作。

Queue<E>:Java集合框架中的队列接口,代表了先进先出队列,支持add(E e)、remove()等操作。

Stack<E>:Java集合框架中表示堆栈的数据类型,堆栈是一种后进先出的数据结构,支持push(E e)、pop(),分别表示入栈、出栈。

8 HashMap和HashTable的区别

1)HashTable是同步的,HashMap不是,因此HashMap效率比HashTable高。

2)HashMap中允许null键和null值,而hashTable中不允许。

3)HashMap继承自AbstractMap,而HashTable继承自Dictionary。抽象Map是Map的骨干,其内部已经完成了Map的大部分工作,子类只需要实现它的少量方法即可具有Map的多项功能,而字典类内部都是抽象方法,子类必须一一实现,且字典类已过时。

4)两者检测是否含有key值时,hash算法不一致,HashMap内部需要将key的hash码重新计算一遍再检测,而HashTable则直接利用key值的hash码进行检测。

5)两者初始化容量大小不一致,HashMap内部为16*0.75,HashTable为11*0.75,扩充方式是old*2+1。

9 HashTable和CurrentHashMap的比较

CurrentHashMap是线程安全的HashMap的实现,同样是线程安全的类,它与HashTable在同步方面有什么区别呢?

synchronized关键字加锁的原理,其实是对对象加锁,不论你是在方法前加synchronized还是语句块前加,锁住的都是对象整体,但是ConcurrentHashMap的同步机制和这个不同,它不是加synchronized关键字,而是基于lock操作的,这样的目的是保证同步的时候,锁住的不是整个对象。事实上,ConcurrentHashMap可以满足concurrentLevel个线程并发无阻塞的操作集合对象。

ConcurrentHashMap基于concurrentLevel划分出了多个Segment来对key-value进行存储,从而避免每次锁定整个数组,在默认的情况下,允许16个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。

在多线程的环境中,相对于HashTable,ConcurrentHashMap会带来很大的性能提升!

部分内容转自 http://www.cnblogs.com/absfree/p/5568849.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: