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以降で使用できます。2つの主な違いは、ioはストリーム指向またはブロッキングio、nioはバッファー指向、非ブロッキングioです
。ioが使用されている場合、毎回1つ以上のバイトがストリームから読み取られます、すべてのバイトが読み取られるまで、それはどこにもキャッシュされません。nioが読み取るのは、データがキャッシュされることです。つまり、読み取ったデータはバッファに読み取られます。さらに、Javaのさまざまなioはブロッキング。つまり、スレッドがreadまたはwrite()を呼び出すと、一部のデータが読み取られるか、完全に書き込まれるまで、スレッドはブロックされています。このプロセスでは、他のことはできません。nioの非ブロッキングモードでは、データの読み取り要求を送信するときに、利用可能なデータが読み取られない場合、何も取得されず、スレッドは書き込み用にブロックされません。非ブロッキングIOのアイドル時間は、他の操作を実行します。そのため、単一の非ブロッキングスレッドで複数の入力チャネルと出力チャネルを管理できます。さらに、NIOにはセレクタ(セレクタ)もあり、複数の入力チャネルと出力チャネルを管理できます。 。

8.スレッドの状態

実際、スレッドには通常、作成済み、準備完了、実行中、ブロック済み、終了の5つの状態があります。

次の質問に答えてください。たとえば、スレッドを開始するためにユーザーが呼び出すメソッドはどれですか?
新規Threadオブジェクトが作成された
後、スレッドは新しいstart()の後で準備完了状態になり、CPUがCPU呼び出しを呼び出すのを待った後にスレッドが変更されます。実行
状態になる:スリープがブロックされた後、モニターのロックは解放されません。スレッドがスリープした後、スレッドは準備完了状態になり、
yield後は準備完了状態になります。ロックは解放されません。
待機後、他のスレッドがブロックされます
。nifityの後、他のスレッド準備状態になる
サスペンドになる:スレッドの中断をブロック状態に変更する
ことです。再開:中断されたスレッドが復元されて準備完了状態になります。
停止:スレッドを停止してデッド状態になります
。runメソッドが実行されるか、例外またはブレークが発生するとデッドになります。状態

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を参照してください。時間がある場合はデモを作成できます)。
アノテーションを定義します。public
@interface Controller { public String value(); //パラメータを定義します} アノテーションを使用します// @ Controller(value =“ userService” )@Controller(“ userService”)//アノテーションのパラメーター名が値の場合、パラメーター名は省略できますpublic class UserController { } 共通のJava組み込みアノテーション、オーバーライドなど。







おすすめ

転載: blog.csdn.net/zhang_yuanbai/article/details/108701777