Java

2018-10-10  本文已影响0人  散落的湛蓝

1.JAVA文件可以包含多个类吗?

        一个.java类中是可以有多个类,但是,在多个类中,有且只有一个public类(每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示),且public类的类名必须与*.java的文件名相一致。

2 .Switch表达式是否支持String类型?

        char, byte, short, int

        String (hashCode)

        Enum

        在jdk 7 之前,switch 只能支持 byte、short、char、int 这几个基本数据类型和其对应的封装类型。switch后面的括号里面只能放int类型的值,但由于byte,short,char类型,它们会 自动 转换为int类型(精精度小的向大的转化),所以它们也支持。注意,对于精度比int大的类型,比如long、float,doulble,不会自动转换为int,如果想使用,就必须强转为int,如(int)float。

        jdk1.7后,整形,枚举类型,boolean,字符串都可以。

3.两个引用类型变量使用比较方法 == 与 equals方法的区别? 

        “==”是看两个对象是否是同一个对象,也就是两个对象引用是否指向同一个对象(Java分配的内存地址一样(==比较的是保存对象的内存地址)

        equals()是比较两个对象的内容是否相等(equals比较的是内存地址的值(对象的值) )

        基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean ,他们之间的比较,应用双等号(==),比较的是他们的值。 复合数据类型(类) ,当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 

        因此,基础数据类型 ==, 引用数据类型 equals(重写equals)

4.final修饰一个引用类型的变量时,变量可以赋值吗?变量指向对象可以赋值吗?

        是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变。final变量永远指向这个对象,是一个常量指针,而不是指向常量的指针。例如:final StringBuffer sbu = new StringBuffer(“abc”); 在对其进行重新赋值 sbu = new StringBuffer(“”); 会出现编译错误,被final修饰的变量是不能被重新赋值的。sbu.append(“d”); 是可以编译通过的。(变量不可以赋值,变量指向的对象可以赋值)

        final:作为一个修饰符:1、可以修饰类、变量、函数。2、被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。3、被final修饰的方法不可以被复写。4、被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便于阅读。而这个值不需要改变,所以加上final修饰,作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过_连接。 5、内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。

5.重载、重写的特征 

        重载——有不同的参数列表(静态多态性)

        重写–在子类中重写该方法,相同参数,不同实现(动态多态性)

        方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同。  方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型 。(子类中不能重写父类中的final方法 ,子类中必须重写父类中的abstract方法 )

6.面对对象编程(OO)思想 

        封装:隐藏实现细节,设置类或者方法的访问权限

        继承:继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码(is-a)

        多态:一种运行时基于对象的类型发生的绑定机制,通过这种机制实现函数名绑定到函数具体实现代码的目的

7.hashMap与hashTable的区别? 

        Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

        HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。HashMap不能保证随着时间的推移Map中的元素次序是不变的。

        HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);

        参考链接:http://www.importnew.com/7010.html

8.abstract class和interface的区别 

        参考链接:https://blog.csdn.net/b271737818/article/details/3950245

        1.相同点    A. 两者都是抽象类,都不能实例化。  B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

        2. 不同点    A. interface需要实现,要用implements,而abstract class需要继承,要用extends。  B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。  C. interface强调特定功能的实现,而abstract class强调所属关系。   D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。  E. abstract class是interface与Class的中介。

9.String、StringBuffer和StringBuilder的区别? 

        String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。

        StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。

        StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。

        使用策略

       (1)基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。(2)不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。(3)为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。(4)StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。(5)相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。

        参考链接:https://blog.csdn.net/kingzone_2008/article/details/9220691

链式编程

https://www.cnblogs.com/wenbiquan/p/11319760.html

其中使用lombok,@Accessors(chain =true),@Builder

上一篇下一篇

猜你喜欢

热点阅读