Java教程

Java 知识点(部分)

本文主要是介绍Java 知识点(部分),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java 知识点(部分)

String & StringBuilder & StringBuffer

==String类==

从类的声明,我们看出,String类继承了Serializable,Comparable和CharSequence接口

主要的属性有:valuehash

value是一个字符数组,用来存储字符串

hash是Stringhash值缓存,方便比较

  • String是不可以修改对象的。

  • StringBuilder和StringBuffer可以修改对象的。

  1. String是不可变的,如果尝试去修改,会新生成一个字符串对象,StringBuffer和StringBuilder是可变的

  2. StringBuffer是线程安全的,StringBuilder是线程不安全的,所有在单线程环境下StringBuilder的效率会高一点

 是否可变是否安全性能
String 不可变 安全
StringBuilder 可变 不安全
StringBuffer 可变 安全 较高

数组==null & 数组长度为0

数组是一个空对象

int[] array = null; 数组为空,此时array不指向任何对象;

数据里面的元素为0

int[] array = new array[0]; // 定义一个长度为0的数组;
int[] array = new array[2]; // 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null;

两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常

if(array == null || 0 == array.length) {...}   // 这种写法正确

== 和equals

==面试题:==和equals的区别==

====:==

  1. 可以使用在基本数据类型变量和引用数据类型变量中

  2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型要相同)

  3. 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体

String s1 = new String("atguigu");
String s2 = new String("atguigu");
System.out.println(s1 == s2);  //false
String s1 = "atguigu";
String s2 = "atguigu";
System.out.println(s1 == s2);  //true

==equals()方法==

  1. 是一个方法,而非一个运算符

  2. 基本数据类型没有方法调用,只能使用引用数据类型来调用

  3. Object类中的equals()方法的定义:

public boolean equals(Object obj){  
    return (this == obj);
}

说明:Object类中的定义的==equals()== 和 == 定义是相同的,是比较两个对象的地址值是否相等

  1. String、Data以及其他类型的equals()方法并不是像3中那样定义的,而是进行了重写Object中的equals(),比较的不是地址值了,而是比较的两个对象的“实体内容”是否相同

  2. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object中的euqals()方法进行重写,具体的重写方法如下:Customer是一个类

@Override
public boolean equals(Object obj){  
    if(this == obj){    
        return true;  
    }  
    if(obj instanceof Customer){    
        Customer cust = (Customer)obj;   
        //比较两个对象的每个属性是否相同    
        return this.age = cust.age && this.name.equals(cust.name);  
    }  return false;
}

 

其实就是比较对象里面的所有的属性是否一致,一致就返回true,不一致就返回false

简述final

  • 修饰:表示类不可被继承

  • 修饰方法:表示方法不可被子类覆盖(override),但是可以重载(overload)

  • 修饰变量:表示变量不可以被修改

为什么 局部内部类 和 匿名内部类 只能访问局部final变量?

因为:因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效

finally:异常捕获的时候需要用到的,try中return后的代码会执行吗?会的,调用finally的时机是try块真的要return时。

finalize:是Object类中的一个方法。垃圾回收机制中 如果想被回收的时候不是真的被回收,第二次被gc回收的时候才能回收。finalize()只会在对象内存回收前被调用一次

接口 VS 抽象类

  • 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法

  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能public static final

  • 抽象类只能继承一个,接口可以实现多个

接口的设计目的,是对类的行为进行约束 like a

抽象类的设计目的,是代码复用,现有子类,再有父类,对子类的共同部分进行提取,抽象类是不可以实例化的。

这篇关于Java 知识点(部分)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!