Java基础面试(2)

11.请你谈一下面向对象的"六原则一法则"。
  1、单一职责原则:一个类只做它该做的事情。(单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚、低耦合")
  2、开闭原则:软件实体应当对扩展开放,对修改关闭。(在理想的状态下,当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类就可以,不需要修改原来的任何一行代码。要做到开闭有两个要点:①抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点;②封装可变性,将系统中的各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而换乱)
  3、依赖倒转原则:面向接口编程。(该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代)
4、里氏替换原则:任何时候都可以用子类型替换掉父类型。(子类一定是增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有任何问题。)
5、接口隔离原则:接口要小而专,绝不能大而全。(臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的。Java中的接口代表能力、代表约定、代表角色,能否正确的使用接口一定是编程水平高低的重要标识。)
6、合成聚合复用原则:优先使用聚合或合成关系复用代码。(通过继承来复用代码是面向对象程序设计中被滥用得最多的东西,记住:任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。)

12.面向对象的特征
抽象,继承,封装,多态
 抽象是把多个事物的共性的内容抽取出来,本质就是把我们关注的内容抽取出来。(比如:宝马、奔驰都属于汽车,汽车是我们抽象出的概念)
 封装:面向对象就是以封装为基本,封装就是对外只提供使用,对内部的方法和数据进行包装对面隐藏,能够保证模块的独立性。
 继承: 自己新写一个类可以从已有的类(基类)派生出来,派生出来的类是子类,基类是父类。子类可以从父类那里继承到方法和实例变量,并且可以修改和增加方法来满足当前的需要,通过继承可以满足代码的重用性。继承分为类继承和实现接口。
 多态就是指多种状态,就是说当一个操作在不同的对象时,会产生不同的结果。
 在Java中,实现多态的方式有两种,一种是编译时的多态,另外一种是运行时多态,编译时的多态是通过方法的重载实现的,而运行时多态是通过方法的重写实现的。

13.什么是面向过程和面向对象
面向过程:就是相当于自己开车,自己需要去关注行驶的路线,同时还要自己开车。

面向对象:就是相当于打车,自己不用关心具体怎么走,你只需要将地点告诉司机就可以了,只管最后到达公司。


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


15.什么是值传递什么是引用传递?
值传递是对基本类型变量而言的,传递的是该变量的一个副本,改变副本不影响原来变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。


一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递


16.请你讲讲&和&&的区别?
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)

17.Java8新特性:请你说说Lamda表达式的优缺点。

优点:

1. 简洁。

2. 非常容易并行计算。

3. 可能代表未来的编程趋势。

4. 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。

缺点:

1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)


2. 不容易调试。


3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。


4. 在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt


19.String StringBuffer StringBuilder区别
String是只读字符,值不可以改变的

StringBuffer的值是可以改变的,线程安全

StringBuilder的值是可以改变的,线程不安全


20.String类为什么是不可变的?
String类都是对字符数组的封装(而且value也只是一个引用,它指向一个真正的数组对象)。
源码中并没有提供value的set方法,因此String类一旦初始化,外部便无法修改,
同时value被修饰为 private final,在String类内部也无法改变。所以String对象是不可变的。

21.String a=new String(“abc”);一共创建了多少个对象,对象和引用分别存在哪里?

一共2种,也就是str和String("abc")中的"abc"都在栈中! 而str指向的"abc"在堆中!

String str只是定义了一个名 为str的String类型的变量,因此它并没有创建对象;

  = 是对变量str进行初始化,将某个对象的引用(或者叫句 柄)赋值给它,显然也没有创建对象

创建一个类的实例(对象)的方法有以下两种:

1. 使用new创建对象。

2. 调用Class类的newInstance方法,利用反射机制创建对象。

22.string几种拼接方式区别,+和append底层有没有区别

+=  

 +

append

加号 “+”:可以用字符串与任意类型“+”号拼接
String contact() 方法:调用和传入都必须是字符串,而且调用方不能为null
StringUtils.join() 方法
StringBuffer append() 方法
StringBuilder append() 方法
字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现。

“+” 、 concat () 方式实现,或者使用StringBuilder、StringBuffer类实现。这几种方式性能的从低到高进行排序,则顺序为:“+”  <  concat ()  < StringBuffer < StringBuilder 。使用"+"性能是最差的,应该避免使用

StringBuilder的性能是最高的,StringBuffer和StringBuilder的区别是:StringBuffer是线程安全的,而StringBuilder不是。在高并发的应用中,应该考虑使用StringBuffer! !它们实现的接口都是一样的,只不过 StringBuffer的很多方法都加上了synchronized关键字修饰。
 

24.intern方法

public String intern()

返回字符串对象的规范化表示形式。

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

所有字面值字符串和字符串赋值常量表达式都是内部的。

返回:

一个字符串,内容与此字符串相同,但它保证来自字符串池中。

JDK1.6及以前,调用String.intern(),如果常量池中没有,则拷贝一份对象,放到常量池中。

JDK1.7及以后,调用String.intern(),如果常量池中没有,则拷贝一份引用,放到常量池中。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值