疯狂java讲义总结-NO7
1.正则表达式是一个强大的文本处理工具,通过正则表达式,可以对文本内容进行查找、替换、分割等操作。
2.main()方法为什么采用这个方法签名:
(1)public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main()方法,所以使用public修饰符把这个方法暴露出来。
(2)static修饰符:JVM调用这个主方法时,不会先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过该类来调用主方法,因此使用static修饰该主方法。
(3)void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值。
3.main方法中arg参数是一个长度为0的数组。
4. 使用Scanner类可以很方便地获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner:类提供了多个构造器,不同的构造器可以接收文件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。
5.Scanner扫描输入方法:
(1)hasNextXxx():是否还有下一个输入项,如果只是判断是否包含下一个字符串,则直接使用hasNext()。
(2)nextXxx():获取下一个输入项。
6.在默认情况下,Scanner使用空白(包括空格、Tab空白、回车)作为多个输入项直接的分隔符。
7.System.in代表标准输入,也就是键盘输入。
8.为Scanner设置分隔符使用useDelimiter(String pattern)方法即可,该方法的参数应该是一个正则表达式。
9.Scanner逐行读取方法:
(1)boolean hasNextLine():返回输入源中是否还有下一行。
(2)String nextLine():返回输入源中下一行的字符串。
10.Scanner不仅能读取键盘输入,也可以读取文件输入。
例:Scanner sc=new Scanner(new File(“test.java”));
11. System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数.
12. 除此之外,System类的in、 out和err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn(), setOut()和setErr()方法来改变系统的标准输入、标准输出和标准错误输出流。
13. System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不能唯一地标识该对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。
public class IdentityHashCodeTest
{
public static void main (String[] args)
{
//下面程序中s1和s2是两个不同的对象
String s1=new String("Hello");
String s2=new String("Hello");
//String重写了hashCode()方法—---改为根据字符序列计算hashCode值
//因为s1和s2的字符序列相同,所以它们的hashCode()方法返回值相同
System.out.println(sl.hashCdde()+”---”+s2 .hashCode());
//s1和s2是不同的字符串对象,所以它们的identityHashCode值不同
System.out.println(System.identityHashCode(s1)
+”---”+System.identityHashCode(s2));
String s3="Java";
String s4="Java";
//s3和s4是相同的字符串对象,所以它们的identityHashCode值相同
System.out.println(System.identityHashCode(s3)
+”---",+System.identityHashCode(s4));
}
}
所以任何两个对象的identityHashCode值总是不相等。
14. public class SystemTest
{
public static void main(String [] args)throws Exception
{
//获取系统所有的环境变量
Map<String,String> env=System.getenv();
for(String name:env.keySet())
{
System.out.println(name+"---"+env.get(name));
}
//获取指定环境变量的值
System.out.println(System.getenv("JAVA_ HOME"));
//获取所有的系统属性
Properties props=System.getProperties();
//将所有的系统属性保存到props.txt文件中
props.store(new FileOutputStream("props.txt"),
"System Properties");
//输出特定的系统属性
System.out.println(System.getProperty("os.name"));
}
}
上面程序通过调用System类的getenv(), getProperties(), getProperty()等方法来访问程序所在平台的环境变量和系统属性,程序运行的结果会输出操作系统所有的环境变量值,并输出JAVA HOME环境变量,以及os.name系统属性的值。
15.Runtime类代表java程序的运行时环境,可以访问JVM的相关信息,如处理器数量、内存信息等。
public class RuntimeTest
{
public static void main(String [] args)
{
//获取Java程序关联的运行时对象
Runtime rt=Runtime.getRuntime();
System.out.println("处理器数量:”+rt.availableProcessors());
System.out.println("空闲内存数:”+rt.freeMemory())
System.out.println("总内存数:”+rt.totalMemory());
System.out.println("可用最大内存数:”+rt.maxMemory());
}
}
16.Runtime类还有一个功能,它可以直接单独启动一个进程来运行操作系统的命令。
例:Runtime rt=Runtime.getRuntime();
//运行记事本程序
rt.exec(“notepad.exe”);
17.Object类提供了如下几个常用的方法:
(1)boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是,两个对象是 同一个对象,因此该equals()方法通常没有太大的实用价值。
(2)protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
(3)Class<?> getClass():返回该对象的运行时类。
(4)int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算(即与System.identityHashCode(Object x)方法的计算结果相同)。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值。
(5)String toString():返回该对象的字符串表示,当程序使用System.out.println()方法输出一个对象, 或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。Object类的toString()方法返回“运行时类名@十六进制hashCode值”格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。
除此之外,Object类还提供了wait()、notify()、notifyAll()几个方法,通过这几个方法可以控制线程的暂停和运行。
18. Java还提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所自我克隆”就是得到一个当前对象的副本,而且二者之间完全隔离。由于Object类提供的clone()方法使用了protected修饰,因此该方法只能被子类重写或调用。
自定义实现克隆步骤如下:
(1)自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法。
(2)自定义类实现自己的clone()方法。
(3)实现clone()方法时通过super.clone():调用Object实现的clone()方法来得到该对象的副本,并返回该副本。
19. Object类提供的Clone机制只对对象里各实例变量进行“简单复制”,如果实例变量的类型是引用类型,Object的Clone机制也只是简单地复制这个引用变量,这样原有对象的引用类型的实例变量与克隆对象的引用类型的实例变量依然指向内存中的同一个实例。
20. 比如clone一个包含100个元素的int[]用系统默认的clone方法比静态copy方法快近2倍。
21. 需要指出的是,Object类的clone()方法虽然简单、易用,但它只是一种“浅克隆”—它只克隆该对象的所有成员变量值,不会对引用类型的成员变量值所引用的对象进行克隆。如果开发者需要对对象进行“深克隆”,则需要开发者自己进行“递归”克隆,保证所有引用类型的成员变量值所引用的对象都被复制了。
22.String类是不可变类,而StringBuffer则代表一个字符序列可变的字符串,StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能。
23. (1)char charAt(int index)获取字符串中指定位置的字符。
(2)String concat(String str)
(3)boolean equals(Object anObject)
(4)boolean endsWith(String suffix)返回该String对象是否以suffix结尾。
(5)boolean equalsIgnoreCase(String str)
(6)byte[] getBytes()将该字符串对象转换成字符数组。
(7)int indexOf(int ch)找出ch字符在该字符串中第一次出现的位置。
(8)int lastIndexOf(int ch)
(9)String replace(char oldChar,char newChar)将字符串中的第一个oldChar替换成newChar。
(10)boolean startsWith(String prefix)
(11)String substring(int beginIndex)获取从beginWith位置开始到结束的子字符串。
String substring(int beginIndex,int endIndex)
(12)char[] toCharArray()
(13)String toLowerCase()
(14)String toUpperCase()
(15)static String valueOf(X x)将基本类型转换为String对象的方法。
24.因为String是不可变的,所以会额外产生很多临时变量,使用StringBuffer和StringBuilder就可以避免这个问题。
25.capacity属性表示StringBuilder的容量,capacity通常比length大,程序通常无需关心capacity属性。
26. public class StringBuilderTest
{
public static void main (String[]args)
{
StringBuilder sb=new StringBuilder();
//追加字符串
sb.append("Java");// sb="java"
//插入
sb.insert(0,"hello ”)//sb="hello java"
//替换
sb.replace (5,6,”,”);//sb="hello, java"
//删除
sb.delete(5,6);//ab="hellojava"
System.out.println(sb);
//反转
sb.reverse();//sb="avajolleh"
System.out.println(sb);
System?out.println(sb.length());//输出9
System.out.println(ab.capacity());//输出16
//改变StringBuilder的长度,将只保留前面部分
sb.setLength(5);//sb="avajo"
System.out.println(sb);
}
}
27. Java提供了Math工具类来完成这些复杂的运算,Math类是一个工具类,它的构造器被定义成private的,因此无法创建Math类的对象;Math类中的所有方法都是类方法,可以直接通过类名来调用它们。
28.Math还提供了两个类变量:PI和E
29. Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。
30. ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。
31. Random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对它们以同样的顺序调用方法,则它们会产生相同的数字序列。
32. 当两个Random对象种子相同时,它们会产生相同的数字序列。值得指出的,当使用默认的种子构造Random对象时,它们属于同一个种子。
33. 只要两个Random对象的种子相同,而且方法的调用顺序也相同,它们就会产生相同的数字序列。也就是说,Random产生的数字并不是真正随机的,而是一种伪随机。
34. 为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间作为Random对象的种子。
Random rand=new Random(System.currentTimeMillis());
35. ThreadLocalRandom sand = ThreadLacalRandom.current();
//生成一个4~20之间的伪随机整数
int vall = rand.nextInt(4,20);
//生成一个2.0~10.0之间的伪随机浮点数
int va12 = rand.nextDouble(2.0, 10.0);
36. BigDecimal(double val)构造器有一定的不可预知性,它所产生的数不是一个确定的数,而是一个近似值,会发生精度丢失问题,所以不推荐使用,因此通常建议优先使用基于String的构造器BigDecimal(String val),它所创建出来的数是可预知的。
37. 如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。
38.Calendar.MONTH字段代表月份,月份的起始值不是1,而是0。
39.创建Calendar实例对象时:
Calendar c=Calendar.getInstance();
Calendar类是一个抽象类。
40. 关键在于程序中粗体字代码行,Calendar提供了一个setLenient()用于设置它的容错性,Calendar默认支持较好的容错性,通过setLenient(false)可以关闭Calendar的容错性,让它进行严格的参数检查。
41. Calendar有两种解释日历字段的模式:lenient模式和non-lenient模式。当Calendar处于lenient模式时,每个时间字段可接受超出它允许范围的值;当Calendar处于non-lenient模式时,如果为某个时间字段设置的值超出了它允许的取值范围,程序将会抛出异常。
42. (1)boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
(2)String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
(3)String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement
(4)String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
43.(1)$匹配一行的结尾。要匹配$本身,请使用\$。
(2)^匹配一行的开头。
(3)*零次或多次,+一次或多次,?零次或一次。
44.正则表达式支持的数量标识符有如下几种模式:
(1)Greedy(贪婪模式),数量表示符默认采用贪婪模式,除非另有表示。
(2)Reluctant(勉强模式),用问号(?)后缀表示,他只会匹配最少的字符。
(3)Possessive(占有模式),用加号(+)后缀表示,目前只有java支持占有模式。
45. Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。
46. //将一个字符串编译成Pattern对象
Pattern p=Pattern.compile("a*b");
//使用Pattern对象创建Matcher对象
Matcher m=p.matcher("aaaaab");
boolean b=m.matches();//返回true
或者
boolean b = Pattern.matches("a*b", "aaaaab");//返回true
47. Pattern是不可变类,可供多个并发线程安全使用。
Matcher类提供了如下几个常用方法。
(1)find():返回目标字符串中是否包含与Pattern匹配的子串。
(2)group():返回上一次与Pattern匹配的子串。
(3)start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
(4)end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加l。
(5)lookingAt():返回目标字符串前面部分与Pattern是否匹配。
(6)matches():返回整个目标字符串与Pattern是否匹配。
(7)reset():将现有的Matcher对象应用于一个新的字符序列。
48. public class SimpleDateFormatTest
public static void main (String[]args) throws ParseException
{
Date d=new Date();
//创建一个SimpleDateFormat对象
SimpleDateFormat sdfl=new SimpleDateFormat("Gyyyy年中第D天”);
//将d格式化成日期,输出:公元2014年中第101天
String dateStr=sdfl.format(d);
System.out.println(dateStr);
//一个非常特殊的日期字符串
String str="14###三月##21",
SimpleDateFormat adf2=new SimpleDateFormat("y###MMM##d");
//将日期字符串解析成日期,输出:Fri Mar 21 00:00:00 CST 2014
System.out.println(sdf2.parse(str));
}
}

浙公网安备 33010602011771号