Java常见类 学习小结

常见类

包装类

自动装箱(int->Integer): Integer.valueOf(i)

自动拆箱(Integer->int): integer.intValue()

当包装类类和基本类型比较的时候,会将包装类自动拆箱,所以比较结果总是True。

Integer中有一个缓存,在自动装箱的时候 Integer i = 1
,调用valueOf方法将基本数据类型转化为Integer对象,如果这个数字 i >= IntegerCache.low && i <= IntegerCache.high
一般是-128~127,则会从缓存的cache数组中取出对象而不创建新的对象,否则调用 new Integer()

// Integer源码
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

如果新建了Integer对象,那么相同数值对应的Integer对象也会不同。即 i1 == i2
返回False,否则返回True,因为都是取了cache中的对象,没有新建,提高效率(不设置更大范围,优化内存,只设置常用的)。

Double中就没有cache对象数组。

String

String str = "abc"
字符串放在常量池,在1.7以前在方法区,1.7之后在堆空间。和 String str = new String("abc")
的地址不同,后者是指向对象。

String为finally对象,不能被继承。

String为不可变对象,指的是String类内的 private final char[] value
数组是唯一对应的,value不能改变引用的数组,但是value应用数组的值可以通过反射进行访问和修改。

equals()

对象地址相同返回True,否则取每个字符串的value赋值给字符串数组,然后逐位字符比较。

charAt(i)

直接返回 value[i]

intern()

如果常量池里面包含str中的字符串值(用equals判断),则直接返回这个常量地址。

String a = "abc";
String b = new String("abc");
print(a == b); // False 一个指向常量池,一个指向对象
print(a == b.intern()); // True intern()找到常量池中abc的地址

StringBuffer & StringBuilder

StringBuilder: 效率高

StringBuffer: 线程安全(synchronized)

日期格式化

Date date = new Date();
// pattern中,yyyy代表年保留四位数字,其余同理,如果让月日等信息保留两位数的格式就要写两个
// 字母代表的意思可以到官网查api
DateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dataFormat.format(date));

在定义好dataFormat对象以后,它已经知道你的日期格式,就可以使用 date = dataFormat.parse("2020-1-1 10:19:21");
来得到date对象,与format作用相反。

Calendar用法:

// 用dateFormat构造出date对象
DateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dataFormat.parse("2020-1-1 10:19:21");
// Calendar用法:不能直接new,因为其构造方法为protected,要使用getInstance
Calendar calendar = Calendar.getInstance();
calendar.setTime(date); // 将date对象传入,否则展示的是当前时间
// get()的参数为int,在Calendar中有对应各个值对应的常量序号
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DATE));

枚举类

需要使用一组常量时,建议使用枚举类。

用法示例

public class EnumTest
{  
   public static void main(String[] args)
   {
      System.out.println("直接用常量名访问:" + Size.SMALL);
      Scanner in = new Scanner(System.in);
      System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
      String input = in.next().toUpperCase(); // 忽略大小写(全部转大写)
      Size size = Enum.valueOf(Size.class, input); // 根据输入的值,通过反射获取枚举类型中的常量
      System.out.println("size=" + size);
      System.out.println("abbreviation=" + size.getAbbreviation());
      if (size == Size.EXTRA_LARGE) // 比较时,用 ==,而不需要用equals
         System.out.println("Good job--you paid attention to the _.");      
   }
}

enum Size
{
   SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

   private Size(String abbreviation) { this.abbreviation = abbreviation; } // 只能由编译器调用
   public String getAbbreviation() { return abbreviation; }

   private String abbreviation;
}
Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) SMALL
直接用常量名访问:SMALL
size=SMALL
abbreviation=S

如果写了abbreviation参数,如SMALL("S")这种形式,就一定要定义构造方法private Size(String abbreviation),否则会报错。

原文 

https://segmentfault.com/a/1190000023176788

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java常见类 学习小结

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址