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方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了. 虚引用和软引用和弱引用都不同,它会在内存没有清理的时候被加入引用队列.虚引用的建立必须要传入引用队列,其他可以没有。

本文中的知识点是在网络中收集。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,654评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,112评论 0 62
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,207评论 0 5
  • CSS的选择器与属性 属性 文字属性规定文字样式的属性font-style(fs)font-weight(fw)f...
    小白古阅读 224评论 0 0
  • 张旭明:永远年轻,永远是第一次 年轻不是永远25岁,而是抱着好奇心,看世界,永远第一次。 1. 给人希望的,是一切...
    隔壁村的教主阅读 307评论 0 3