java equal switch_Java基本知识

Java中一些比较常见也必须要掌握的一些基础知识,这里做一些归纳总结。

1.Java中的基本类型及其泛型

基本类型:byte,char,short,int,long,float,double,boolean。

对应泛型:Byte,character,Short,Integer,Long,Float,Double,Boolean。

2.switch的参数能否为String类型?

可以。

在 Java5 以前,switch(expr)中的 expr 只能为 byte,short,char,int。在 Java5 中,expr 可以为枚举(enum)类型。从Java7开始,expr 可以为 String类型。

3.equal与  ==  的区别

== 常用于基本类型的比较。而equal常用于比较对象之间的相等性。

== 也可用于对像之间的比较。当两个对象的引用地址相同时,==  返回 true;而 equal 的返回值取决于类的重写实现。因为在Object中,== 与 equal 实现是相同的,是比较两个对象的内存地址。但在一些子类中,equal 被重写,如 Integer,String。==  的比较情形:对于基础类型,比较的是两者之间的值是否相等;对于对象之间,比较的是两个对象之间的内存地址。equal 的比较情况(以String类型为例)

JVM处理String类型的一些特性:  JVM虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。当使用 String a = "abc"这样的语句进行定义一个引用的时候,首先会在字符串缓冲池中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。String a = new String("abc");这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就在堆内存中的某一个小角落开辟了一个新的String对象。

public boolean equals(Object anObject) {

//如果比较的对象与自身内存地址相等的话,就说明他两指向的是同一个对象,所以此时equals的返回值跟==的结果是一样的。

if (this == anObject) {

return true;

}

//当比较的对象与自身的内存地址不相等,并且

//比较的对象是String类型的时候

//将会执行这个分支

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

//在这里循环遍历两个String中的char

while (n-- != 0) {

//只要有一个不相等,那么就会返回 false

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

这里是String类型中对equal的重写。循环遍历两个String 对象的值,并比较,只要有一位不等就返回 false。

4.String与StringBuffer,StringBuild的区别

String是字符串常量,意味着String引用的字符串内容是不能被改变的。StringBuffer和StringBulder是字符串变量,表示的字符串对象可以直接进行修改。StringBuffer是线程安全的,StringBulder是线程不安全的。

String类是final的,故不可继承。效率对比:StringBuild > StringBuffer > String.

StringBuffer是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。

5.Override和Overload的含义与区别

Override和Overload是Java多态性的一种表现。

Override,方法重写,顾名思义,是在子类中对父类的方法重新定义,具有与父类方法相同的方法名与参数。调用该方法时直接调用到子类中的该方法,说明父类方法被覆盖了。

Overload,方法重载,在一个类中定义多个同名的方法,它们有不同的参数个数,或不同的参数类型,Overloaded的方法可以改变返回值的类型。

6.final,finally,fianlize之间的区别

final:用于属性的声明,表示属性不可变,方法不可覆盖,类不可继承。

finally:异常处理结构的一部分,表示总是执行。

fianlize:是Object类中的一个方法,用于释放资源。垃圾收集机制执行的时候回调用被回收队象的该方法。可以覆盖此方法提供垃圾收集时的其它资源回收。

7.不调用第三方字符串,使“abcd” 倒序-----字符串倒序

String  a = “abcd”;

String  b  =  new StringBuffer(a).reverse().toString();

调用StringBuffer类的reverse()方法。

8.ArrayList,Vector,LinkList 的存储性能与特性

ArrayList与Vector:都是使用数组的方式存储数据。允许按序号索引元素。插入删除操作时,数组元素需要移动。但 Vector 使用了 synchronize方法(线程安全的),性能较Arraylist差。            特性是:索引快,插入慢。

LinkList:是使用双向链表来是实现存储的,索引需向前或向后遍历,插入数据只需要记录该项的前后项。                                                                                                                                                特性:插入快,索引慢。

10.Interface与abstract类的区别

抽象类(abstract)和接口(Interface)都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。抽象类可以实现  implement 接口。

抽象类可以继承实体类,前提是实体类必须有明确的构造函数。

11.Static class 与non static class的区别

内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。

非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。

一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

12.foreach与正常for循环效率对比

直接for循环效率最高,其次是迭代器和 foreach操作。 作为语法糖,其实 foreach 编译成 字节码之后,使用的是迭代器实现的,反编译后,testForEach方法如下:public static void testForEach(List list) {

for (Iterator iterator = list.iterator(); iterator.hasNext();) {

Object t = iterator.next();

Object obj = t;

}

}

可以看到,只比迭代器遍历多了生成中间变量这一步,因为性能也略微下降了一些。

13.Collection包结构,与Collections的区别。

Collection是一个接口,它是Set、List等容器的父接口。

Collections是一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

14.Map、Set、List、Queue、Stack的特点与用法

Collection 是对象集合, Collection 有两个子接口 List 和 Set。

List 可以通过下标来取得值,值可以重复。而 Set 只能通过游标来取值,并且值是不能重复的。

ArrayList , Vector , LinkedList 是 List 的实现类。ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的。LinkedList 是线程不安全的,底层是由链表实现的。

Map 是键值对集合。

HashTable 和 HashMap 是 Map 的实现类。HashTable 是线程安全的,不能存储 null 值。HashMap 不是线程安全的,可以存储 null 值。

Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。

Queue接口:提供了几个基本方法,offer、poll、peek等。已知实现类有LinkedList、PriorityQueue等。

15.Java的四种引用

JDK1.2之前只有强引用,其他几种引用都是在JDK1.2之后引入的。

强引用(Strong Reference) :最常用的引用类型,如Object obj = new Object(); 。只要强引用存在则GC时则必定不被回收。

软引用(Soft Reference) :用于描述还有用但非必须的对象,当堆将发生OOM(Out Of Memory)时则会回收软引用所指向的内存空间,若回收后依然空间不足才会抛出OOM。一般用于实现内存敏感的高速缓存。 当真正对象被标记finalizable以及的finalize()方法调用之后并且内存已经清理, 那么如果SoftReference object还存在就被加入到它的 ReferenceQueue.只有前面几步完成后,Soft Reference和Weak Reference的get方法才会返回null。

弱引用(Weak Reference): 发生GC时必定回收弱引用指向的内存空间。 和软引用加入队列的时机相同。

虚引用(Phantom Reference): 又称为幽灵引用或幻影引用,虚引用既不会影响对象的生命周期,也无法通过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。 当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了. 虚引用和软引用和弱引用都不同,它会在内存没有清理的时候被加入引用队列.虚引用的建立必须要传入引用队列,其他可以没有。本文中的知识点是在网络中收集。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值