equals()和hashCode()区别?
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。
hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。
之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如HashTable。 两个obj,如果equals()相等,hashCode()一定相等。 两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?
综述:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
集合类存放于java.util包中。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要有3种:set(集)、list(列表)和map(映射)。
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
基本类型与封装类的最大区别是,封装类是引用类型,其实问题就是基本类型和引用类型的区别。 基本类型在内存中是存储在栈中,引用类型的引用(值得地址)存储在栈中,而值是存储在堆中。 建议学习下堆栈,这样就很清楚了。
final
在Java中声明属性、方法和类时,可使用关键字final来修饰。
final变量即为常量,只能赋值一次;
final方法不能被子类重写;
final类不能被继承。
1. static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
可访问描述符 Java 提供一系列可访问描述符来设定类,变量,方法和构造器的访问级别。四种访问级别如下:
默认的,对封装可见。不需要描述符。
1. 仅对类可见(private)
2. 全部可见(public)
3. 对封装和子类可见(protected)
不可访问描述符
Java 提供一些不可访问描述符来满足其他功能。
1. Static 描述符是用来创造类方法和变量的。
2. Final 描述符用来最终确定和实施类、方法和变量的。
3. Abstract 描述符用来创造不允许实例化的类和方法。
4. synchronized 和 volatile 描述符用来当做线的。
首先,String和StringBuffer主要有2个区别:
(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append()方法来修改值
(2)String类对象的性能远不如StringBuffer类。
抽象类(abstract class)与接口(interface)的区别
1. 抽象类可以有构造方法,接口中不能有构造方法。(虽然抽象类有构造方法,但它也不能被实例化)
2. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
3. 抽象类和接口中都可以包含静态成员变量。抽象类中的静态成员变量的访问类型可以是任意类型,但接口中定义的变量只能是public static final,并且默认为:publicstaic final类型。(接口毕竟要被子类实现,所以成员变量必须是public,如果是其他访问类型,那这个变量存在还有什么意义)
4. 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。
5. 抽象类中的抽象方法访问类型可以是public, protected和默认。但接口抽象方法只能是public类型的,且不管接口的方法是否使用public abstract修饰默认即为publicabstract类型。(例如:在接口中定义void add();方法 是和public void add(); 、public abstract void add()等价的)
6. 抽象类中可以包含静态方法,而接口中不能包含静态方法
7. 一个类可以实现多个接口,但只能继承一个抽象类。
8. abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的, 仅仅是实现了interface定义的契约而已。
覆盖(Overriding)与重载(OverLoading)的区别在哪里。
重载:在一个类当中才可以重载,方法名相同,参数个数不同或参数个数相同而参数类型不同。覆盖:又称重写,在派生类(子类)中重写基类(父类)的方法,名称、参数、类型都必须相同。
Java Exception:
1、Error 2、Runtime Exception 运行时异常 3、Exception 4、throw 用户自定义异常
异常类分两大类型:Error类代表了编译和系统的错误,不允许捕获;Exception类代表了标准Java库方法所激发的异常。Exception类还包含运行异常类Runtime_Exception和非运行异常类Non_RuntimeException这两个直接的子类。
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
如何创建一个不可变类?
要创建不可变类,只要遵循下面几条规则:
1. 不要提供任何会修改对象状态的方法。
2. 保证类不会被拓展(一般声明为final即可)。
3. 使所有的域都是 private final的。
4. 确保对于任何可变组件的互斥访问(可以理解如果中存在可变对象的域,得确保客户端无法获得其引用,并且不要使用客户端提供的对象来初始化这样的域)。
Java出于安全性等因素考虑将某些类如:String、基本类型的包装类、BigInteger、BigDecimal设计成为不可变类。
JIT 编译 (JIT compilation),运行时需要代码时,将Microsoft 中间语言 (MSIL) 转换为机器码的编译。
2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别