基础类库和垃圾回收机制

第七章
Java的入口方法:
public static void main(String[] args)——该方法由JVM(java虚拟机)调用
Public:访问权限修饰符,说明该方法可以在任何地方被调用。为了让JVM能调用该方法,必须把该方法暴露。
Static修饰符,说明该方法直接用类调用—JVM直接用类来调用该方法
String agrs ——这个数组用于接收用户输入的参数。
编译java源文件后,运行时使用:java 类名 参数1 参数2 参数3…
访问数组的长度:Args.length 访问字符串的长度 字符串.length()
数组的不用括号,字符串使用,原因:length是数组的属性(即成员变量),而字符串的长度是一种方法,通过方法获取。

Scanner类
获取各种输入:
Scanner sc = new Scanner(System.in); 获取键盘输入
Scanner sc = new Scanner(new File(文件名)); 获取文件的内容
方法:
hasNextXxx() 是否还有下一个输入项
nextXxx() 获取下一个数
hasNextLine() 返回输入源中是否还有下一行
nextLine() 获取下一行

System与Runtime

要获取操作系统相关信息,通过System
要获取JVM环境相关的信息,通过Runtime
System的类变量:
in:输入,代表键盘
out:输出,代表屏幕
System方法:所有方法都是类方法,无需创建实例
currentTimeMillis():获取当前时间,返回:从1970年1月1日0时0分0秒到现在经过了多少毫秒,该时间可以非常方便的用于计算。
exit(int status):退出JVM,System.exit(0);//0代表退出值,0代表正常退出
getenv():获取所有的环境变量。
getenv(String name):获取指定的环境变量。String name表示环境变量名称,如”PATH”
getProperties():获取所有系统属性
getPropertity(String name):获取指定的系统属性,String name为指定属性,如:”os.name”表示获取系统的名称

Runtime类:代表JVM运行时环境
Runtime只需要一个实例,应该采用单例模式。
Runtime的类方法:
static Runtime get Runtime():用于获取Runtime实例。
Runtime的实例方法:
exit(int status):和System的exit()方法一样,都是退出JVM,参数0表示正常退出。
exec(String command):运行操作系统上的程序
freeMemory():获取JVM的空闲堆内存
maxMemory():获取JVM的最大堆内存
totalMemory():获取JVM的总共堆内存

Object类:
它是一切类的父类。
通常有3个往往需要被重写的方法:
toString():返回该对象的描述字符串
Equals(Object obj):根据业务规则,提供判断两个对象相等的标准
Hashcode():返回该对象的hashCode值

Objects()
Arrays:操作数组的工具类
Objects:操作对象的工具类,该类的工具方法可以避免NullPointException
Objects类方法:
hashCode(Object o):调用o对象的hashCode方法
isNull(Object o):判断o对象是否为空
Equals(Object a,Object b):判断a对象和b对象是否相等。

字符串:
java的字符串有三个:String、StringBuffer、StringBuilder
在java 9以前,字符串采用char[]数组来保存字符,即字符串的每个字符占2个字节,java 9以后,字符串采用byte[]数组加一个encoding-flag字段来保存字符,即字符串的每个字符只占一个字节。
String:代表字符内容不能改变的字符串。
String方法:
char charSet(int index) 获取字符串中指定位置的字符,返回字符类型。
compareTo(String anotherString):比较两个字符串大小,序列相等,返回0,不相等,返回第一个不相等的字符差,如果较长字符串的前面部分恰巧是较短的字符串,则返回长度。
String concat(String str):将String对象与str连接在一起,和+连接运算一样。
Boolean endsWith(String suffix):返回该String对象是否以suffix结尾。
Boolean startsWith(String perfix):该队是是否以prefix开始。
Int indexOf(String str):找出str字符在该字符串中第一次出现的位置。
Int indexOf(String str,int fromIndex):找出str字符在该字符串中从fronIndex开始后第一次出现的位置。
Int lastIndexOf(String str):找出str字符在该字符串中最后一次出现的位置。·
Int lastIndexOf(String str,int fromIndex):找出str字符在该字符串中从fromIndex开始后最后一次出现的位置。
Int length():返回当前字符串长度
String replace(char oldChar,char newChar):将字符串中第一个oldChar替换成newChar.
String substring(int beginIndex):获取从beginIndex位置开始到结束的子字符串。
Char[] toCharArray():将String对象转成char数组。
String toLoweCase():将字符串转换小写:
String toUpperCase():将字符串转换成大写。
Static String valueOf(X x):一系列用于将基本类型值转换成String对象的方法。

StringBuffer、StringBuilder代表了字符内容可变的字符串,可以向字符串中添加字符、删除字符、修改字符。
StringBuffer是线程安全的、性能较差;StringBuilder是线程不安全的,性能较好。
StringBuilder对象方法:
append(String str):添加字符串,在字符串末尾添加字符串str
insert(int offset,String str):插入字符串,int offset为插入的位置,str为插入的 字符串。
replace():替换字符串
Delete():删除字符串
reverse():将字符串反转
setLength():设置字符串长度,如果过短,将只保留字符串前面的部分。

Math类:用于做数学计算的,它的方法都是类方法。直接用类名调用,无需创建对象。

Random和ThreadLocalRandom
Random是普通的随机数生成器
ThreadLocalRandom是当前线程的随机数生成器。是个单例,没有构造器,只能通过类调用方法获取获取对象。
ThreadLocalRandom rnd = ThreadLocalRandom.current();
int r = rnd.nextInt(65,65 + 26);//生成65~65 + 26之间的随机数

BigDecimal:精确小数
对于float、double两个类型而言,它们保存的小数可能不精确—所有语言都是如此。
因此,如果要比较两个浮点数是否相等,通常计算它们的差,如果差小于一个极小的数,即可认为它们相等。
如果确定需要精确保存两个小数的值,就要使用BigDecimal
//将浮点数包装成BigDecimal
BigDecimal bd1 = BigDecimal.valueOf(0.05);
BigDecimal bd2 = BigDecimal.valueOf(0.01);
BigDecimal add = bd1.add(bd2);//加法
System.out.println(add.doubleValue());
BigDecimal multiply = bd1.multiply(bd2);//乘法
System.out.println(multiply.doubleValue());
BigDecimal divide = bd1.divide(bd2);//除法
System.out.println(divide.doubleValue());

Date:代表日期时间,Date大部分的构造器、方法都已经过时了。
Date():获取当前的日期时间
Date d = new Date();
System.out.println(d);//打印当前时间。
Date(long date):负责将System类的CurrentTimeMillis()返回的 long类型时间转换为Date对象
long lg = System.currentTimeMillis() - 3 * 24 * 3600 * 1000;//当前时间秒数-3天秒数,即三天前的时间。
Date d2 = new Date(lg);
System.out.println(d2);//打印三天前的时间。

GetTime():返回long类型的时间即获取currentTimeMillis()所返回的时间

Calendar:代表日期时间
被设计出来取代Date的。
Calendar采用了模板设计,Calendar本身是一个抽象类,因此实际使用的通常是子类
原本是希望世界上不同的日历都继承Calendar来派生子类。
Java为Calendar提供了一个子类:GregorianCalendar 即公历。
Calendar是个抽象类,不能用new创建对象,只能通过类方法获取实例
获取实例:
Calendar.getInstance();
获取指定字段(年、月、日…)的值:对象.get(Field值) Field可以打印对象看到有哪些变量。
设置指定字字段(年、月、日…)的值,对象.set(Field名 值)
mutable:可变的 Immutable:不可变的
在指定字段(年、月、日…)上添加值。如:
对象.add(Calendar.DAY_OF_YEAR,3)表示往当前日子加了三天即三天后。
getTime()该方法用于获取Calendar对应的Date对象

正则表达式(regular expression):
Regex
一种工具,绝大部分好的语言都应有支持正则表达式。
正则表达式-是一个“字符串模板”,可以代表一批字符串。
每个通配符都代表一个字符:
. 代表任意一个字符
\d 代表任意一个数字(digital)
\D 代表任意一个非数字
\w 代表任意一个单词字符 word
\W 代表任意一个非单词字符
\s 代表任意一个空白
\S 代表任意一个非空白字符
[a-d] []表示范围代表任意一个a-d的任意一个字母字符。
[adm] 表示枚举,代表a、d、m其中任意一个字符
[am4-6] 混合,表示a、m、4-6中的任意一个字符
[^a-d] 求否,代表不是a-d其中的任意一个字符
[a-g&&[^c-e]] 求与:代表既不在c-e的范围内,又要在a-g范围内,只能是a b c d f g五个字符中的任意一个字符。

出现频率:
? 代表前面的字符出现0~1次,如 a?b 即a出现0~1次,可以搜索出ab 或b,

  • 代表前面的字符出现0~N次 如:ab 可以代表b,ab,aaaaaab等。
    \d
    5,即前面数字可以出现0~N次,所以只要前面是数字,后面是5结尾的字符串都符合。
    [0-1]*5 前面只能出现0—1的数字,可以出现0~N次,可以代表05 0005 0101015等
  • 代表前面的字符出现1~N次,例如a+b 可以代表ab aab等,不能只代表b
    \d+b 前面数字出现1~N次,后面结尾只要是5都符合
    [0-1]+5 代表前面0-1数字出现1~N次,后面结尾只要是5都符合
    {m,n}:表示前面的字符穿线m~n次
    {m,} 前面的字符出现m~无限次
    {,n}:前面的字符揣想那0~n次
    {n}前面的字符出现n次
    ^以…开头
    $以…结尾
    成组
    (abc){1,2}表示abc成组的出现,可以出现1-2次,可代表abc、abcabc
    ((abc)|(123))表示可以出现0~N次的abc 或123,可以是abc、abc123、123、空字符串等
    ((abc)
    |(123)*)

String对正则表达式的支持:
String类方法:
Matches(regex),语法:字符串.matches(“正则表达式”):判断字符串是否匹配正则表达式
Spilt(regex),语法:字符串.split(“正则表达式”):根据指定分隔符将字符串分成多段,返回一个数组。
replaceAll(regex,replacement):将regex匹配的内容替换成replacement返回一个新的字符串。

Pattern与Matcher类
用于实现从文本中提取有效的信息,比如手机号码,提取之后就可以随意使用。
Pattern:就代表正则表达式。

Java程序的国际化:
国际化:I18N
实现效果:程序在中国运行,就呈现出中文界面,在日本运行,呈现出日文的界面,美国运行就实现英文界面,即在哪个国家运行,就显示出哪个国家的语言界面。
国际化本质是:查找、替换
思路是:
1、开发人员写的程序中所有的信息,都不直接用字符串,而是用一个Key来代替
2、为每个key都提供对应的字符串value——资源文件,不同的国家需要不同的资源文件。
3、当程序运行时,java的国际化机制会执行查找、替换,将程序中所有的key替换成对应国家资源文件(根据文件名)中的value。

国际化的三个类:
Locale - 代表一个语言、国家环境。
getAvailableLocales(): 获取java所支持的全部Locale
GetDefault(Locale.Category category) 获取当前电脑的Locale

Locale的两个主要组成部分:language 和country

ResoureBundle - 用来加载国际化资源文件。加载后代表一个语言资源包
修改当前语言环境:控制面板—>区域和语言—>格式
程序国际化的步骤:
1、编写国际化资源文件,在java 9以前,国际化资源文件不允许包含非西欧字符——如果国际化资源包含了非西欧字符,需要用native2ascii命令进行处理。从java 9开始,java允许国际化资源文件包含非西欧字符(例如中文、韩文等),只要将国际化资源文件保存为UTF-8字符集即可。
国际化资源的文件名有要求:
A.主文件名必须为_语言代码_国家代码.properties
2、加载国际化的资源文件ResoureBundle…getBundle(BaseName,Locale)
3、根据key来访问value——java国家化机制查找

处理国际化消息的占位符:
MessageFormat:用于为消息中的占位符填充值
MessageFormat.format(带占位符的字符串,new Object[]{}) 前面的字符串有几个占位符,该数组就填几个元素去填充

数值格式化和日期格式化:
Format有三个子类
DateFormat MessageFormat NumberFormat
NumberFormat:可根据Locale来生成对应国家的数字字符串。
DateFormat:将Date对象格式化为日期字符串、时间字符串、日期时间字符串。

SimpleDateFormat:其实用起来更简单、方便。
功能:根据格式字符串来将Date对象(日期)格式化为字符串,也可以将日期字符串恢复成Date对象。
尤其是一些非标准的日期、时间字符串,使用SimpleDateFormat来解析会非常方便。

垃圾回收机制:
特征:
1、垃圾回收机制只负责回收内存中的对象,不会回收物理资源(数据库连接、网络IO等)
2、程序无法精确控制垃圾回收的运行,垃圾回收会在何时的时候进行,当对象永久性时区引用后,系统就会在何时的时候回收它所占的内存
3、在垃圾回收任何对象之前,总会先调用它的finalize()方法,该方法可能使对象重新复活(让一个引用变量重新引用该对象),。从而导致垃圾回收机制取消回收

对象在内存中的状态:三种状态
可达状态:一个对象被创建后,有一个以上的引用变量引用它,处于可达状态
可恢复状态:某个对象不再有任何引用变量引用它,进入可恢复状态,这种状态下,系统的 垃圾回收机制准备回收该对象所占用的内存,在回收该对象之前,系统会调用所有可恢 复状态对象的finalize()方法进行资源清理。如果系统在调用finalize()方法时重新让一个 引用变量引用该对象,则这个对象会再次变为可达状态,否则该对象将进入不可达状态。
不可达状态:当对象与所有引用的变量都被切断,且系统已经调用了所有可恢复对象的 finalize()方法后仍然没有使该对象变为可达状态,该对象将永远失去引用,变成不可达 状态,系统会真正回收该对象所占用的资源。

若一个对象被其他类的类变量引用,则只有类被销毁后,该对象才进入可恢复状态。

强制垃圾回收:
1、调用System类的gc()方法 System.gc();
2、调用Runtime对象的gc()方法:Runtime.getRuntime().gc();
强制垃圾回收机制调用可恢复对象的finalize()方法
1、System.runFinalize();
2、Runtime.getRuntime().runFinalize();

程序无法精准控制Java垃圾回收的时机,但依然可以强制系统进行垃圾回收,但这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收依然不确定,但强制后总会有一些效果。
在没有指定清理资源的情况下,Java采用默认机制来清理对象资源,即垃圾回收机制回收某个对象之前,会调用该对象的finalize()方法,对象失去引用后,只有当程序认为需要更多额外的内存时,垃圾回收机制才会进行垃圾回收,因此何时调用该对象的finalize()方法时不确定的,可以强制系统调用可恢复状态对象的finalize()方法,finalize()方法具有如下特点:
1、永远不要主动调用finalize()方法,该方法教给垃圾回收机制调用,finalize()方法何时被调用,是否被调用具有不确定性,只有当程序认为需要更多额外内存时,才会调用。
2、调用该方法有可能使可恢复状态的对象变为可达状态
3、JVM执行finalize()方法时出现异常,垃圾回收机制不会报告异常,程序继续执行。

强、软、弱、虚引用:
强引用(StrongReference):创建对象直接把对象赋给一个引用变量,通过引用变量可以操作 实际的对象,当对象被一个或多个引用变量引用,处于可达状态,不可能被垃圾回收机 制回收。
软引用(SoftReference):软引用需要通过SoftReference类实现,对象若只有软引用,有可能 被垃圾回收机制回收,当系统内存足够时,不会回收,当系统内存空间不足时,系统可 能会回收它,软引用通常用于对内存敏感的程序中,使用:
弱引用(WeakReference):弱引用通过WeakReference类实现,引用级别低于软引用,当系统 垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。并不会 创建就回收,只有垃圾回收机制运行时才回收。
虚引用(PhantomReference):通过PhantomReference类实现,虚引用类似于没有引用,对象 若只有虚引用,跟没有引用的效果大致相同,虚引用主要用于跟踪对象垃圾回收的状态, 虚引用不能单独使用,必须和引用对象(ReferenceQueue)联合使用。

优势:
1、配合引用队列(ReferenceQueue)使用:引用队列用于保存回收后对象的引用。当联合软引用或弱引用使用时,系统在回收引用对象之后,把回收对象对应的引用添加到关联队列中。
当联合虚引用使用时,系统在回收引用对象之前就把回收对象对应的虚引用添加到它关联的引用队列中,因此可以在对象被回收之前采取行动。

2、要使用这些特殊的引用类就不能保存对象的强引用,否则不能体现这些引用类的好处。使用软、弱、虚引用,垃圾回收机制能够随意地释放对象,可以尽可能减少程序在其生命周期中所占用的内存。

四个引用都有get方法,获取被它们引用的对象。除了虚引用无法获取引用对象。
使用:先创建强引用,在通过其他引用包装成对应的引用。
String s = new String(“dwhau”);
WeakReference wr = new WeakReference(s);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值