一. J2EE基础.
- 九种基本数据类型的大小,以及他们的封装类。
基本类型 | 大小(字节) | 默认值 | 封装类 |
---|---|---|---|
byte | 1 | 0 | Byte |
short | 2 | 0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0L | Long |
float | 4 | 0.0f | Float |
double | 8 | 0.0d | Double |
boolean | 1 | false | Boolean |
char | 2 | null | Character |
void | Void |
- equals与==的区别。
1 | 1. ==指引用是否相同,equals()指的是值是否相同 |
- Switch能否用string做参数?
在java1.7之前,可以放int,byte,char。因为它们可以自动类型转换为int。java1.7可以使用string类型。
- Object有哪些公用方法
1 | 1. clone |
- Java的四种引用,强弱软虚,用到的场景。
1 | 1. 强引用 |
- Hashcode的作用。
1 | 1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的; |
- ArrayList、LinkedList、Vector的区别。
1
2
3
4
5
6
7
8
9
10一、同步性
ArrayList,LinkedList是不同步的,而Vestor是的。
二、数据增长
Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。
三、检索、插入、删除对象的效率
但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。
所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList。
- String、StringBuffer与StringBuilder的区别。
1 | String 字符串常量,不可变的对象 |
- Map、Set、List、Queue、Stack的特点与用法。
1 | Collection是对象集合,Collection 有两个子接口List和Set |
- HashMap和HashTable的区别。
1 | Hashtable的方法是同步的,HashMap则是非同步的,所以在多线程场合要手动同步HashMap,这个区别就像Vector和ArrayList一样。 |
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁的几率,提高并发效率。
HashMap的底层主要是基于数组和链表来实现的。HashMap底层是通过链表来解决hash冲突的。HashMap底层就是一个数组结构,数组中存放的是一个Entry对象。HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。
Collection包结构,与Collections的区别。
Collection是集合类的上级接口,子接口主要有Set 和List、Map。
Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。try catch finally,try里有return,finally还执行么?
会。一般先执行finally,在return。
ava面向对象的三个特征与含义。
面向对象的三个基本特征是:封装、继承、多态。
- 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作
- 继承,它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
- 允许将子类类型的指针赋值给父类类型的指针。Override和Overload
- Override和Overload的含义去区别。
二者完全是两个概念。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
- Interface与abstract类的区别。
- 抽象类不能被实例化,只能被用作子类的超类,接口是抽象方法的集合
- 单继承,实现多接口
- Static class 与non static class的区别。
- 静态内部类的作用:只是为了降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖与外在的类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。
- 非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法,对外部类对象有引用
- 实现多线程的两种方法。
继承Thread类。 实现Runable接口
后者优点:
- 适合多个相同代码的线程去处理同一个资源的情况
- 可以避免由于java的单继承特性带来的局限
- 增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
- implement Runnable是面向接口,扩展性等方面比extends Thread好。
- 线程同步的方法。
sychronized,lock,reentrantLock,volatile
- sychronized同步方法,代码块(同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。)
- volatile关键字为域变量的访问提供了一种免锁机制,使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
- 重入锁reentrantLock,要注意及时释放锁
- 使用局部变量实现线程同步ThreadLocal
锁的等级:方法锁(对象锁)、类锁。
写出生产者消费者模式。(理解多线程,和同步的使用)
ThreadLocal的设计理念与作用。
Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。
Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等。
阻塞队列 BlockingQueue。
- wait()和sleep()的区别。
- sleep()睡眠时,保持对象锁,仍然占有该锁;
- 而wait()睡眠时,释放对象锁。
- sleep是Thread类的方法,wait是Object类中定义的方法
- 两者的共同点:都会阻塞当前线程。