String类
- String类不能被继承
- String创建好之后值是不可以被改变的,这里指的是在堆中的字符串的值是不可以被改变。
public static void main(String[] args) {
String s = "monkey";
change(s);
System.out.println("main:" + s);
}
public static void change(String s) {
s = "good";
System.out.println("change:" + s);
}
在堆中创建出来的字符串”monkey”是不能被改变的,如果要修改,系统会在堆中重新开辟内存空间将”good”放入,然后将change方法中的s重新引用这个新的内存地址上的”good”。
String s1 = "monkey";
String s2 = "monkey";
String s3 = new String("monkey");
String s4 = new String("good");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
上面代码中,创建s1时,字符串常量池中还不存在堆中monkey的引用,因此jvm会在常量池中创建一个引用指向堆中的这个字符串对象,创建s2时,jvm会去常量池中搜索,此时常量池中有monkey的引用,所以就不创建了,直接让s2指向之前创建的monkey,所以s1和s2指向的是同一个堆内存中的对象。 创建s3时,因为使用了new关键字,所以会在堆中开辟一块内存地址将其放入,s3指向这个新的内存地址,所以s3和s1指向的不是同一个内存地址。 创建s4时,使用了new关键字,会在堆中开辟一块内存地址,s4指向这个内存地址,然后字符串常量池中没有指向good的引用,所以会再重新开辟一块空间,将good放入,然后在字符串常量池中指向这个地址。
开发中建议使用String s = “monkey1024”;这种方式创建字符串对象,可以减少堆内存的使用。
- 注意:比较两个字符串是否一致最好使用equals方法
例:
- 统计一个字符串里面另一个字符串出现的次数,例如统计"monkey"在"I am monkey1024.monkey like banana.little monkey is smart."中出现的次数
- 思路:通过indexOf方法在大的字符串中查找小字符串的索引值,找到后将这个索引值和小字符串的长度相加,之后将大的字符串截取根据相加的结果截取子串,然后继续在剩下的字符串中查找小字符串的索引值,直到索引值返回-1为止
public static void main(String[] args) {
String src = "I am monkey1024.monkey like banana.little monkey is smart.";
String dest = "monkey";
int count = 0;
int index = 0;
while((index = src.indexOf(dest)) != -1){
count++;
src = src.substring(index + dest.length());
}
System.out.println("出现的次数是:" + count);
}
StringBuffer和StringBuilder
不要频繁的对字符进行拼接操作,例如下面代码:
String str = "";
for (int i = 0; i < 100; i++) {
str += i;
}
System.out.println(str);
每次对字符串修改,底层都会重新开辟新的堆内存空间,这样会开辟很多个空间地址,造成浪费。
如果需要对字符串进行频繁拼接的话,建议使用StringBuffer或者StringBuilder,两者的使用方法一致 StringBuffer的底层是byte数组(jdk9之后),jdk8中底层是char数组,如果没有明确设定,则系统会默认创建一个长度为16的byte类型数组,在使用时如果数组容量不够了,则会通过数组的拷贝对数组进行扩容,所以在使用StringBuffer时最好预测并手动初始化长度,这样能够减少数组的拷贝,从而提高效率。
StringBuffer sb = new StringBuffer(300);
for (int i = 0; i < 100; i++) {
sb.append(i);
}
System.out.println(sb);
包装类
- Java里面8个基本数据类型都有相应的类,这些类叫做包装类。
- 可以在对象中定义更多的功能方法操作该数据,方便开发者操作数据,例如基本数据类型和字符串之间的转换。
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
public class Test {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println(a);
Integer a1 = new Integer(a);
System.out.println(a1.getClass());
String s = "22";
Integer a2 = new Integer(s);
System.out.println(a2);
System.out.println(a2.getClass());
Integer i1 = Integer.valueOf(10);
int i2 = i1.intValue();
int ai = Integer.valueOf(10);
Integer i3 = Integer.valueOf("10");
String s1 = i3.toString();
int count = Integer.parseInt("10");
String s2 = 10 + "";
}
}
拆箱装箱和整型缓存
- 自动装箱:把基本类型转换为包装类类型
Integer i1 = 10; - 自动拆箱:把包装类类型转换为基本类型
在判断两个Integer类型是否相等时,要使用equals方法,不能使用”==”,Integer已经重写了Object中的equals方法。
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3==i4);
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3==i4);
如果Integer的值是在[-128~127]之间,这些值会从Integer中的“整型缓存池”获取。
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6);
上面程序不会在堆中新建对象,会直接从整型常量池中拿
日期类型
获取毫秒数
public class DateTest {
public static void main(String[] args) {
long now = System.currentTimeMillis();
System.out.println(now);
String s = "";
StringBuffer sb = new StringBuffer (200);
long before = System.currentTimeMillis();
for(int i= 1;i<100;i++) {
}
long after = System.currentTimeMillis();
System.out.println(after-before);
}
}
获取系统当前时间
Date d = new Date();
System.out.println("今天是" + d.getDate() + "号 现在是:" + d.getHours() + "时" + d.getMinutes() + "分");
System.out.println(d);
Date d0 = new Date(0);
System.out.println(d0);
日期格式化类
在java.text包下有个SimpleDateFormat类,通过这个类可以将日期修改为我们想要的风格 y表示年 M表示月 d表示日 H表示小时 m表示分钟 s表示秒 S表示毫秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
System.out.println(sdf);
String date = sdf.format(d);
System.out.println(date);
将String类型转换为Date类型
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest02 {
public static void main(String[] args) {
String s = "2001年3月3日 12:12:12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date();
try {
d = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(d);
System.out.println(sdf.format(d));
}
}
Calendar简介
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.DAY_OF_WEEK));
enum
public class enmuTest {
public class DayDemo {
public static final String SPRING = "spring";
public static final String SUMMER = "summer";
public static final String AUTUMN = "autumn";
public static final String WINTER = "winter";
}
public enum Season {
Spring, Summer, Autumn, Winter
}
public static void main(String[] args) {
System.out.println(Season.Summer);
}
}
Random
双色球实例
import java.util.Arrays;
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
Random r = new Random();
boolean[] isUsed = new boolean[33];
int[] result = new int[6];
System.out.println(isUsed[22]);
int length = 0;
while(length<6) {
int red = r.nextInt(33);
if(isUsed[red]==false) {
isUsed[red]=true;
}else {
continue;
}
result[length++] = red;
}
Arrays.sort(result);
for(int i = 0;i<length;i++) {
System.out.print(result[i]+" ");
}
int blue = r.nextInt(15);
System.out.println("\n"+blue);
}
}
|