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(),如果常量池中没有,则拷贝一份引用,放到常量池中。