JAVA基础-易忘总结(小点混合)

  • java易混淆点记录
  • 一、NULL:定义()//TODO
  • 二、static修饰的变量对类的所有对象都是同一个
  • 三、正则 记录
  • 四、equals与等号(==)的区别

java易混淆点记录

把学习或工作中遇到的java语言中容易混淆、忘记的知识点或用法记录下来。

一、NULL:定义()//TODO

1、SimpleDateFormat的format入参会报空指针异常:
就变成null.getTime(),必然会报空指针异常;

由于空指针异常是运行时异常,编译时不会被检查出来,所以在使用SimpleDateFormat的format(Date date)方法时,请做非空判断,或异常处理。

2、null不能给基础类型赋值,只能给引用类型赋值

二、static修饰的变量对类的所有对象都是同一个

例子:

//Π定义为:static double pi=3.1415;//实例化的所有对象的pi都是该值,可修改

Circle c1=new Circle();

Circle c2=new Circle();

c1.pi=4;
//此时,再去查pi则,c1与c2的pi都是4;按照实际情况,pi不能更改,它是个定值,因此定义时应加上final,让该值无法修改

final static double pi=3.1415;

PS:1、static关键字的作用,规范性讲:static成员(属性和方法)属于类而不属于对象,不能依赖任何实例!

2、定义变量时用final修饰,则该变量不能修改,final修饰的类不可继承。

3、属性声明的时候不给值会报错吗?

答:不会,因为属性有默认值,数值的默认值为零,Boolean的默认值为false,引用类型的默认值为null;

4、静态方法能否直接访问实例方法或者属性? 不能,比如System.out.println()这也是静态方法(static),Arrays.toString()同样,直接通过类访问

实例方法能否直接访问静态方法或者属性? 可以;

三、正则 记录

//使用正则提取一个字符串中的数字
Pattern pattern=Pattern.compile("\\d+");
String str = "今天吃了1碗饭,3个包子,5斤西瓜,12ml白酒";
Matcher matcher=pattern.matcher(str);
while(matcher.find()) {
	System.out.println(matcher.group());
}

//座机号码的正则怎么写?
//第一位必须是0,第二位必须为1-9的一个,后面可以有1-2为数字,接着是分隔符-,然后第一位必须为1-9,后面有6-7位数字
String pattern1="0[1-9]\\d{1,2}-[1-9]\\d{6,7}";

//邮箱
String pattern2="\\w+@\\w+([.]\\w{2,4}){1,2}";

四、equals与等号(==)的区别

例子:先做题再看解析

//String类的equals()方法
String a = "abc";// abc放在常量池中
String b = "abc";//栈中b指向常量池中已有的abc
String c = new String("abc");// 在堆内存中重新开辟了一个abc的空间
/**检查字符串池里是否存在"abc"该字符串,若存在,就返回池里的字符串;
若不存在,该方法会 把"abc"添加到字符串池【常量池】中,再返回它的引用。
*/
String d = c.intern();
  
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(c));
System.out.println(a==d);
System.out.println(a.equals(d));
/**执行结果
true
true
false
true
true
true
*/

背景介绍----常量数据放于常量池,变量存于栈,对象存于堆内存
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作

equals用来比较的是两个对象的内容是否相等(某些情况和==用法一样,某些情况比较内容是否相等),JAVA当中所有的类都是继承于Object这个基类的,在Object基类中equals用来比较对象的内存地 址 , 但在一些类库equals方法被覆盖了,如在类String,Integer,Date中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

java中的数据类型可以分为两类:
1、基本数据类型
byte,short,char,int,long,float,double,boolean
基本数据类型之间的比较需要用双等号(==),因为他们比较的是值
2、引用数据类型
接口、类、数组等非基本数据类型

Java中的字符串String属于引用数据类型。因为String是一个类,当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,同一个new出来的对象,比较后的结果为true,否则结果为false。因为每new一次就会重新开辟一个新的堆内存空间

Entity entity = new Entity();
Entity entity1 = new Entity();
Entity entity2 = entity;
 
System.out.println(entity==entity2);
System.out.println(entity.equals(entity2));

System.out.println(entity.equals(entity1));
System.out.println(entity==entity1);
/**执行结果
true
true
false
false
*/

equals方法源码:
Object源码中

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

String类重写后的源码

public boolean equals(Object var1) {
  if (this == var1) {
   return true;
  } else {
   if (var1 instanceof String) {
    String var2 = (String)var1;
    int var3 = this.value.length;
    if (var3 == var2.value.length) {
     char[] var4 = this.value;
     char[] var5 = var2.value;

     for(int var6 = 0; var3-- != 0; ++var6) {
      if (var4[var6] != var5[var6]) {
       return false;
      }
     }

     return true;
    }
   }

   return false;
  }
 }

总结:
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

== 的作用
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
equals 的作用:
  引用类型:默认情况下(Object类),比较的是地址值,重写该方法后比较对象的成员变量值是否相同(String类等)