Java常用类,指导手册
文章目录
- 常用类
- Objects
- `equals()`
- `isNull()`
- `requireNonNull()`
- Math
- Arrays
- `binarySearch()`
- `toString()`
- `sort()`
- `copyOf()`
- BigDecimal
- 概念
- 常用构造方法
- 常用方法
- 加减乘除
- 获取对应数字类型
- Date
- DateFormat
- `format()`
- `parse()`
- Calendar
- ==注意==
- `get()`
- `set()`
- `add()`
- `getTime()`
- `getActualMaxinum()`
- 字符串
- String
- 存储
- 字符串常量池
- ==引申==:为什么要避免“+”拼接?
- 构造方法
- `String(byte[] bytes)`
- `String(byte[] bytes,String charsetName)`
- 常用方法
- `subString()`
- StringBuilder 和 StringBuffer
常用类
Objects
equals()
源代码:
public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));
}
在使用 Objects
的 equals 方法前,我们要保证,我们对比的对象,也重写了 equals 方法
我们之所以不直接使用比对对象重写的 equals 方法,是因为担心比对对象的某一个是 null:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llpmPxq2-1619949680298)(/Users/faro_z/Library/Application Support/typora-user-images/image-20210430132841642.png)]
使用 Objects.equals(),是会进行空判断的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWdQ872h-1619949680300)(/Users/faro_z/Library/Application Support/typora-user-images/image-20210430133002380.png)]
用这个方法来判断 String,可以保证不会出现空指针异常
isNull()
判断对象是否为空
public static boolean isNull(Object obj) {return obj == null;
}
requireNonNull()
如果传入的对象为空,抛出异常
public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;
}
Math
这个看 API 文档就好了
Arrays
binarySearch()
二分查找,其重载很多,具体看 APi 或者代码提示
在使用前,一定要对数组进行排序
toString()
就是将数组变为字符串
这里,我主要看中源码作者对 for 循环的使用方法
public static String toString(int[] a) {if (a == null)return "null";int iMax = a.length - 1;if (iMax == -1)return "[]";StringBuilder b = new StringBuilder();b.append('[');for (int i = 0; ; i++) {b.append(a[i]);if (i == iMax)return b.append(']').toString();b.append(", ");}}
sort()
顾名思义,就是排序
源码作者使用的是快速排序
public static void sort(int[] a) {DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}
copyOf()
用来为数组进行动态扩容
public static int[] copyOf(int[] original, int newLength) {int[] copy = new int[newLength];System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));return copy;}
使用方法如下:
int[] arr={3,6,23,7,0,65,1};
System.out.println(arr.length);
arr = Arrays.copyOf(arr, 20);
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
BigDecimal
概念
java 中的 double 进行加减法运算,会出现精度问题
这对于有高精度要求的程序,是致命的
而 BigDecimal,就是为了解决这一问题
常用构造方法
public BigDecimal(String val) {}
常用方法
加减乘除
获取对应数字类型
Date
所有对应方法都已经过时,现在 Date 只有一个作用,就是表示时间
DateFormat
用来格式化时间
一般,都是使用其子类SimpleDateFormat
format()
将 Date()类型,按照指定格式格式化
public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒"); String text = sdf.format(new Date()); System.out.println(text); }
y : 年
M : 月
d : 日
H : 时
m : 分
s : 秒
S : 毫秒
SimpleDateFormat中,只有占位符的位置会被替换,其他的部分可以按照要求随意填写
public static void main(String[] args) { // SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String text = sdf.format(new Date()); System.out.println(text); }
parse()
按照指定格式,解析时间字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = sdf.parse("2021-5-2 15:25:00");System.out.println(date.getTime());
Calendar
这玩意儿,是为了能通过不同时区,创建时间对象的
我们知道,泰国,日本使用的时间比较特殊,比如说日本,是什么水曜年这些东西,那这些年的表示,就需要使用 Calendar
因为 Calendar 是抽象类,所以,我们要调用 getInstance()方法,去获取对象:
调用 getInstance()构造:
public static Calendar getInstance(TimeZone zone, Locale aLocale) { return createCalendar(zone, aLocale); }
private static Calendar createCalendar(TimeZone zone, Locale aLocale) { CalendarProvider provider = LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) .getCalendarProvider(); if (provider != null) { try { return provider.getInstance(zone, aLocale); } catch (IllegalArgumentException iae) { // fall back to the default instantiation } } Calendar cal = null; if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { switch (caltype) { case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } } if (cal == null) { // If no known calendar type is explicitly specified, // perform the traditional way to create a Calendar: // create a BuddhistCalendar for th_TH locale, // a JapaneseImperialCalendar for ja_JP_JP locale, or // a GregorianCalendar for any other locales. // NOTE: The language, country and variant strings are interned. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") { cal = new BuddhistCalendar(zone, aLocale); } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" && aLocale.getCountry() == "JP") { cal = new JapaneseImperialCalendar(zone, aLocale); } else { cal = new GregorianCalendar(zone, aLocale); } } return cal; }
注意
Calendar 的月,是从0开始的,也就是说我们的 5 月,在 Calendar 中,显示的是 4
get()
按照单位,获取数据
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
System.out.println(year);
set()
cal.set(Calendar.YEAR,1); //将年份设置为 1
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
System.out.println(year);
System.out.println(month);
add()
按照指定单位,增加年份
Calendar cal = Calendar.getInstance();
System.out.println("当前年份:"+cal.get(Calendar.YEAR));
cal.add(Calendar.YEAR,1);
System.out.println("年份+1后:"+cal.get(Calendar.YEAR));
下面这个实验,说明,calendar 中,月份的范围是0-11
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH,11);
System.out.println("将当前月份设置为 11(实际为 12 月):"+cal.get(Calendar.MONTH));
cal.add(Calendar.MONTH,1);
System.out.println("为月份+1后:"+cal.get(Calendar.MONTH));
getTime()
获取日历时间表示的 Date 对象
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
getActualMaxinum()
获取当前单位的最大值
获取当前年份的最大月数:
Calendar cal = Calendar.getInstance();
System.out.println(cal.getActualMaximum(Calendar.MONTH));
注意:因为 Calendar 的月,是从 0 开始数的,所以,这里显示的 11,其实是 12 月!!
字符串
String
存储
如果两个字符串内容完全相同,则指向同一个内存区域
字符串常量池
使用字符串常量池的目的,是为了保证字符串的使用效率,不然,频繁的创建和销毁,会影响系统的性能。
字符串常量池在方法区中
下面,给个图示:
String str1 = “abc”;
String str2 = “abc”;
String str3 = “abc”;
String str4 = new String(“abc”);
String str5 = new String(“abc”);
String str6 = new String(“abc”);
了解了上面的知识,我们可以出一个面试题:
面试题:String str4 = new String(“abc”) 创建多少个对象?
- 在常量池中查找是否有“abc”对象
- 有则返回对应的引用实例
- 没有则创建对应的实例对象
- 在堆中 new 一个 String(“abc”) 对象
- 将对象地址赋值给str4,创建一个引用
所以,常量池中没有“abc”字面量则创建两个对象,否则创建一个对象,以及创建一个引用
引申:为什么要避免“+”拼接?
假设我们有这么一段代码:
String text1 = "锄禾日当午";
String text2 = "汗滴禾下土";
String text3 = "床前明月光";
text1=text1+text2+text3;
System.out.println(text1);
我们来看看在内存中,是个什么样子:
- 创建完三个新字符串,是这个样子:
- 每次“+”,都要在字符串常量池新申请一个空间
- 不再被使用的区域,成了“垃圾”,(但不会被回收)
text1 在拼接前指向的位置,和拼接中的副产物,因为不会再被引用(除非又有一个新字符串,内容和这两个部分一模一样),所以成了’垃圾’,但是因为字符串常量池是永久代,所以,这些‘垃圾’不会被 GC 回收,会一直存在于内存中。
所以,如果大量使用“+”去拼接字符串的话,久而久之,就会在内存中,产生大量不会去被回收的垃圾,那程序就会越运行,越卡
就是因为上面的原因,很多人用 java 搞爬虫,一旦用了很多“+”操作,就会导致程勋运行占用大量内存
如果要搞字符串拼接,请使用 StringBuffer,或者StringBuilder
构造方法
我们一般直接使用String str = "aaa"
这种方式创建,但是也会有下面这些方式创建
String(byte[] bytes)
通过字节数组创建
String(byte[] bytes,String charsetName)
指定编码类型,通过字节数组创建
常用方法
subString()
获得子串,包头去尾
String str = "abcde";
System.out.println(str.substring(1,2));
StringBuilder 和 StringBuffer
二者的使用其实差不多,区别只是在于线程是否安全
StringBuilder线程不安全,但是效率高
StringBuffer线程安全,但是效率低
我们就那 StringBuilder 举例:
StringBuilder sb = new StringBuilder();
sb.append("锄禾日当午");
sb.append("汗滴禾下土");
System.out.println(sb.toString());
使用 append()
替代 String 中的“+”操作,append
过程中,产生的垃圾,因为是在新生代,所以会被 GC 回收,这样,就不会造成内存浪费
Java常用类,指导手册相关推荐
- 返回值 包装类_(九)Java常用类
(九)Java常用类 String类 概述 /*String:字符串,使用一对""来表示. * 1.String声明为final,不能被继承. * 2.String实现了Seria ...
- java 类 函数,java常用类和函数
JAVA中常用类的常用方法_计算机软件及应用_IT/计算机_专业资料.. JAVA 中常用类的常用方法 一. java.lang.Object 类 1. clone ()方法 创建并返回此对象的... ...
- Java常用类(谷粒商城学习记录)
Java常用类 谷粒商城学习记录 谷粒商城学习记录 谷粒商城学习记录 干嘛老是提示我与别人的文章相似呢?真的是我自己整理的啊啊啊 老是提示与这个文章相似 https://blog.csdn.net/c ...
- JavaEE基础第9章Java常用类
第9章Java常用类 字面量的定义方式都是存在常量池中的,常量池中不会存储多个一样的字符串,在定义一个字符串的时候会先去常量池中找有没有存在的,有就将地址传过去,没有就新建. String字符串 概念 ...
- 这些Java常用类,你必须要学会,还不快快收藏?(近两万字详细介绍)
零基础学习之Java常用类 概述 包装类 和数学相关的类 String类 创建字符串对象 使用构造方法 使用静态方法 使用" " + 拼接 字符串对象的比较 字符串的常用方法 可变 ...
- Java常用类之要点总结
Java常用类之要点总结
- java map常用类及其方法_Day50.Map类常用的方法 -Java常用类、集合#、IO
Day50.Map类常用的方法 -Java常用类.集合#.IO Day50.Map类常用的方法 -Java常用类.集合#.IO Map类常用的方法 . 总结: 常用方法 添加: put(Object ...
- java常用类的方法,java常用类的使用方法
java常用类的使用方法 Interger:整数类型 1.属性. static int MAX_VALUE:返回最大的整型数: static int MIN_VALUE:返回最小的整型数: stati ...
- 48 java常用类_10 _Calendar类
48 java常用类_10 _Calendar类 Calendar提供了获取或设置各种日历字段的方法. 构造方法 : protected Calendar(); //由于修饰符是protected,所 ...
- java 常用类 - 大数据运算
java 常用类 - 大数据运算 在 Java中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类.这两个类用于高精度计算,其中 ...
最新文章
- 开放源码,华为鸿蒙HarmonyOS 2.0来了
- python键盘输入代码,python监控键盘输入实例代码
- Hadoop权威指南学习笔记三
- 又肝了下微服务 API 网关“金刚”,也是蛮香的~
- android 自定义刷新控件,Android开发中MJRefresh自定义刷新动画效果
- 如何写一手好 SQL 【频繁出现慢SQL告警的优化方案】
- Bash数组操作教程
- Oracle dbms_random随机函数包
- 菜鸟驿站发布“新成长计划” 未来三年要让站点平均收入翻倍
- 两年质保,只此一加!一加9系列推出两年质保
- 【Swing】了解Swing,Swing是什么?
- java虎牙app弹幕_虎牙直播随机弹幕插件(OBSS)
- 高通SDX12:SFE(shortcut-fe)软加速驱动效果调测
- total commander 自定义快捷键
- TIA博途S7-1200学习笔记——指令集
- 量子加密通信与量子传感技术相关精简介绍
- 《版式设计——日本平面设计师参考手册》—第1章如何存储旧版本的InDesign文件...
- 湖北电信天邑TY1608_S905L3B_MT7668_卡刷固件包
- C#在Pdf画统计图表之【雷达图】(以五边形为例)
- 基于Sentence-Bert的检索式问答系统
热门文章
- python 题库app_中国大学MOOC的APP慕课2021用Python玩转数据题库及答案
- Cookie、代理服务器
- pages使用教程|图像填充功能如何使用?怎么样在pages文稿中用图像填充文本?
- 20145202马超《java》实验四
- VC++软件界面风格简单美化
- 计算机 小学数学应用题教学设计,小学数学优秀教学设计让信息技术走进数学课堂...
- Flask最基本示例
- 收件地址解析成 省+市+区+详细地址的形式
- DSHOW 显示视频
- ssm毕设项目理发店预约系统wc712(java+VUE+Mybatis+Maven+Mysql+sprnig)