1、 Java开发中常遇到的BUG和问题,注意事项
空指针,初始化问题,类型转换,内存溢出(数组),编码格式(UTF-8),数组越界
2、 抽象类、接口类区别
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
在其他方面,抽象类和普通的类并没有区别。
接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public staticfinal变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
3、 Java定义一个常量
定义常量,java规范: 常量所有字母大写,单词与单词之间用下划线分开。常量必须在定义的时候就初始化。例如: private final int MY_VALUES = 88888;
4、 单线程和多线程的区别
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。简单地说,就是说可以有多个任务同时进行
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行
使用多线程访问公共的资源时,容易引发线程安全性问题,因此针对这种需要使用线程同步机制来保护公共的资源。 单线程较多线程来说,就不会出现上诉问题,系统稳定、扩展性极强、软件丰富。多用于点对点的服务
5、list存储方式
Java中的集合对象就是一个容器,用来存放Java类的对象。我们知道,一种容器,例如水桶的水很方便倒入和取出。例如柜子里的衣服,有序摆放,更方便查找。Java的集合类也一样,不同的集合类和各自的作用!
在Java.util包中提供了集合类,集合类又叫容器。在之前我们学习过数组,集合类不同于数组,数组长度固定,集合类长度可变,数组用来存放基本类型,集合用来存放对象的引用。
常用的集合类有List集合,Set集合,Map集合。List和Set类继承了Collection接口。各自的接口有不同的实现类实现不同的作用。如图可以清楚的看出来各自的继承和实现关系。
关于List集合
List中的元素是运行重复的,各元素间排列顺序就是对象的插入顺序。类似于数组,我们可以通过索引来访问元素。
List接口
List接口继承了Collection接口,所以包含了Collection中所有方法。List当然也有属于自己的一些常用方法。
List接口的实现类常用的是ArrayList和LinkedList。我们知道,父类的引用可以指向任何子类的对象,所以,我们可以使用List li = new ArrayList();来创建集合类对象。
关于集合的遍历
第一种方法可以通过For循环来遍历元素。
for(int i;i<=li.size();i++){
System.out.println(list.get(i));
}
第二种遍历方法可以使用迭代器便利元素
Iterator it = li.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
List集合类的add(int index,object obj)方法可以将元素添加到集合中,set(intindex,object obj)方法可以修改集合中的元素。set方法的索引位置依然是从0开始。
6、private 、public 、protect、default区别
下表为Java访问控制符的含义和使用情况
| 类内部 | 本包 | 子类 | 外部包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
7、arrylist、hashMap哪个存储快,为什么
LinkedList善于频繁的增,删操作
ArrayList善于快速查找
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
1、ArrayList 有序集合 底层为数组 按下标查找快 增删慢 按元素查找、增删都慢
2、LinkedList 有序集合 底层为链表 按下标查找慢 增删快 按元素查找慢 增删比arrayList快
3、HashMap 无序哈希表 底层哈希表 按下标查找一般比LinkedList快 增删快跟主体大小有关按元素查找快 增删快跟主体大小有关,越大越慢
要是HashMap改成HashSet就更合适些了,Map和List是不同的数据结构,放在一起有点不合适。
8、override,overlord区别
override用于父子类,overlord用于本身的类
区别点 | 重载方法 | 重写方法 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
9、说出一些常用的类,包,接口,请各举5个
常用的类:
Object
Array 提供了动态创建和访问Java数组的方法
BufferedReader从字符输入流中读取文本
BufferedWriter
BufferedInputStream字节流
Calendar 提供操作日历字段的方法
Date
File
Exception
FileReader、FileWriter
HashSet 、HashMap
InputStream、OutputStream
Integer、Float、String
List、Map、Set
Pattern 正则表达式的编译表示形式
Random
Request、Response
System
Thread
常用的包:
java.io 流
java.lang
java.util 框架
java.sql
javax.swing
java.net
常用的接口:
Collection、List、Set、Map
Comparable
Runnable
java.io.Serializable
Session、HttpSession
Servlet、HttpServletRequest、HttpServletResponse,
10、文件流有哪些实现方式
1.其实文件流的读写没有太大难度,但是其中几个概念相似度太高,容易混淆,所以先解释下几个类。
InputStream 和 OutStream 字节流
InputStreamReader 和 OutStreamWriter 字符流(桥梁)
BufferedReader 和 BufferedWriter 把字节或者字符放入缓冲区,提高读写速度
2.要先用字节流来读取或者写入文件,因为可以避免中文乱码。
3.面对存入文件的数据类型不同选取不同的流方式:字节流,字符流,对象流。
4.在读写的时候,要把流放入缓冲区Buffer里,这样可以加快读写速度。
5.可以总结出一般思路:FileInputStream(字节流)--->InputStreamWriter(字符流)--->BufferedWriter(缓冲池).
6.BufferedWriter bw = new BufferedWriter(new InputStreamWriter(newFileInputStream(file, true))); 可以直接用一个语句来表达三者之间的关系。
11、如何实现多线程
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并 且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
12、oracle的增删该查操作