String、StringBuffer和StringBuilder
StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都会引发新的String对象的生成;StringBuffer和StringBuilder则是可变类,任何对它所指代的字符串的改变都不会产生新的对象
String不可变的原因:
源码:
private final char value[];
因为使用了final关键字,导致value数组只能赋一次值
而StringBuffer、StringBuilder源码都没有使用final关键字,所以可以对数组进行扩容
String内存分析
String s1 = "abc";
String s2 = "a"+"b"+"c";//字符串拼接,会进行编译期优化,直接拼成最终你要的字符串
String s3 = "abc"+"";
String s4 = s1+"";//变量参与运算,就会在堆中开辟空间
String s5 = new String("abc");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//true
System.out.println(s1==s4);//false
System.out.println(s1==s5);//false
StringBuilder有增删查改的方法
String str = "abc";//不可变字符串
StringBuilder sb = new StringBuilder();//可变字符串,默认数组长度16
StringBuilder sb2 = new StringBuilder(23);//长度改为23
StringBuilder sb3 = new StringBuilder("abc");//初始化为abc
sb3.append("kkk");//值变为abckkk
StringBuilder效率高,线程不安全
StringBuffer效率低,线程安全(底层使用了synchronized)
模拟ArrayList
public class test1 {
//值
Object[] value;
//数组被占用的个数
int count;
//无参构造器
public test1(){
this(3);
}
//有参构造器
public test1(int num){
value = new Object[num];
}
public void add(Object obj){
value[count] = obj;
count++;
//数组的扩容
if (count>value.length-1){
//创建一个新数组
Object[] newobj = new Object[(value.length<<1)+2];//等价于value.length*2+2
//将原来数组的东西复制到新数组里
for (int i = 0; i < value.length; i++) {
newobj[i] = value[i];
}
//将value指向newobj
value = newobj;
}
}
public Object get(int index){
return value[index];
}
public int getCount(){
return count;
}
public String toString() {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < count; i++) {
sb.append(value[i]+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
test1 ts = new test1();
ts.add("as");
ts.add(new Student("ms",12));
ts.add(12);
ts.add(2);
for (int i = 0; i < ts.getCount(); i++) {
System.out.println(ts.get(i));
}
System.out.println(ts);
System.out.println(ts.toString());
}
}
输出结果
时间处理类
public class test2 {
public static void main(String[] args) {
//java.util.Date
Date d = new Date();
System.out.println(d);
System.out.println(d.getTime());//返回自1970年1月1日以来,由 Date对象表示的00:00:00 GMT的毫秒 数
System.out.println(System.currentTimeMillis());//等价于d.getTime(),常用,因为不用创建对象,直接调用
//java.sql.Date
//java.sql.Date:年月日
//java.util.Date:年月日 时分秒
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
System.out.println(sqlDate);
//将String转换为java.sql.Date
java.sql.Date valueOf = java.sql.Date.valueOf("2020-1-2");
System.out.println(valueOf);
//java.sql.Date和java.util.Date相互转换 java.sql.Date是java.util.Date的子类
//java.sql.Date转换为java.util.Date
Date date = sqlDate;
System.out.println(date);
//java.util.Date转换为java.sql.Date
java.sql.Date sqlDate2 = new java.sql.Date(new Date().getTime());
System.out.println(sqlDate2);
}
}
输出结果
java.sql.Date是java.util.Date的子类
日期格式化
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class test2 {
public static void main(String[] args) {
//String转换为Date:局限:字符串格式必须是年-月-日
/* java.sql.Date valueOf = java.sql.Date.valueOf("2020-1-1");
Date date = valueOf;
*/
//日期格式化类:JDK帮助文档
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
try {
//String转换为Date
Date d = df.parse("2020-1-1 12-23-55");
System.out.println(d);
} catch (ParseException e) {
e.printStackTrace();
}
//Date转换为String
String str = df.format(new Date());
System.out.println(str);
}
}
输出结果
Calendar(日历)
import java.util.Date;
import java.util.Calendar;
public class test {
public static void main(String[] args) {
//创建一个日历
Calendar cal = Calendar.getInstance();
//常用方法
//读取
System.out.println(cal.get(Calendar.YEAR));// 年
System.out.println(cal.get(Calendar.MONTH));// 月:当前月-1
System.out.println(cal.get(Calendar.DATE));// 日
System.out.println(cal.get(Calendar.DAY_OF_WEEK));// 周几:周+1
System.out.println("=============");
//设置
cal.set(Calendar.YEAR,2020);
cal.set(Calendar.DATE,16);
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.DATE));
System.out.println("=============");
//String转换为Calendar
//String转换为Date
String str = "2019-5-5";
Date valueOf = java.sql.Date.valueOf(str);
//Date转换为Calendar
cal.setTime(valueOf);
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));
}
}
输出结果
日历
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
System.out.println("请输入你想要查看的日期--(格式例如:2016-10-21):");
Scanner sc = new Scanner(System.in);
String str = sc.next();
//String转换为Calendar
Date date = Date.valueOf(str);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println("日\t一\t二\t三\t四\t五\t六");
//求出这个月中的最大天数
int maxDay = cal.getActualMaximum(Calendar.DATE);
int nowDay = cal.get(Calendar.DATE);
//将当前日期变为本月的第一天
cal.set(Calendar.DATE,1);
//获取本月的第一天是星期几
int num = cal.get(Calendar.DAY_OF_WEEK);
// \t的个数为num-1
int count = num-1;
for (int i = 0; i < count; i++) {
System.out.print("\t");
}
for (int i = 1; i <= maxDay; i++) {
if (i != nowDay){
System.out.print(i + "\t");
}else{
System.out.print(i + "*\t");
}
count++;
if (count % 7 == 0){
System.out.println();
}
}
}
}
结果(输入了2021-1-9)
Math
//圆周率
System.out.println(Math.PI);
//次方
System.out.println(Math.pow(3,3));//3的3次方
//开平方
System.out.println(Math.sqrt(9));
//向上取值
System.out.println(Math.ceil(9.1));//10.0
//向下取值
System.out.println(Math.floor(9.1));//9.0
//四舍五入
System.out.println(Math.round(5.4));
//随机数 0到1 左闭右开
System.out.println(Math.random());
//绝对值
System.out.println(Math.abs(-9.8));
//取最小值
System.out.println(Math.min(3.3,6.6));
//取最大值
System.out.println(Math.max(3.3,6.6));
随机数
Random r=new Random();
for (int i = 0; i < 10; i++) {
System.out.println(r.nextInt(10));//[0,10),生成0到10的随机数
}