关于String
String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder。
每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 == 比较时也为 false ,如果只需比较内容是否相同,应使用 equals() 方法
代码示例
public class HelloWorld {
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc";
//定义字符串s3,保存“I love”和s1拼接后的内容
String s3 = "I love" + s1;
// 比较字符串s1和s2
// imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
//比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3) );
String s4 = "I love " + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
}
返回结果为true、false、false
单引号表示字符,双引号表示字符串
代码示例
public class Solution {
public static void main(String[] args) {
String s = "aljlkdsflkjsadjfklhasdkjlflkajdflwoiudsafhaasdasd";
// 出现次数
int num = 0;
// 循环遍历每个字符,判断是否是字符 a ,如果是,累加次数
for (int i = 0; i < s.length() - 1; i++) {
// 获取每个字符,判断是否是字符a
if (s.charAt(i) == 'a') {
// 累加统计次数
num++;
}
}
System.out.println("字符a出现的次数:" + num);
}
}
当频繁操作字符串时,就会额外产生很多临时变量。使用 StringBuilder 或 StringBuffer 就可以避免这个问题。至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。
关于封装类
装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱
拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱
代码示例
//基本类型和封装类型的转换
// 定义double类型变量
double a = 91.5;
// 手动装箱
Double b = new Double(a);
// 自动装箱
Double c = a;
// 定义一个Double包装类对象,值为8
Double d = new Double(87.0);
// 手动拆箱
double e = d.doubleValue();
// 自动拆箱
double f = d;
//基本类型和字符串之间进行转换
基本类型转换为字符串有三种方法:
使用包装类的 toString() 方法
使用String类的 valueOf() 方法
用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串
字符串转换成基本类型有两种方法:
调用包装类的 parseXxx 静态方法
调用包装类的 valueOf() 方法转换为基本类型的包装类,会自动拆箱
日期和时间
不建议使用
java.util 包中的 Date 类,使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,但是显示不太友好(注:CST 代表 China Standard Time (中国标准时间,也就是北京时间,东八区))
java.text 包中的 SimpleDateFormat 类可以将日期转换为指定格式的文本,也可将文本转换为日期。
代码区
// 使用format()方法将日期转换为指定格式的文本
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
// 创建Date对象,表示当前时间
Date now = new Date();
// 调用format()方法,将日期转换为字符串并输出
System.out.println(sdf1.format(now));
// 使用parse()方法将文本转换为日期
String d = "2014-6-1 21:05:36";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 调用parse()方法,将字符串转换为日期
Date date = sdf.parse(d);
建议使用
java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();
Calendar 类提供了 getTime() 方法,用来获取 Date 对象,完成 Calendar 和 Date 的转换,还可通过 getTimeInMillis() 方法,获取此 Calendar 的时间值,以毫秒为单位。
代码示例
// 创建Calendar对象
Calendar c = Calendar.getInstance();
// 将Calendar对象转换为Date对象
Date date = c.getTime();
// 创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将日期转换为指定格式的字符串
String now = sdf.format(date);
math类
Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名,如: Math.round();
集合
集合与数组不同的地方在于,集合是动态增长的,但是数组长度是固定的,如果需要扩展数组,需要新建一个数组再把老数组拷贝过来。
集合框架的两个根接口,Collection和Map。
Collection的子接口有List序列、Queue、Set集,它们对应的几个常用实现类是ArrayList、LinkedList、HashSet。
Map的重要实现类是HashMap。