Java基础面试题

String StringBuilder StringBuffer 区别?**

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
  String最慢的原因:
  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
1 String str=“abc”;
2 System.out.println(str);
3 str=str+“de”;
4 System.out.println(str);
  如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
  另外,有时候我们会这样对字符串进行赋值
1 String str=“abc”+“de”;
2 StringBuilder stringBuilder=new StringBuilder().append(“abc”).append(“de”);
3 System.out.println(str);
4 System.out.println(stringBuilder.toString());
  这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
  String str=“abcde”;
  是完全一样的,所以会很快,而如果写成下面这种形式
1 String str1=abc";
2 String str2=“de”;
3 String str=str1+str2;
  那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

2. 再来说线程安全
  在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  3. 总结一下
  String:适用于少量的字符串操作的情况
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

int 和Integer 区别

1.Integer是int的包装类,int则是java的一种基本数据类型
2.Integer变量必须实例化后才能使用,而int变量不需要
3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
4.Integer的默认值是null,int的默认值是0

== 和equals 区别

(1)、基础类型比较
使用==比较值是否相等。

(2)、引用类型比较
①重写了equals方法,比如String。
第一种情况:使用==比较的是String的引用是否指向了同一块内存
第二种情况:使用equals比较的是String的引用的对象内用是否相等。

②没有重写equals方法,比如User等自定义类
==和equals比较的都是引用是否指向了同一块内存。

ArrayList 和 LinkedList 区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

Hashset 和 HashMap 区别

什么是HashSet
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。

public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

什么是HashMap
HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

public Object put(Object Key,Object value)方法用来将元素添加到map中。
在这里插入图片描述

JDK 1.8 新特性

Lambda
标准格式由三部分组成:
(参数列表)->{一些重要方法的代码};
():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数用逗号分隔。
->:传递:把参数传递给方法体{}
{}:重写接口的抽象方法的方法体

Stream API

List/Set 获取stream流的方式
List list = new ArrayList<>();
Stream stream1 = list.stream();

Set set = new HashSet<>();
Stream stream2 = set.stream();

Map获取stream流的方式
Map<String,String> map = new HashMap<>();
Stream<Map.Entry<String, String>> stream1 = map.entrySet().stream();

Stream stream2 = map.keySet().stream();
Stream stream3 = map.values().stream();

数组获取stream流的方式
String[] array = {“陈奕迅”,“钟汉良”,“杨千嬅”};
Stream stream = Stream.of(array);

流常用方法

①逐一处理:forEach
②过滤:filter
⑦取用前几个:limit
⑩排序:sorted

public private protected default之间权限的问题

在这里插入图片描述

Java 泛型

泛型允许用户在定义类、类方法、形式参数、成员变量时,指定它为通用类型,也就是数据类型可以是任意的类型,如“List<?> list=null;”,具体调用的时候,要将通用类型转换成指定的类型使用。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

线程

Java 提供了三种创建线程的方法:

通过实现 Runnable 接口;
通过继承 Thread 类本身;
通过 Callable 和 Future 创建线程。
在这里插入图片描述

重载与重写 的区别

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里
氏代换原则)。重载对返回类型没有特殊的要求。

Thread 类的 sleep()方法和对象的 wait()方法都可以让线程暂停执行,它们有什么区别?

sleep()方法 ( 休眠 ) 是线程类 ( Thread) 的静态方法 , 调用此方法会让当前线程
暂停执行指定的时间,将执行机会( CPU)让给其他线程,但是对象的锁依然保
持 ,因此休眠时间结束后会自动恢复( 线程回到就绪状态
)。 wait()是 Object 类的方法,调用对象的 wait()方法导致当前线
程放弃对象的锁(线程暂停执行),进入对象的等待池( wait pool),只有调用
对象的 notify()方法( 或 notifyAll()方法 )时才能唤醒等待池中的线程进入等锁池
( lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

简述 synchronized 和 java.util.concurrent.locks.Lock的异同?

Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点:
Lock 能完成 synchronized 所实现的所有功能;主要不同点:Lock 有比
synchronized 更精确的线程语义和更好的性能,而且不强制性的要求一定要获得
锁。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且最好
在 finally 块中释放(这是释放外部资源的最好的地方)。

请说出与线程同步以及线程调度相关的方法。

wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用
此方法要处理 InterruptedException 异常;
 notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并
不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且
与优先级无关;
 notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给
所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

synchronized 关键字的用法?

synchronized 关键字可以将对象或者方法标记为同步,以实现对对象和方法的互
斥访问,可以用 synchronized(对象) { … }定义同步代码块,或者在声明方法时
将 synchronized 作为方法的修饰符。

举例说明同步和异步。

如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正
在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线
程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好
的例子)。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并
且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异
步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻
塞式操作。

事务的 ACID 是指什么?

原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作
的失败都会导致整个事务的失败;
 一致性(Consistent):事务结束后系统状态是一致的;
 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难
性的失败。通过日志和同步备份可以在故障发生后重建数据。

获得一个类的类对象有哪些方式?

方法 1:类型.class,例如:String.class
 方法 2:对象.getClass(),例如:”hello”.getClass()
 方法 3:Class.forName(),例如:Class.forName(“java.lang.String”)

阐述 JDBC 操作数据库的步骤。

加载驱动。
创建连接。
创建语句。
执行语句。
处理结果
关闭资源。

Collection 和 Collections 的区别?

Collection 是一个接口,它是 Set、List 等容器的父接口;Collections 是个一个
工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、
排序、线程安全化等等

阐述 final、finally、finalize 的区别。

final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味
着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。将
变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须
在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为 final 的方
法也同样只能使用,不能在子类中被重写。
finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着
程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以
将释放外部资源的代码写在 finally 块中。
finalize:Object 类中定义的方法,Java 中允许使用 finalize()方法在垃
圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收
集器在销毁对象时调用的,通过重写 finalize()方法可以整理系统资源或者执行
其他清理工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值