java基础知识点

来源:互联网 发布:sas聚类分析共现矩阵 编辑:程序博客网 时间:2024/05/22 04:35

字符串相加

String s = null;  s += "abc";  System.out.println(s);

输出结果:nullabc
原理:http://blog.csdn.net/zolalad/article/details/30089327


字符串拼接存在的性能问题

public void  implicitUseStringBuilder(String[] values) {  String result = "";  for (int i = 0 ; i < values.length; i ++) {      result += values[i];  }  System.out.println(result);}

以上代码在性能上是存在问题的。因为字符串相加,会不断的创建StringBuilder对象。应该改善为外部使用 StringBuilder result = new StringBuilder();
参考链接:http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/


static的使用

  • 分配时间
    静态变量在类加载的时候被分配。类加载:启动一个APP的时候,会创建一个进程。进程创建一个虚拟机实例。也就是说,进程创建的时候,类被加载,静态变量会分配内存。
  • 什么时候销毁。
    进程结束的时候。一般情况下,类都是classLoader加载的,只要ClassLoader存在,类就不会卸载。
  • 如果资源足够,进程不会被删掉。但是换句话说,进程随时可能被杀掉。所以里面的数据不是绝对安全的。
  • 静态引用的对象不会被垃圾回收期回收。
    单例模式在运行时不会被回收。
  • 静态方法中,不可以定义this、super方法。因为静态优于对象存在。

静态代码块,随着类的加载而加载,只执行一次。

class StaticDemo {    static {        //静态代码快    }}

static class和 non static class的区别

  • 静态内部类可以没有对外部类的引用,非静态内部类持有对外部类的引用
  • 静态内部类不可以访问外部类的成员和方法(可以通过弱引用方位),非静态内部类可以
  • 非静态内部类不能够脱离外部类实体被创建

interface 和 abstract的区别

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

overload 和 override的区别

  • Overload是重载。在一个类中方法的名称相同,但是参数名和类型不相同
  • Override是重写。子类继承父类的时候定义一个方法和父类有相同的名称和参数。当子类调用此函数时,自动调用子类的方法。相当于被重写了

String、StringBuffer和StringBuilder的区别

  • 他们都可以存储和操作字符串
  • String:可以看成只读字符串,里面的内容不可以随便修改
  • StringBuffer和StringBuilder:内容可以随意修改。区别是:StringBuilder是单线程环境下使用的,没有被synchronized修饰。效率比StringBuffer略高

HashMap概述

  • 存储机制
    1.先找到Key对象的hash值,计算index(table中的索引)值
    2.如果index索引中已经有数据,那么遍历,判断是否有相同的key,有的话,直接值替换。
    3.对值进行存储。存储有两种情况,如果index中有值,那么需要插入到头部。形成一个Entry链表。 如果没有值,直接存储。可以通过源码查看。
  • 读取机制
    1.先根据Key获取Hash值,计算index(table中的索引)值
    2.遍历整个index,返回与Key相等的value值
  • 使用
    在使用Map时,你的第一选择应该是HashMap,只有在你要求Map始终保持有序是,才需要使用TreeMap.
    2.HashMap是用来替代HashTable的,所以他们使用了相同的底层存储和查找机制。

switch能不能用String作为参数

  • Java5之前,可以用char、byte、short、int
  • Java5之后,可以用枚举(enum)
  • Java7之后,可以用字符串

&和&&的区别

  • 都是逻辑与运算符,表示逻辑与(and)。当两边的结果都是true的时候。结果才是true
  • &&还有短路的功能,当第一个结果为false的时候,不在进行第二个结果的运算。所以类似代码if(str != null && !str.equals(“”))也不会抛出空指针异常。但是&会继续计算第二个参数
  • &还是位运算符,当两边的结果不是boolean的时候。就表示按位与操作。

八种基本的数据类型

  • 基本数据类型:int char long double byte short boolean float
  • 对应的封装类型:Integer Character Long Double Byte Short Boolean Float
  • int: 占用4个字节(32位) 最大值大概21亿(10位数)
  • folat: java中默认的小数为double 如果想写为float,要写成:float f = 4.0f
  • double float: 都占用8个字节
  • float在java中是当作double处理的,会花费更多的时间去转换,所以直接使用double
  • 浮点型就用double,整形就用int,长整形就用long(byte的话,用作数组比较方便,其他不推荐)

记住java一定要用double,更鼓不变,就算数值不大也要用double。了解java虚拟机的底层会知道,float放在内存中其实是当作double来处理的,它不会比double更节约内存资源,对应的double虚拟机会直接以double形式来进行处理,快速而且精度高,但是如果用float,不但不会节约内存资源,虚拟机为了校验float的精度,会花费更多的系统资源,例如cpu时钟,程序执行步骤等等。相对于这点,整数类型,能用int就用int,不要用什么short类型,道理是一样,其实虚拟机中short,char,boolean,byte在内存中都是以int形式来处理的,为了校验精度,虚拟机还会付出格外的开销,这样其实得不偿失,不要自作聪明以为节约了内存,其实错了。当然long类型例外,虽然long类型也会增加资源的开销,但是毕竟能完成int完成不了的功能。还有,其实这些资源的开销对于整个应用程序和现有硬件资源而言就是九牛一毛,微乎其微,没有必要过于在意。就用习惯的形式即可。不要自作聪明的用特别的数据类型,浮点就double,整形就int,长整型就long,其它的必要性都不大(byte的话,用来做数组还是很方便的,除此不推荐使用)


equals 与 == 的区别

  • ==在两个地方比较
    比较基本数据类型的时候,直接对值进行比较
    比较对象,实际上是比较的对象在内存中的内存地址
  • equals实际上也是仅仅比较内存中地址,但是可以通过重写方法实现自己的意图
  • String类型比较特殊
    JVM处理字符串,在内存中有一个单独的区域,叫做字符串缓存区。使用String a = ‘abc’这种方式的时候,先去判断缓冲区中有没有这个值,有的话,直接使用,否则新建一个。而使用a = new (‘abc’);这种方式,每次都会新建,对象判断是不是相等,最好重写equals方法

java的四种引用

  • 强引用—最强的引用类型,如Object o = new Object();只要强引用存在,那么GC回收时必定不回收
  • 软引用(SoftReference)—如果内存空间足够,垃圾回收器就不回收它,如果内存空间不够了,就会回收这部分内存.可以用来实现高速敏感的高速缓存.可以跟引用队列联合使用,如果软引用使用的对象被垃圾回收器回收,就可以把这个软引用加入到与之对应的引用队列中去
  • 弱引用(WeakReference)—垃圾回收器在扫描的时候,只要发现存在弱引用,就会对其进行回收。不管当前内存是否足够。由于垃圾回收器是一个很低的线程,不一定能够快速的发现此弱引用的对象.可以在大量使用图片的时候应用,防止发生OOM

HashCode的作用

  • JVM每new一个对象,都会把它丢到Hash哈希表中去
  • 下次做Object的比较或者取这个对象的时候,就根据这个对象的hashcode值从Hash表中取这个对象。目的是可以提高取对象的效率

具体过程:
- new Object的时候,会根据这个Hash值放到对应的Hash表中去。如果不同的对象得到相同的Hash值,也就是相同Hash值导致冲突的情况,那么就会在这个Hash Key的地方产生一个链表。将产生相同HashCode的对象放到链表中,串在一起
- 比较两个对象的时候,首先根据他们的HashCode去Hash表中去对应的对象。如果两个对象的HashCode相同,就标明他们存放在同一个Hash Key的链表上.这个时候就只能根据equal判断是否相等1 当他们的HashCode不同的话,肯定不能equal


try catch finally,try 里面有return,finally里面的方法还执行吗

  • 会执行。会记录其值,然后等到finally值执行完毕之后再返回值。
  • 如果finally中改变了return的值,return的值就会发生改变

Java异常的包结构,有哪些?

  • Error
    系统级的错误,比如内存溢出,不要指望通过捕获异常可以解决。指合理的应用程序不应该试图捕获的严重问题
  • Exception
    需要捕获或者说需要进行处理的异常。是一种设计or实现问题。它表示,如果程序运行正常。不会发生此情况
  • Throwable
    是java语言中所有异常或者错误的超类。包含两个子类:Error和Exception。提供了printStackTrace等接口用于获取堆栈跟踪数据信息
  • RuntimeException
    是Java虚拟机在正常运行时抛出异常的超类。编译器不会检查。比如:除以0
  • 三种类型:被检查的异常 运行时异常 以及Error

OOM

  • 除了程序计数器以外,虚拟机内存的其他运行时区域都有可能发生OOM
  • java heap溢出
    java堆用于存储对象实例,我们只要不断的创建对象。并且保证GC Roots和这个对象有可达的路径避免垃圾回收器清除。就会在对象数量达到最大堆容量之后导致内存溢出。出现这种问题:1.通过内存映像分析工具(如Eclipse Memory Analyzer)对堆进行分析,确认对象是否是必要的。要分清楚是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。如果是内存泄漏,可以通过工具查看对象到GC Roots的引用链 2.如果不存在内存泄漏,可以查看虚拟机的参数(-Xmx和-Xms)设置是否正确
  • 虚拟机栈和本地方法栈溢出
    如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackOverFlowError异常
    如果虚拟机在拓展栈的时候无法申请到足够的内存空间,将抛出OutOfMemoryError异常
  • 运行时常量池溢出
  • 方法区溢出
    方法区用于存储Class的相关信息,如:类名、访问修饰符、常量池、字符描述、方法描述。异常信息:PermGen space

内存溢出和内存泄漏的区别

  • 内存溢出 out of memory
    指的是程序在申请内存的时候,没有足够的空间供其使用。比如申请了一个integer,但是却存放了一个long型才能存的值
  • 内存泄漏 memory leak
    指的是程序在申请内存之后,无法释放申请的内存空间。单个的内存泄漏危害可能不大。但是堆积之后很严重

java面向对象的三个特征和含义

  • 继承
    从已有类继承信息创建新类的过程.提供继承信息的类叫做父类。得到继承信息的类叫做子类
  • 封装
    把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。编写一个类就是对数据和数据操作的封装。封装就是隐藏一切可以隐藏的东西,只提供最简单的编程接口
  • 多态
    允许不同子类型的对象对同一个消息作出不同的反应。方法重载(overload)是编译时的多态。方法重写(override)是运行时的多态。方法重写(子类继承父类并重写父类中已有的或抽象的方法 2.对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)
0 0
原创粉丝点击