String ,StringBuffer,StringBuider和的区别?
答:主要分为两个方面(运行效率,线程安全),首先是运行效率的问题,StringBuilder > StringBuffer > String,
String 慢的原因是因为它本身是被final修饰的.即一旦被创建以后就不能被修改,而StringBuffer
StringBuider是可变长度的,如下代码:
String str ="abc";
System.out.println(str);
str=str+"123";
System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abc123”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“123”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有
synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能
保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用
StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
java中继承与实现的区别?
继承: 在java中只存在单继承关系,即一个子类只有一个父类,所有类都默认继承Object这个顶级父类
应用场景:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都
放到父类里,让他们都继承这个类。
实现:如果多个类处理的目标是一样的,但是处理的方法方式不同,那么就定义一个接口,也就是一
个标准,让他们的实现这个接口,各自实现自己具体的处理方法来处理那个目标
Arraylist和LinkList的区别?
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指 针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
代码如下:
public class Test1 {
static final int N =100000;
public static void main(String[] args) {
System.out.println("ArrayList添加" + N + "条耗时:" + timeList(new ArrayList()));
System.out.println("LinkedList添加" + N + "条耗时:" + timeList(new LinkedList()));
List list1 = addList(new ArrayList<>());
List list2 = addList(new LinkedList<>());
System.out.println("ArrayList查找" + N + "条耗时:" + readList(list1));
System.out.println("LinkedList查找" + N + "条耗时:" + readList(list2));
}
static long timeList(List list) {
// 开始时间的毫秒数
long start = System.currentTimeMillis();
Object o = new Object();
for (int i = 0; i < N; i++) {
list.add(0, o);
}
// 返回消耗的时间
return System.currentTimeMillis() - start;
}
static long readList(List list) {
long start = System.currentTimeMillis();
for (int i = 0, m = list.size(); i < m; i++) {
list.get(i);
}
return System.currentTimeMillis() - start;
}
// 新增10W条集合
static List addList(List list) {
Object o = new Object();
for (int i = 0; i < N; i++) {
list.add(0, o);
}
return list;
}
}
运行结果:
显然我们可以看出ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。
ArrayList内部是使用可増长数组实现的,所以是用get和set方法是花费常数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
LinkedList是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费常数时间。
abstract class 与interface 的区别?
相同点: 都不能被实例化
不同点:
IO流的关闭
参考:https://blog.csdn.net/u012643122/article/details/38540721