String
- 使用一对“”引起来表示
- 声明为final,不可被继承
- 实现了Serializable接口:表示字符串是支持序列化的
实现了Comparable接口:表示String可比较大小
- 内部定义了final char[] value用于存储字符串数据
- 代表不可变的字符序列→不可变性
体现:①当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值②当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值③调用String.replace(),也需要重新指定内存区域赋值,不能使用原有的value进行赋值
- 通过字面量的方式(区别于new)给一个字符串赋值,此时该值声明在字符串常量池中
String s1 = "abc";//字面量方式
- 字符串常量池中不会存储相同值的字符串【相同值的对象指向常量池中同一个字符串,地址相同】
【常量与常量(用final修饰的变量也是常量)的拼接结果在常量池
只要拼接中有一个是变量,结果存在堆中
如果拼接的结果调用intern()方法,返回值在常量池中】
常用方法:
int length();
char charAt(int index);返回某索引处的字符return value[index]
String toLowerCase();使用默认语言环境,将String中的所有字符转换为小写
String toUpperCase();使用默认语言环境,将String中的所有字符转换为大写
String trim();返回字符串的副本,略去字符串首尾的空格
boolean equals();比较字符串内容是否相同
boolean equalsIgnoreCase(String anotherString);与equals相似,忽略大小写
String concat(String str)
String→char[]:
char[] array = s1.toCharArray();
String s2 = new String(array1);
编码:String→byte[]
解码:byte[]→String
byte[] bytes = s1.getBytes();//使用默认的字符集
StringBuffer和StringBuilder
StringBuffer:可变的字符序列;是线程安全的,效率低(方法都是synchronized的)
StringBuilder:可变的字符序列;线程不安全,效率高
Date
- 两个构造器的使用
- Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());
- 创建指定毫秒数的Date对象
Date date2 = new Date(152187530039L);
System.out.println(date2);
- 两个方法的使用
- toString():显示当前的年、月、日、时、分、秒
- getTime():获取当前Date对象对应的毫秒时间戳
- java.sql.Date 对应着数据库中的日期类型的变量
- 如何实例化
java.sql.Date data3 = new java.sql.Date(152187530039L);
- 如何将java.util.Date对象转换为java.sql.Date
//情况1
Date date4 = new java.sql.Date(152187530039L);
java.sql.Date date5 = (java.sql.Date)date4;
//情况2
Date date6 = new Date();
java.sql.Date date7 = new java.sql.Date(date6.getTime());
Math类
BigInteger类
BigDecimal类
jdk8之前日期时间的API测试
- System类中currentTimeMillis();
- java.util.Date和子类java.sql.Date
- SimpleDateFormat
格式化:日期à字符串
解析:字符串à日期
//实例化
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化
Date date = new Date();
String format = sdf.format(date);
//解析
String str = "2021/5/30 下午3:08";【要和格式化输出的格式相同】
Date date1 = sdf.parse(str);
4. Calendar(抽象类)
a) 实例化
方式一:创建其子类(GregorianCalendar)的对象
方式二:调用其静态方法Calendar.getInstance()
b) 常用方法
get():获取日期
set():设置日期,改的是对象里的数据,改完再get()就是修改后的结果
add():当前天数加n天
getTime():日历类→Date
Date date = calendar.getTime();
setTime():Date→日历类
calendar.setTime(date);
jdk8中日期时间的API测试
LocalDate()
LocalTime()
LocalDateTime()【常用】
localDateTime.getXxx()
localDateTime.withXxx()
localDateTime.plusXxx()
localDateTime.minusXxx()
Instant
//now() 获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);
//添加时间偏移量
OffsetDateTime offsetDateTime= instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
Java中的比较器
Comparable接口的使用(自然排序)
- String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方法
- String、包装类重写compareTo()后,进行了从小到大的排列
- 重写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,返回正整数
如果当前对象this小于形参对象obj,返回负整数
如果当前对象this等于形参对象obj,返回零
- 对于自定义类来说,如果需要排序,可以让自定义类实现Comparable接口, 在compareTo(obj)中指明如何排序
Comparator(定制排序)
重写Compare(Object o1,Object o2)
如果o1大于o2,返回正整数
如果o1小于o2,返回负整数
如果o1等于o2,返回零
Comparable和Comparator区别
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator接口属于临时性的比较
枚举类
类的对象只有有限个,确定的
如果枚举类中只有一个对象,则可以作为单例模式的实现方式
方式一:新建一个类
定义private的变量、构造器,将对象声明为常量
public static final Season Spring = new Season("Spring","warm");
方式二:enum关键字
enum Season1{
// 1.提供当前枚举类的对象,多个对象之间用逗号隔开,末尾对象以分号结束
Spring("Spring","warm"),
Summer("Summer","hot"),
Autumn("Autumn","cool"),
Winter("Winter","cold");
// 2.声明对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
// 3.私有化构造器
private Season1(String seasonName,String seasonDesc){
this.seasonDesc = seasonDesc;
this.seasonName = seasonName;
}
}
【提供枚举类的对象必须放在类中的开头位置】
Enum类中的方法
toString
values():返回枚举类中设置的所有对象
valueOf(String objName):返回枚举类中对象名为objName的对象,如果没有该对象,抛异常
使用enum关键字定义的枚举类实现接口的情况
- 实现接口,在enum类中实现抽象方法
@Override public void show() { }
- 让枚举类的对象分别实现接口中的抽象方法
Spring("Spring","warm"){ @Override public void show() { } },
注解(Annotation)
- 生成文档相关的注解
- 在编译时进行各市检查(JDK内置的三个基本注解)
@Override:限定重写父类方法,加上该注解在编译时会检查是否是重写
@Deprecated:用于表示所修饰的元素(类、方法)已经过时。
@SuppressWarning:抑制编译器警告
- 跟踪代码依赖性,实现替代配置文件功能
- jdk提供的四种元注解(对先有注解进行解释说明的注解)
@Retention:指定所修饰的注解的生命周期:SOURCE\CLASS(默认)\RUNTIME
只有生命周期为RUNTIME的注解才能通过反射获取
@Target:用于指定被修饰的注解能用于修饰哪些程序元素
@Documented:表示所修饰的注解在被javadoc解析时,保留下来
@Inherited:其修饰的注解将有继承性
jdk 5.0新增,是代码里的特殊标记。
自定义注解:
参照SuppressWarning:
- 注解使用声明为:@interface
- 内部定义成员,通常使用value表示
- 可以指定成员的默认值,使用default定义
- 如果自定义注解没有成员,表明是一个标识
如果注解有成员,在使用注解时,需要指明成员的值
自定义注解必须配上注解的信息处理流程(使用反射)才有意义
- jdk 8 中注解的新特性:可重复注解、类型注解
- 可重复注解:
- 在MyAnnotation上声明@Repeatable,成员值为MyAnnotation.class
- MyAnnotation的Target和Retention和MyAnnotations相同
- 类型注解:
- ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
- ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中
- 可重复注解: