一、java基础
1、java中操作字符串有哪些?它们之间的区别
操作字符串有:String、Stringbufefr、Stringbuilder
String和Stringbuffer、Stringbuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer和StringBuild可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。
StringBuffer和StringBuilder最大的区别在于:
StringBuffer是线程安全的,而StringBuilder是非线程安全的,
但是StringBuilder的性能却高于Stringbuffer,
所以单线程环境下推荐使用StringBuilder,
多线程环境下推荐使用StringBuffer。
2、String str= "i"与String str = new String("i")一样么
不一样,因为内存的分配方式不同,
String str = "i" 的方式,java虚拟机会将其分配到常量池中;
而String str = new String("i")则会被分到堆内存中。
3、如何将字符串反转?
使用StringBuilder或者StringBuffer的reverse()方法:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
4、String类的常用方法都有哪些?
- indexOf():返回指定字符的索引
- charAt():返回指定索引的字符
- replace():字符串替换
- trim():去除字符串两端空白
- split():分割字符串,返回一个分割后的字符串数组
- getBytes():返回字符串的byte类型数组
- length():返回字符串的长度
- toLowerCase():将字符串转换成小写字母
- toUpperCase:将字符串转换成大写字母
- substring():截取字符串
- equals():字符串比较
5、抽象类必须要有抽象方法么?
抽象类不一定非要有抽象方法
6、普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法
- 普通类可以直接实例化,抽象类不能直接实例化
7、抽象类不能使用final修饰符
因为被final修饰的类不能被其他类继承,而定义抽象类就是让其他类继承的,彼此定义产生了矛盾,
实际代码中final修饰抽象类编辑器会提示报错:
8、接口和抽象类的区别
- 实现的区别:抽象类的子类使用extend来继承,接口使用implements来实现
- 构造函数:抽象类可以用构造函数,接口不能有构造函数
- main方法:抽象类可以有main方法,并且能运行main方法,但是接口中不能有main方法
- 实现数量:类只能继承一个抽象类,但是可以实现多个接口
- 访问修饰符:抽象类中的方法可以是任意访问修饰符,接口中的方法默认使用public修饰
9、java的IO流分几种?
按功能区分:输入流(input)和输出流(output)
按类型区分:字节流和字符流,它俩的区别:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据
10、Files的常用方法有哪些?
- Files.exists():检测文件路径是否存在
- Files.createFile():创建文件
- Files.createDirectory():创建文件夹
- Files.delete():删除一个文件或目录
- Files.copy():复制文件
- Files.move():移动文件
- Files.size():查看文件个数
- Files.read():读取文件
- Files.write():写入文件
11、List、Set、Map之间的区别
继承接口的区别:
List和Set的继承接口是collection,Map是没有显式的继承类的,但在JAVA中所有的类或接口都有共同的父类,即java.lang.Object类. 所以可以说,Map接口继承了java.lang.Object类。
常见实现类的区别:
List的常见实现类:Abstract(其常用子类有ArrayList、linkedList、Vector(线程安全))
Set的常用实现类:Abstract(其常用子类有HashSet、linkdeSet、TreeSet)
Map的常用实现类:HashMap、HashTable(线程安全)
常见方法的区别:
List常见方法:add() 、remove() 、clear()、get()、contains()、size()
Set常见方法:add() 、remove() 、clear()、contains()、size()
Map常见方法:put()、get()、remove()、clear()、containsKey()、containsValue()、keyset()、size()
元素是否可重复:
List可重复
Set不可重复
Map不可重复
元素是否有序:
List是有序的
Map是无序的
12、HashMap和Hashtable的区别
- HashTable是同步的,HashMap是非同步的,但是效率上要比HashTable要高
- HashMap允许空键值,而HashTable不允许
13、如何决定使用HashMap还是TreeMap?
对于在Map中插入、删除和定位元素这类操作,最好选择HashMap。
假如你需要对一个有序的key集合进行遍历,更好的选择是TreeMap。
14、ArrayList和LinkedList的区别
ArrayList底层的数据结构是数组,支持随机访问
LinkedList的底层数据结构是双向循环链表,不支持随机访问
使用下标访问一个元素,ArrayList的时间复杂度是O(1),而linkedList是O(n)
15、实现数组和List之间的转换
- List转换为数组:调用ArrayList的toArray方法
- 数组转换为List:调用Arrays的asList方法
16、Array和ArrayList有什么区别
- Array可以容纳基本类型和对象,ArrayList只能容纳对象
- Array是指定大小的,而ArrayList大小动态变化的
- Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
- ArrayList可以算是Array的加强版,是对Array有所取舍的加强。
二、多线程
1、并行和并发有什么区别?
- 并行是指两个或者多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。
- 并行是在不同实体上的多个事件,并发是在同一个实体上的多个事件。
- 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。
举例:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的)
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
并发是轮流处理多个任务,并行是同时处理多个任务
2、线程和进程的区别
进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
线程是进程的一个实体,是cup调度和分派的基本单位,是比程序更小的能独立运行的基本单位。
同一个进程中的多个线程之间可以并发执行。
进程是线程的容器,不存在没有线程的进程,每个进程中至少有一个线程。
3、创建线程池有哪几种方式?
①newFixedThreadPool(int nThreads)
②newCachedTreadPool()
③newSingleThreadExecutor
④NewScheduledThreadPool(int corePoolSize)
4、线程池有哪些状态
线程池有5种状态:Running、shutDown、stop、Tidying、Terminated