1.九种就本数据类型及他们的封装类
- boolean ---> Boolean--->1/8字节(1位)
- byte --->Byte--->1字节
- char--->Character --->2字节
- short ---> Short --->2字节
- int ---> Integer ---> 4字节
- float ---> Float ---> 4字节
- double --->Double ---> 8字节
- long ---> Long ---> 8字节
ps:整数默认是int,浮点数默认是double。
2.Switch能否用String 做参数
- java7以前不行,Java7以后可以,java7以后可放* int ,Enum,String*
3.equals 与== 的区别
- equals初始和==一样,是比较对象的地址,但是可以覆写equals,实现自己的比较逻辑。
4.Object 有哪些公共方法:
- equals : 比较对象是否相等
- clone() : 拷贝(浅拷贝)
- getClass():返回当前对象相关的Class对象
- wait(),notify(),notifyAll():配合线程使用,进行同步。
5.java四钟引用,强弱软虚,用到的场景
- 强引用,就是平常普通写的那种 * A a = new A() *;a为强引用,JVM不会回收有强引用的对象。
- 软引用 SoftReference: 在内存不足时,JVM会回收 软引用,可用作缓存图片的键,可有效避免OOM。
- 弱引用 WeakReference: 在下一次JVM垃圾回收时,会回收弱引用,WeakHashMap
+虚引用 PhantonReference: 形同虚设,必须和引用队列配合使用,JVM 在回收一个对象时,如果发现他有虚引用,会把他加入引用队列里。程序可以通过判断队列里是否有虚引用,来判断他是否将要被垃圾回收。
6.haseCode()的作用,与equals()有什么区别
用于鉴定两个对象是否相等
- Set:不予许重复,如果用equals()比较,set里面有1000个,就要比较1000次,但是如果用hashCode()算出对象的储存地址,如果该地址有对象,则再调用equals()比较是否相等,不相等再 存;否则就不存了。
- List通过equals()判断是否相等。
7.ArrayList,LinkedList,Vector区别
- ArrayList,底层基于数组,线程不安全。
- Vector ,底层基于数组,线程安全。
- LinkedList ,底层双向循环链表,线程不安全。
8.String ,StringBuilder,StringBuffer区别
- String 是不可变对象
- StringBuilder 底层是char数组,线程不安全
- StringBuffer 底层是char数组,线程安全
9. Map、Set、List、Queue、Stack的特点与用法。
- Map 键值对映射
- Set 无序,不可重复
- List ArrayList改查快,增删慢,LinkedList 增删快,查找慢。
- Queue 先进先出
- Stack 先进后出
10.HashMap和HashTable的区别。
- HashMap: 线程不安全,可以用null作为键或值。
- HashTable :线程安全,并且锁住整个表。
11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。(看源码)
- ConcurrentHashMap 线程安全,锁的粒度小
12.TreeMap、HashMap、LindedHashMap的区别。
- HaseMap
- TreeMap :能够把保存的记录根据键排序,可以自己指定比较器
- LinkedHashMap : 可以保存插入顺序,也可以指定根据使用次数排序。遍历比hashmap慢
13.Collection 包结构,与Collections的区别:
- Collection 是接口集合
- Collections类似一个工具类,服务于Collection框架;Collections.sort()--->Array.sort()--->mergeSort
14.Exception 与Error包结构
- Error 也不会编译检查
15.OOM,SOF
-
OOM: 图片过大, 压缩:
BitmapFactory.Options options = new BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,options);//此时返回bm为空options.inJustDecodeBounds = false; int w = options.outWidth;//图片的宽 int h = options.outHeight;//图片的高 //根据情况设置压缩率 options.inSampleSize = 2;//图片宽高都为原来的二分之一,即为原图大小的1/4 //加载压缩后的图片 Bitmap bitmap = BitmapFactory.decodeFile(srcPath,options);
OOM :Bitmap使用后未调用recycle()。
OOM:构造adapter没有使用缓存contentview。
OOM: 内存泄露,导致Activity不能被回收。
OOM:缓存过大,可使用SoftReference
SOF(栈溢出):递归,死循环。
16. Java面向对象的三个特征与含义。
- 封装 : 暴露接口,隐藏内部实现细节
- 继承 : 代码复用
- 多态: 更加灵活,父类引用子。
17.Override和Overload的含义去区别。
- Override :重写。方法特征相同。子类在覆盖父类带throws子句的方法时,子类的方法声明中的throws子句抛出的异常不能超出父类方法的异常范围。重写的返回值可以是父类及其子类。
ps:Java语言规范里,一个方法的特征仅包括方法的名字、参数的数目和种类,而不包括返回类型、参数的名字以及抛出的异常。
+Overload :重载, 函数名相同,参数列表不同;
18. Interface与abstract类的区别。
- Interface :不能有方法实现,方法默认修饰符 public abstract,变量默认修饰public static final。
- abstract 类:不能实例化,可以拥有abstract方法,其他的与普通的class没区别。
19. Static class 与non static class的区别。
- 静态内部类不需要持有外部类的引用,非静态内部类需要持有外部类的引用。
20. java多态的实现原理。
- 程序在运行期动态绑定,在运行期间,根据具体实例化的对象找到方法区中此对象的方法表,再找到方法表中的被调用方法,最后通过直接地址找到字节码所在的内存空间。
21.线程同步的方法:sychronized、lock、reentrantLock等。
22. 锁的等级:方法锁、对象锁、类锁。
23.实现多线程的两种方法:Thread与Runable。
24.写出生产者消费者模式。
25.ThreadLocal设计理念与作用。
- 防止任务在共享资源上产生冲突的第二种方法就是根除对变量的共享,于是有了线程本地化存储。
26.ThreadPool用法与优势。 ExecutorService exec = Executors.newCachedThreadPool();
- newCachedThreadPool():数量不固定,可复用,不够了就创建新的线程。
- newFixedThreadPool():固定线程数,任务超过线程数,会在队列中等待
- newSingleThreadExecutor:就一个线程的线城池
- newScheduledThreadPool:类似Timer。支持周期性工作。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
27.Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等
- ArrayBlockingQueue
- LinkedeBlockingQueue
- PriorityBlockingQueue
- CopyOnWriteArrayList
- DelayQueue
- CountDownLatch
- CyclicBarrier
28.wait()和sleep()的区别
- wait()来自Object,sleep()来自Thread
- wait()会让出锁,sleep()不会;即wait()会让出CPU,sleep()不会。
29. foreach与正常for循环效率对比。
- foreach 语法糖,内部是迭代器遍历,因此较for稍慢一点
30.java NIO:
NIO的目的在于提高速度,速度的提高来源于所使用的结构更接近于操作系统执行I/O的方式:* 通道和缓冲器 *
-
通道 是数据,唯一与通道打交道的是 缓冲器 ,我们通过 缓冲器 *从通道读取数据,或者向通道写入数据。
FileChannel fc = new FileOutputStream("data.txt").getChannel();
fc.write(ByteBuffer.wrap("some text".getBytes()));
fc.close();//read fc = new FileInputStream("data.text").getChannel(); ByteBuffer buff = ByteBuffer.allocate(BSIZE);//分配BSIZE大小的缓冲区 fc.read(buff); buff.flip();//告诉缓冲器,别人要来读取了,做好准备 //输出时必须编码 String encoding = System.getProperty("file.encoding); System.out.print(Charest.forName(encoding).decode(buff));
-
buffer.mark(); 配合buffer.reset();回到mark()位置 buffer.rewind();回到起始位置 buffer.asCharBuffer() ---> CharBuffer; //其他的int啥的类似
MappedByteBuffer = new RandomAccessFile("text.txt","rw").
getChannel().map(FileChannel.MapMode.READ_WRITE,0,length);
大文件映射。
31. 反射的作用与原理。
- 反射:在运行期间动态生成对象并调用方法,提供了动态性
- 写框架,写接口
32. 泛型常用特点,List<String>能否转为List<Object>
- 不能
33.解析XML的几种方式的原理与特点:DOM、SAX、PULL。
- DOM :先把xml文档都读到内存中,占内存
- SAX:基于事件驱动,顺序扫描,每个地方都有对应的函数处理
- PULL:与SAX类似,可以通过next()方法获取他的下一个解析事件,也可以调用getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。
34. Java与C++对比。
- Java:不用自己管理内存,跑在虚拟机上,平台无关。
- C++ : 速度快
35.java1.8新特性
-
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。
interfece IA{ default int a(){return 1;} }
引入Lambda表达式