java基础10道题

1.String类中常用的方法?

split():把字符串分割成字符串数组
indexOf():从指定字符提取索引位置
append():追加字符或字符串
trim():去除字符串两端空格
replace():替换
hashCode():返回此字符串的哈希码
subString():截取字符串
equals():比较
length():获取字符串的长度
valueOf():转换为字符串
concat():将指定字符串连接到此字符串的结尾
compareTo():用来比较两个字符串的字典顺序
compareToIgnoreCase():不考虑大小写,按字典顺序比较两个字符串
contains(): 检查一个字符串中是否包含想要查找的值
用string类里的哪一个方法替换掉第五个元素?
String str = new String(“helloWorld”);
System.out.println(str.replace(5, ‘T’));

2.什么是重载和重写?

我理解得Java里方法的重写(Overriding)和重载(Overloading)就是指的java里多态,重写就是父类与子类之间的多态,重载是在一个类中多态对的体现(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。

3.HashMap和Hashtable的区别

这两个都是是Map接口下的实现类,我们开发的时候经常用的是HashMap虽然HashMap不是线程安全的但是他的存储效率比较高,Hashtable是线程安全我们看过他底层的put方法前面加的synchronized关键字,但是他的效率太低,我们开发很少用.为什么说hashTable是线程安全的? 因为看源码的时候里面的put方法前面加了synchronized关键字,什么情况下用hashMap? 我们有时候在自定义返回json字符串的时候,封装到List中进行返回.你知道Hashmap的底层实现吗? 参考后面的答案

4.Hashmap的底层实现原理

这个我在论坛上看过,Hashmap底层是通过数组和链接联合实现的,当我们创建hashmap时会先创建一个数组,当我们用put方法存数据时,先根据key的hashcode值计算出hash值,然后用这个哈希值确定在数组中的位置,再把value值放进去,如果这个位置本来没放东西,就会直接放进去,如果之前就有,就会生成一个链表,把新放入的值放在头部,当用get方法取值时,会先根据key的hashcode值计算出hash值,确定位置,再根据equals方法从该位置上的链表中取出该value值。参考文章
https://my.oschina.net/u/3954808/blog/3051948

5.hash碰撞怎么产生,怎么解决?

这道题我正好在上家面试的时候问到过,当时我也不会,我回去专门上网查了一下,解决方案,堆里面在存储对象地址的时候有一个开放地址的方法:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。
第二种是用rehash(再哈希法):当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止
3、链地址法(拉链法):创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。(java 里的 hashMap 就是使用的这种方法)

6.ArrayList与LinkedList区别

ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。
LinkedList使用双向链接方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快,然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快。开发中什么时候到ArrayList?,我们在做查询的时候把查询出来的数据经常存到arraylist里.

7.IO和NIO的区别?

这个NIO是JDK1.7以后有的,它们俩的主要区别是:io 是面向流是阻塞io,nio是面向缓冲,非阻塞的io;
io的话每次从流中读取一个或多个字节,直到读取完所有的字节,没有缓存到任何地方.nio读取的是数据是有缓存,就是说他读取的数据是在缓冲里读的. 另外的话,java中的各种io是阻塞的.就是说一个线程调用read或者write()时,这个线程就已经被阻塞了,直到读取到一些数据为止,或者是完全写入.在这个过程中不能干其他的事情. nio的非阻塞模式,当发送一个读取数据的请求的时候,如果没有读取到可用的数据,就什么也不会获取,且不会让线程阻塞写也是这样.非阻塞的IO的空闲时间可用用来做其他的操作所以,一个单独的非阻塞线程可以管理多个输入和输出通道,另外NIO还有一个selector(选择器),它是可以管理多个输入输出的通道.我大概了解的也就是这样.

8.线程的状态

其实线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

下面这些问到的就回答一下,比如说让你启动一个线程调用哪个方法?
new 出一个Thread对象后,些时线程是新建
start()之后线程是就绪状态,等待CPU调用CPU调用之后线程就变成了运行:
sleep之后是阻塞,不会释放监视器上的锁,线程睡起来之后又变成就绪状态
yield之后就绪状态,不会释放锁
wait之后,其它线程变成阻塞状态
nifity之后,其它线程变成就绪状态
suspend:就是将线程挂起变成阻塞状态
resume:就是挂起的线程恢复,变成就绪状态
stop:停止线程,变成死亡状态
run方法运行完或出现异常或break等变成死亡状态

9.线程同步,什么是锁?

实现线程同步有三种方式:
1)同步代码块:在代码块上加上“synchronized”关键字的话,则此代码块就称为同步代码块。
同步代码块格式:
synchronized(监视对象){
需要同步的代码 ;
}
解释:监视对象有三种:对象、String、.class文件(只要是不变的对象都可以做监视对象)
2)同步方法
同步方法定义格式:
synchronized 方法返回值 方法名称(参数列表){}

在方法上加synchronized,是把当前对象做为监视器
3)同步锁
Lock lock = new ReentrantLock();(可以在类中直接new)
lock.lock(); 中间的代码块进行加锁lock.unlock();

10.自定义Annotation,自定义注解

大学里学java初级的时候写过自定的注解, 按照下面代码说一下, 开发以后就没在写过了,都是用的框架给带的注解 spring的那些注解给挨个说一遍
向Annotation中设置参数内容
Annotation定义格式:
[public] @interface Annotation名称{
数据类型 变量名称() ;
}
定义注解:
public @interface Controller {

}
使用注解:
@Controller
public class UserController {

}
定义带参数的注解(详见api,有时间可以写个demo)
定义注解:
public @interface Controller {
public String value(); // 定义参数
}
使用注解:
//@Controller(value=“userService”)
@Controller(“userService”) // 注解的参数名为value时,参数名可以省略
public class UserController {
}
常见java内建注解,override等

猜你喜欢

转载自blog.csdn.net/zhang_yuanbai/article/details/108701777