常用类
1、
package day11;
public class Alignment {
// 在JDK1.5之前,可以声明固定的常量值表示一些列常量。
public static final int LEFT = 1;
public static final int CENTER = 2;
public static final int RIGHT = 3;
/*
* 执行对齐的操作,对齐方式: 左对齐 居中对齐 右对齐
*/
public void align(int value) {
if (value == 1) {
// 左对齐
} else if (value == 2) {
// 居中对齐
} else if (value == 3) {
// 右对齐
}
}
public void align2(int value) {
if (value == LEFT) {
// 左对齐
} else if (value == CENTER) {
// 居中对齐
} else if (value == RIGHT) {
// 右对齐
}
}
// 使用枚举类型作为参数。
public void align3(Align value) {
if (value == Align.LEFT) {
// 左对齐
} else if (value == Align.CENTER) {
// 居中对齐
} else if (value == Align.RIGHT) {
// 右对齐
}
}
}
class UseAlign {
public void f() {
Alignment a = new Alignment();
// 客户端使用,实现对齐方式。
a.align(1);
a.align(Alignment.LEFT);
// 虽然我们提供了一组常量值的表示方案(静态常量值),
// 但是,客户端完全可以忽略我们提供的方案。依然
// 坚持使用魔幻数字。
a.align2(3);
// 更有甚者,客户端完全可以传递一个我们根本就不提供
// 的值,也不会产生任何编译错误。(没有编译期间的类型
// 检查)
a.align2(1000);
// 枚举之后
a.align3(Align.CENTER);
// 错误,类型不匹配
// a.align3(1);
// 错误,枚举中没有声明JUSTIFY常量
// a.align3(Align.JUSTIFY);
}
}
2、switch对枚举类型的支持。
/*
* switch对枚举类型的支持。
*
*/
package day11;
public class Switch {
public static void main(String[] args) {
Align a = Align.RIGHT;
switch (a) {
case LEFT:
System.out.println("左对齐");
break;
case CENTER:
System.out.println("居中对齐");
break;
case RIGHT:
System.out.println("右对齐");
break;
}
}
}
3、枚举类型
/*
* 枚举类型
* 枚举使用enum来声明。用来声明一组固定值的常量。
* 按照惯例,枚举常量值全部大写。
*
* 枚举的优势:
* 比起编译期间的常量(JDK1.5之前),枚举提供了编译期间
* 类型安全的检查。如果我们使用枚举做参数,则客户端必须提供
* 相同的枚举类型,同时,提供的枚举值必须在枚举类型声明
* 的常量值范围之内。
*
* 枚举类型隐式继承java.lang.Enum类型,因此,枚举类型
* 不能在继承其他类。
* 编译器会自动为枚举类型生成两个静态方法:
* values 返回一个枚举数组,包含枚举中声明的所有枚举常量
* valueOf 根据参数(String)指定的值,返回对应的枚举
* 常量值。
*
* 枚举类型可以实现接口。此时,可以选择所有枚举常量统一
* 的实现,也可以每个枚举常量都单独实现。
*
* 枚举类型也可以声明抽象方法,此时,由各个枚举常量给出
* 具体的实现。
*/
package day11;
public enum Align implements EInter {
LEFT {
@Override
public void introduce() {
System.out.println("我是左对齐");
}
@Override
void absM() {
// TODO Auto-generated method stub
}
},
CENTER {
@Override
public void introduce() {
System.out.println("我是居中对齐");
}
@Override
void absM() {
// TODO Auto-generated method stub
}
},
RIGHT {
@Override
public void introduce() {
System.out.println("我是右对齐");
}
@Override
void absM() {
// TODO Auto-generated method stub
}
};
abstract void absM();
public static void main(String[] args) {
// 返回枚举常量的数组
Align[] a = Align.values();
for (Align al : a) {
// 当输出一个引用类型时,会调用该类型的toString方法。
// System.out.println(al);
EInter e = al;
e.introduce();
}
// Align t = Align.valueOf("LEFT");
// System.out.println(t);
}
/*
* @Override public void introduce() { System.out.println("枚举的接口实现"); }
*/
}
interface EInter {
void introduce();
}
4、包装类
boolean-> Boolean byte -> Byte short -> Short char -> Character int -> Integer long -> Long float -> Float double -> Double
5、包装类型
/*
* 包装类型
* 每个基本数据类型都对应一个包装类型。当我们需要将基本数据类型当
* 成对象使用时(例如在集合中),就可以使用对应的包装类型。
* 基本数据类型与包装类型之间是可以进行相互转换的。
*
* 封箱:将基本数据类型转换成包装类型。
* 拆箱:将包装类型转换成基本数据类型。
* 自动拆箱与封箱
* 自动封箱:当需要包装类型时,如果我们提供的是基本数据类型,则
* 编译器可以自动的将基本数据类型转换成包装类型。(通过调用包装
* 类型的valueOf方法)
* 自动拆箱:当需要基本数据类型时,如果我们提供的是包装类型,则
* 编译器可以自动的将包装类型转换成基本数据类型。(调用包装类型
* 的TValue方法,T就是对应的基本数据类型)
*
* 包装类是非可变类,包装类型对象一经创建,其所包装的基本数据
* 类型值就不能够再进行更改。
* 非可变类的优势:非可变类创建的对象,其内部数据不能更改,因此
* 非可变对象可以自由的实现共享。(没有必要为每一个需要该对象
* 的位置去创建一个不同的对象)。
*
* 包装类的缓存机制:
* 包装类会缓存常用的对象。这样可以避免创建重复的对象,实现
* 对象的共享。
* Boolean,Byte缓存全部
* Character 0 ~ 127
* Short,Integer,Long -128 ~ 127
* Float, Double 没有缓存。
*
* 当使用== !=(既可以应用于基本数据类型,也可以应用于引用
* 类型)比较基本数据类型与包装类型时,会将包装类型拆箱处理,
* 然后比较基本数据类型的值。
*/
package day11;
public class Wrapper {
public static void main(String[] args) {
int x = 5;
// 基本数据类型转换成包装类型
// 第一种方式:通过new创建对象
Integer i = new Integer(x);
// 第二种方式:调用包装类的静态方法valueOf。
Integer i2 = Integer.valueOf(x);
// 包装类型转换成基本数据类型。
// 通过调用包装类型的TValue方法,其中,T
// 为对应的基本数据类型。
int y = i.intValue();
int a = 5;
Integer aw = a;
// Integer aw = Integer.valueOf(a);
int b = aw;
// int b = aw.intValue();
Object o = 100;
/*
* 不要这样使用。 for (Integer ax = 1; ax <= 100; ax++) {
*
* }
*/
Integer x1 = 100; // Integer x1 = Integer.valueOf(100);
Integer x2 = 100;
System.out.println(x1 == x2);
x1 = 200; // Integer x1 = Integer.valueOf(200);
x2 = 200;
System.out.println(x1 == x2);
// 拆箱还是封箱?
Integer e = new Integer(200);
int u = 200;
System.out.println(e == u);
}
}
6、String 的方法
package day11;
public class StringTest {
public static void main(String[] args) {
String s = "abcdefg";
String s2 = new String("1234578");
// 返回String对象字符的长度。(以字符为单位)。
System.out.println(s.length());
// 判断当前对象与参数指定的String对象字符序列
// 是否相等,如果相等,返回true,否则返回false。
System.out.println(s.equals("abc"));
// 与equals相同,但是会忽略大小写。
System.out.println(s.equalsIgnoreCase("aBC"));
// 如果当前对象大于参数指定的对象,返回值大于0,如果
// 当前对象等于参数指定的对象,返回0,如果当前对象小于
// 参数指定的对象,返回值小于0。
System.out.println(s.compareTo("ABC"));
// 判断当前对象是否以参数指定的对象开头,是则返回true,
// 否则返回false。
System.out.println(s.startsWith("ab"));
// 判断当前对象是否以参数指定的对象结尾,是则返回true,
// 否则返回false。
System.out.println(s.endsWith("ab"));
// 返回参数指定索引位置的字符。(索引从0开始)
System.out.println(s.charAt(1));
// 返回子字符序列,参数指定开始的位置,一直到字符序列
// 末尾。
System.out.println(s.substring(2));
// 返回子字符序列,第一个参数指定起始点,第二个参数
// 指定结束点。(包括起始点,不包括结束点)
System.out.println(s.substring(2, 5));
// 使用当前的字符序列,连接参数字符序列,返回连接
// 之后的结果。(用的不多)
System.out.println(s.concat("1234"));
// 使用第二个参数替换第一个参数,返回替换之后的结果。
System.out.println(s.replace('b', 'x'));
System.out.println("abcabc".replace('b', 'x'));
System.out.println(s.replace("ab", "xyz"));
// 返回参数在当前对象中首次出现的位置。如果没有出现,
// 返回-1。
System.out.println(s.indexOf("bc"));
System.out.println(s.indexOf("kk"));
// 返回参数在当前对象中最后一次出现的位置。如果没有出现,
// 返回-1。
System.out.println(s.lastIndexOf("kk"));
// 去除字符序列两端的空格,返回去除之后的结果。
System.out.println(" a b ".trim());
// 返回当前对象的大写形式。
System.out.println(s.toUpperCase());
// 返回当前对象的小写形式。
System.out.println(s.toLowerCase());
String[] keys = "2016-10-15".split("-");
for (String key : keys) {
System.out.println(key);
}
// 判断当前对象是否包含参数指定的对象,如果包含,返回
// true,否则返回false。
System.out.println(s.contains("cd"));
System.out.println(s.indexOf("cd") >= 0);
}
}
7、
/*
* String类是非可变类,String对象一经创建,
* 就不能进行修改。
* 在String类中,所有看似修改String字符序列的方法
* (toUpperCase,substring等),都是在新创建的对象
* 上进行的,而没有修改原有的String对象。
*/
package day11;
public class StringTest2 {
public static void main(String[] args) {
String s = "abc";
s = "def";
System.out.println(s);
System.out.println(s.toUpperCase());
System.out.println(s);
}
}
8、String常量池
/*
* String常量池
* String常量池用来维护编译期间的String常量。
* 常量池初始为空,当出现编译期间的String常量时,首先会
* 搜索String常量池,如果常量池中不存在该String对象,则
* 将该String对象加入到常量池中,并返回该对象(起始地址)。
* 如果该对象已经存在(根据String对象的equals方法),
* 、则直接返回常量池中的String对象(不会再创建String对象)。
*
* String常量池可以避免令我们创建重复的对象,因为String对象
* 是不可改变的,因为我们只需创建一个,由所有需要的位置共享即可。
*
*/
package day11;
public class StringPool {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
//编译器特征:能够在编译期间计算的结果,就不会
//等到运行时再去计算。
s1 = "ab" + "c";
//s1 = "abc";
s1 = "a" + "b" + "c";
final String t = "c";
s1 = "ab" + t;
System.out.println(s1 == s2);
}
}
/*
* String常量池
* String常量池用来维护编译期间的String常量。
* 常量池初始为空,当出现编译期间的String常量时,首先会
* 搜索String常量池,如果常量池中不存在该String对象,则
* 将该String对象加入到常量池中,并返回该对象(起始地址)。
* 如果该对象已经存在(根据String对象的equals方法),
* 、则直接返回常量池中的String对象(不会再创建String对象)。
*
* String常量池可以避免令我们创建重复的对象,因为String对象
* 是不可改变的,因为我们只需创建一个,由所有需要的位置共享即可。
*
*/
package day11;
public class StringPool {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
//编译器特征:能够在编译期间计算的结果,就不会
//等到运行时再去计算。
s1 = "ab" + "c";
//s1 = "abc";
s1 = "a" + "b" + "c";
final String t = "c";
s1 = "ab" + t;
System.out.println(s1 == s2);
}
}
9、equals与==
/*
* equals与==
* equals是Object类中声明的方法,在Object类中,equals
* 与==是没有任何区别的,因为Object类中,equals就是用==
* 进行判断的。但是,Object类中equals比较可能过于严格,子类
* 可以根据需要实现自己的比较方式。例如,String类重写了equals方法,
* 只要两个String字符序列相当,则认为两个String对象就是相等的。
*
* ==比较的永远是两个变量的值,当变量是引用类型时,比较的是两个
* 引用的值是否相等,即对象的起始地址是否相等(两个对象是否是同一个
* 对象。)
*/
package day11;
public class Equals {
public static void main(String[] args) {
String s = new String("abc");
String s2 = new String("abc");
System.out.println(s.equals(s2));
System.out.println(s == s2);
}
}
10、StringBuilder与StringBuffer
/*
* StringBuilder与StringBuffer
* StringBuilder是非线程安全的,StringBuffer是
* 线程安全的。我们应该首选(优先使用)StringBuilder。
*
* String是非可变类,StringBuilder是可变类,对StringBuilder
* 进行的一切修改操作,都是在原有对象上进行的,而没有创建新的
* 对象。
*/
package day11;
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder s = new StringBuilder("abc");
// 不同与String,StringBuilder不支持直接赋值的形式。
// StringBuilder s2 = "abc";
// 将第二个参数指定的对象插入到第一个参数指定的位置上。
s.insert(2, "1234");
// 改变了原有的对象
System.out.println(s);
// 返回当前对象的长度。(以字符为单位)。
System.out.println(s.length());
// 返回StringBuilder对象的存储空间。
// 存储空间会随着字符的增加而自动扩容。
System.out.println(s.capacity());
// 转换成String对象。
System.out.println(s.toString());
// 删除指定区间的字符。第1个参数指定开始点,第2个参数
// 指定结束点。(包括起始点,不包括终止点。)
s.delete(0, 3);
System.out.println(s);
// 将参数指定的对象追加到当前StringBuilder对象
// 的尾部。
s.append("xyz");
System.out.println(s);
s.append("abc");
s.append("def");
// StringBuilder的delete,append等方法可以返回
// 当前的对象,因此,我们可以实现链式方法调用。
s.append("abc").append("def");
}
}
11、
/*
* String与StringBuilder
* String是非可变类,String对象一经创建就不能再进行修改。
* StringBuilder可变类,StringBuilder的对象可以改变。
* 因为String对象是不可改变的,所以String对象可以在多线程
* 并发访问时,安全的实现共享。但是,当我们频繁对String进行
* 修改时,就会创建大量的临时对象,影响性能。此时,我们应该
* 使用StringBuilder来代替String。
*/
package day11;
public class StringAndBuilder {
public static void main(String[] args) {
long start = System.nanoTime();
// System.currentTimeMillis();
String s = "";
// 使用String,会创建大量的临时对象
for (int i = 0; i < 1000; i++) {
s += "a";
}
long end = System.nanoTime();
System.out.println(end - start);
start = System.nanoTime();
StringBuilder b = new StringBuilder(1200);
for (int i = 0; i < 1000; i++) {
b.append("a");
}
// s = b.toString();
end = System.nanoTime();
System.out.println(end - start);
}
}
12、Math类中声明的成员都是静态的。
/*
* Math类中声明的成员都是静态的。
*/
package day11;
import static java.lang.Math.*;
public class MathTest {
public static void main(String[] args) {
// 返回一个[0, 1)之间的随机小数(double)。
System.out.println(random());
// 返回绝对值
System.out.println(abs(-10));
System.out.println(Integer.MIN_VALUE);
System.out.println(abs(Integer.MIN_VALUE));
// 返回大于等于参数的最小整数。(向上取整)
System.out.println(ceil(3.2));
// 返回小于等于参数的最大整数。(向下取整)
System.out.println(floor(2.3));
// 返回两个参数中较大的一个。
System.out.println(max(5, 10));
// 返回两个参数中较小的一个。
System.out.println(min(5, 10));
}
}
13、Date
package day11;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
// 当前日期和时间
Date date = new Date();
System.out.println(date);
// 从1970-01-01 00:00:00所走过的毫秒数(参数指定)
Date date2 = new Date(10000000);
System.out.println(date2);
// 返回从1970-01-01 00:00:00到Date所表示
// 时间走过的毫秒数。
long time = date.getTime();
System.out.println(time);
// 设置时间(毫秒数)
date.setTime(30000);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 对日期进行格式化
System.out.println(df.format(date));
}
}
14、Calendar
package day11;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {
// Calendar是抽象类,不能创建对象,通过getInstance
// 方法获得的是Calendar子类型的对象。
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR));
// 获取的月份从0开始。
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DATE));
// 12小时制
System.out.println(c.get(Calendar.HOUR));
// 24小时制
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.MINUTE));
System.out.println(c.get(Calendar.SECOND));
c.set(Calendar.YEAR, 1990);
c.set(1990, 7, 8);
c.set(1990, 7, 8, 15, 30, 30);
// 获取Date对象
Date d = c.getTime();
}
}
15、Random
package day11;
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
Random r = new Random();
// 返回一个int类型的值。
System.out.println(r.nextInt());
// 返回一个0~参数范围,int类型的值。
// 包括0,不包括参数指定的上限
System.out.println(r.nextInt(30));
// 返回[0,1)之间的随机float值。
System.out.println(r.nextFloat());
// 返回[0,1)之间的随机double值。
System.out.println(r.nextDouble());
}
}
16、Scanner
package day11;
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
// 手动设置分隔符。
// s.useDelimiter("*");
while (s.hasNext()) {
String str = s.next();
// 判断是否含有下一行
// s.hasNextLine();
// 获取下一行。
// s.nextLine();
// s.nextInt();
if (str.equals("q")) {
break;
}
System.out.println(str);
}
// 释放本地的资源。
s.close();
}
}

浙公网安备 33010602011771号