【Java】Java回顾之路(一)

【1】请你简单描述一下正则表达式及其用途?

在处理字符串时,经常会有 查找符合 某些 复杂规则的字符串的需要,正则表达式就是用于 描述这些规则的工具

【2】请你说明一下,在Java中如何跳出当前的多重嵌套循环?

在最外层循环前加一个标记如 stop ,然后用 break stop; 可以跳出多重循环

public static void main(String[] args) throws ParseException {
   int num = 0;
   stop:
   while (true){
       while (true){
           System.out.println(num++);
           if(num > 100){
               break stop;
           }
       }
   }
}

【3】请你讲讲&和&&的区别?

& 运算符有两种用法:(1)按位与 、(2)逻辑与

  • 如果 & 两边表达式值不是布尔值,则是按位与(二进制计算,相同则1,不同则0)
  • 如果 & 两边表达式值是布尔值,则是逻辑与(两边为true,结果为ture,否则为false)

&& 运算符是 短路与 运算 :两边为true,结果为true,如果左边为false,右边不执行

【4】请你说明String 和 StringBuffer 的区别?

JAVA 提供了两个类:StringStringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据
String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改

【5】请你说明一下int 和 Integer 有什么区别

Int 是 Java 的 基本数据类型,Integer是 Java 为 Int 提供的 引用包装类型

【6】请说明String是最基本的数据类型吗?

基本数据类型包括byte、int、char、long、float、double、boolean和short,而String是一个final修饰的类

【7】请你讲讲数组(Array)和列表(ArrayList)的区别?

1)Array可以包含基本类型和引用类型,ArrayList只能包含引用类型
2)Array大小是固定的,ArrayList的大小是动态变化的
3)ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等

【8】请你解释什么是值传递和引用传递?

值传递是对基本类型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量
引用传递一般是对于对象变量而言的,传递的是该对象的地址值。 所以对引用对象进行操作会同时改变原对象

【9】请你讲讲一个十进制的数在内存中是怎么存的?

补码的形式

【10】请你说明符号“==”比较的是什么?

"=="对比两个对象基于 内存引用,如果两个对象的引用完全相同(指向同一个对象)时,"=="操作将返回true,否则返回false。"=="如果两边是基本类型,就是比较数值是否相等

【11】请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的?

Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法直接返回对象的 内存地址

【12】请你解释为什么重写equals还要重写hashcode?

HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为 自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对

【13】请你介绍一下map的分类和常见的情况

java为数据结构中的映射定义了一个接口 java.util.Map
它有四个实现类,分别是HashMapHashtableLinkedHashMapTreeMap

Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复

Hashmap
Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,访问速度快,遍历时,取得数据的顺序是完全随机的
HashMap最多只允许一条记录的键为Null; 允许多条记录的值为 Null
HashMap不支持线程的同步 ,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap

Hashtable
Hashtable 与 HashMap类似,它继承自Dictionary类,不同的是: 它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢

LinkedHashMap
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关

TreeMap
TreeMap实现SortMap接口,能够把它保存的记录 根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的

总结:
一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列

【14】请你讲讲Java里面的final关键字是怎么用的?

final修饰类时,该类就不能被继承
final修饰方法时,该方法就不能被重写
final修饰变量时,该变量就不能被二次赋值

【15】请你谈谈关于Synchronized和lock

Synchronized是Java的关键字,当它用来修饰 方法或者 代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码

Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现
synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生
Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象
因此使用Lock时需要在finally块中释放锁;Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到

【16】请你介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?

Syncronized修饰静态方法以及同步代码块的synchronized (类.class)用法锁的是,线程想要执行对应同步代码,需要获得类锁

Syncronized修饰成员方法,线程获取的是 当前调用该方法的对象实例的对象锁

【17】若对一个类不重写,它的equals()方法是如何比较的?

比较是对象的地址

【18】请解释Java中的概念,什么是构造函数?什么是构造函数重载?

当新对象被创建的时候,构造函数会被调用

每一个类都有构造函数,在没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的空参构造函数

Java中构造函数重载和方法重载很相似,可以为一个类创建多个构造函数,每一个构造函数必须有它自己唯一的参数列表

【19】请说明Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

方法重载发生在同一个类里面多个方法的方法名相同但是参数(参数类型和参数列表)不同的情况
方法覆盖是说子类重写了父类的方法, 方法覆盖必须有相同的方法名、参数列表和返回类型

【20】请你讲讲abstract class和interface有什么区别?

抽象类(abstract class):
由 abstract 修饰类名
类里可以有抽象方法,也可以有普通方法
子类继承抽象类需要实现抽象方法,非抽象方法可以不实现,如果没有全部实现抽象方法,则该子类需要添加 abstract 关键字,变为抽象类

接口(interface):
由 Interface 修饰
类里只能定义抽象方法
子类实现接口并实现全部抽象方法
接口之间可以相互继承

【21】请你谈谈StringBuffer和StringBuilder有什么区别,底层实现上呢?

StringBuffer线程安全,StringBuilder线程不安全
底层实现上的话,StringBuffer 其实就是比 StringBuilder 多了Synchronized修饰符

【22】请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或、成员方法可以在没有所属的类的实例变量的情况下被访问

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的,static方法跟类的任何实例都不相关,所以概念上不适用

【23】请说明List、Map、Set三个接口存取元素时,各有什么特点?

List以特定索引来存取元素,可以有重复元素
Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)
Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一

Set和Map容器都有基于 哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果

【24】Sleep和wait方法的异同?

1)相同点

  • 一旦执行方法,都可以使当前线程进入阻塞状态

2)不同点

  • 两个方法声明的位置不同:Thread类中声明sleep(),object类中声明wait()
  • 调用要求不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中
  • 关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁

【25】String s = new String(X") 的方式创建对象,在内存中创建了几个对象?

两个:一个是在堆空间中的new String(),另一个是char[] 对应的常量池中的数据:”X“

猜你喜欢

转载自blog.csdn.net/qq_43733123/article/details/106159247
今日推荐