首页 > 基础资料 博客日记

Java 知识点(部分)

2023-08-03 19:29:41基础资料围观234

这篇文章介绍了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

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


文章来源:https://www.cnblogs.com/CaiDingChao/p/16524262.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云