java
常用类
字符串相关的类:String
String
的特性
-
String类:代表字符串。Java程序中所有字符串面值都可以作为此类的实例实现
-
String是一个final类,代表不可变的字符序列
-
字符串是常量,用双引号引起来表示。他们的值在创建之后不能修改。
-
String对象的字符内容是存储在一个字符数组
value[]
中的 -
通过字面量的形式给一个字符串赋值,此时的字符串值申明在字符串常量池中
-
public class Demo1 { public static void main(String[] args) { String s1="Abc"; String s2="Abc"; //判断s1与s2的地址是否相同 System.out.println(s1==s2);//true } }
-
常量池中不存在相同值的两个字符串,值相同的字符串地址一致
-
字符串的不可变性:
- 不可以在原有地址的基础上重新赋值
-
String
实例化的方式
String构造器的方式
两种主要方式及其对比
public class Demo1 {
public static void main(String[] args) {
/*
* 字符串两种赋值方式的对比
*/
// 1.直接显示赋值
//此时创建的对象指向方法区的字符串常量池
String s1="China";
String s2="China";
// 2.通过new方式创建对象
//此时创建的对象对应于堆空间方法区常量池
//通过new String()的方式创建对象实质创建了两个对象:①new的对象②char[]指向
String s3=new String("China");
String s4=new String("China");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s1==s4); //false
System.out.println(s3==s4); //false
Person p1=new Person("Tome",18);
Person p2=new Person("Tome",22);
System.out.println(p1.name.equals(p2.name)); //true
System.out.println(p1.name==p2.name); //true
Person p3=new Person(s1,18);
Person p4=new Person(s1,22);
System.out.println(p3.name.equals(p4.name)); //true
System.out.println(p3.name==p4.name); //true
}
}
String
不同拼接方式对比
public class Demo2 {
public static void main(String[] args) {
/*
* 字符串多种拼接方式比较
*/
String s1="hello";
String s2="World";
String s3="helloWorld";
String s4=s1+"World";
String s5="hello"+s2;
String s6=s1+s2;
String s7="hello"+"World";
String s8=s4.intern();
System.out.println(s3==s4);//false
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
System.out.println(s3==s7);//true
System.out.println(s4==s5);//false
System.out.println(s3==s8);//true
}
}
结论
- 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量(字符串的不可变性)
- 只要其中有一个是变量,结果就在堆中
- 如果拼接的结果调用
intern()
方法,返回值就在常量池中
public class Demo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
//字符串拼接
String s1="hello";
final String s2="hello";
String s3="helloworld";
String s4=s1+"world";
String s5=s2+"world";
System.out.println(s3==s4); //false
// s2前加了关键字final,s2所以为常量,也位于方法区的常量池
System.out.println(s3==s5); //true
}
}
String
的常用方法
String
与基本数据类型和包装类之间的转换
String
与char[]
之间的转换
public class Demo3 {
public static void main(String[] args) {
//String与char[]之间的转换
//1.String-->>char[]
String s="hello";
char[] arr1=s.toCharArray();
for(int i=0;i<arr1.length;i++){
System.out.println(arr1[i]);
}
//2. char[]-->>String
char[] arr2=new char[]{'w','o','r','l','d'};
String str=new String(arr2);
System.out.println(str);
}
}
String
与byte[]
之间的转换
public class Demo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
/*
* String与byte[]之间的转换:
* 实质:String中的各个字符按照对应的字符集进行编码解码(如ASCII码)的过程
*/
// 1. String-->>byte[]
String str1="abc123";
byte[] b=str1.getBytes(); //按照默认的字符集进行编码
System.out.println(Arrays.toString(b)); //[97, 98, 99, 49, 50, 51]
byte[] b1=str1.getBytes("gbk");//按照指定的编码方式进行编码
System.out.println(Arrays.toString(b1));//[97, 98, 99, 49, 50, 51]
// 2. byte[]-->>String
byte[] b2=new byte[]{49,50,65,97};
String str2=new String(b2);
System.out.println(str2); //12Aa
String str3=new String(b2,"gbk"); //按照指定字符集进行解码
System.out.println(str3);
}
}
String
算法考察面试
-
2 三种方法
-
第四题的解法
-
public class Demo3 { public static void main(String[] args) throws UnsupportedEncodingException { Demo3 d=new Demo3(); String str1="ghhjkkssdddlllhellokkjj"; String str2="dddlllhel"; System.out.println(d.MaxSame(str1, str2)); } //只返回第一最大子串的情况 String MaxSame(String str1,String str2){ String maxStr=(str1.length()>=str2.length())?str1:str2; String minStr=(str1.length()<str2.length())?str1:str2; StringBuilder builder=new StringBuilder(minStr.length()); for(int i=0;i<minStr.length();i++){ for(int start=0,end=minStr.length()-i;end<=minStr.length();start++,end++) { if(maxStr.contains(minStr.substring(start, end))){ builder.append(minStr.substring(start, end)); return builder.toString(); } } } return builder.toString(); } }
-
import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Date; public class Demo3 { public static void main(String[] args) throws UnsupportedEncodingException { Demo3 d=new Demo3(); String str1="ghhjkkssdddlllhellokkjj"; String str2="ssshellojjokkjjssghhjk"; System.out.println(Arrays.toString(d.MaxSame(str1, str2))); } //返回所有的最大相同子串 String[] MaxSame(String str1,String str2){ String maxStr=(str1.length()>=str2.length())?str1:str2; String minStr=(str1.length()<str2.length())?str1:str2; StringBuilder builder=new StringBuilder(minStr.length()); for(int i=0;i<minStr.length();i++){ for(int start=0,end=minStr.length()-i;end<=minStr.length();start++,end++) { if(maxStr.contains(minStr.substring(start, end))){ builder.append(minStr.substring(start, end)+","); } } if(builder.length()!=0) break; } String[] result=builder.toString().replaceAll(",$", "").split("\\,"); return result; } }
-
StringBuffer
和StringBuilder
类
String
、StringBuffer
、StringBuilder
三者的异同?
String
:不可变的字符序列StringBuffer
:可变字符序列;线程安全,效率低StringBuilder
:可变字符序列;jdk5.0
新增的,线程不安全,效率高- 三者底层都是采用
char[]
进行存储
StringBuffer
源码分析
创建:
-
String str=new String();//相当于char value=new char[0]; String str=new String("abc");//相当于char[] value=new char[]{'a','b','c'};
-
StringBuffer str1=new StringBuffer();//相当于char[] value=new char[16]; //在底层会创建一个长度为16的数组 StringBuffer str2=new StringBuffer("abc");//相当于创建char[] value=new char["abc".length+16]
-
-
-
public class Demo3 { public static void main(String[] args) throws UnsupportedEncodingException { StringBuffer str=new StringBuffer("abc"); System.out.println(str.length()); //3,实际内容长度为多少属性length也就为多少 } }
-
添加数据导致数组存储空间不足,此时要进行扩容(参考
append
方法的实现)- 默认扩容为原始两倍加2
-
StringBuffer
的常用方法
String
、StringBuffer
、StringBuilder
效率对比
public class Demo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
/*
* String、StringBuffer、StringBuilder三者效率对比
*
*/
long startTime=0L;
long endTime=0L;
String text="";
StringBuffer str1=new StringBuffer("");
StringBuilder str2=new StringBuilder("");
startTime=System.currentTimeMillis();
for(int i=0;i<20000;i++){
str1.append(String.valueOf(i));
}
endTime=System.currentTimeMillis();
System.out.println("StringBuffer所需时间:"+(endTime-startTime));
startTime=System.currentTimeMillis();
for(int i=0;i<20000;i++){
str2.append(String.valueOf(i));
}
endTime=System.currentTimeMillis();
System.out.println("StringBuilder所需时间:"+(endTime-startTime));
startTime=System.currentTimeMillis();
for(int i=0;i<20000;i++){
text+=i;
}
endTime=System.currentTimeMillis();
System.out.println("String所需时间:"+(endTime-startTime));
/*
* 运行结果:
* StringBuffer所需时间:5
StringBuilder所需时间:6
String所需时间:536
*
*
*/
}
}
JDK8
之前关于日期和时间的API
实例:
public class Demo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.空参构造器
Date d1=new Date();
System.out.println(d1.toString());//Sat Feb 19 20:05:18 CST 2022
System.out.println(d1.getTime());//1645272318767
//2.含参构造器
Date d2=new Date(1645272318767L);//创建指定时间的对象
System.out.println(d2.toString());
//3. java.sql.Date对应数据库中的日期类型,他是java.util.Date的子类
java.sql.Date d3=new java.sql.Date(1645272318767L);
System.out.println(d3.toString()); //2022-02-19
}
}
实例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo4 {
public static void main(String[] args) throws ParseException {
/*
SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析
1.两个操作:
1.1格式化:日期-->>指定格式化字符串
1.2解析:字符串-->>日期,格式化的逆过程
*/
//1.对象创建
SimpleDateFormat sdf=new SimpleDateFormat();
Date d=new Date();
//1.1日期对象格式化
System.out.println(d); //Mon Feb 21 20:04:20 CST 2022
String sd=sdf.format(d);
System.out.println(sd); //22-2-21 下午8:04
//1.2解析
//非空参构造器,按照指定模式格式化和解析
Date d1=sdf.parse("22-4-21 下午9:04");
System.out.println(d1); //Thu Apr 21 21:04:00 CST 2022
//1.1格式化
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
String sd1=sdf1.format(d);
System.out.println(sd1); //2022.02.21 公元 at 20:09:22 CST
//1.2解析
Date d2=sdf1.parse("2022.04.25 公元 at 20:19:22 CST");
System.out.println(d2); //Mon Apr 25 20:19:22 CST 2022
}
}
实例:
public class Demo4 {
public static void main(String[] args) throws ParseException {
/*
* Calendar类的使用
*/
//1.对象创建,Calendar为抽象类不可直接实例化,需实例化其子类对象GregorianCalendar或者调用静态方法getInstance
Calendar calendar=Calendar.getInstance();
//2.常用方法
//get()
int days=calendar.get(Calendar.DAY_OF_MONTH); //获取当前时间为当月的第几天,field具体含义查看API文档
System.out.println(days); //22
//set()
calendar.set(Calendar.DAY_OF_MONTH, 10); //对当前日期相关属性进行设置
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //10
//add()
calendar.add(Calendar.DAY_OF_MONTH, -5);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //5
//Calendar与Date之间的转换
//getTime()
Date d=calendar.getTime();
System.out.println(d.toString()); //Sat Feb 05 08:16:42 CST 2022
//setTime()
d=new Date();
calendar.setTime(d);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //22
}
}
JDK8
中新日期时间API
背景
实例:
public class Demo4 {
public static void main(String[] args) throws ParseException {
/*
* LocalDate,LocalTime,LocalDateTime的使用
*/
//.now()获取当前的日期,时间,日期+时间
LocalDate date=LocalDate.now();
LocalTime time=LocalTime.now();
LocalDateTime dateTime=LocalDateTime.now();
System.out.println(date); //2022-02-22
System.out.println(time); //08:32:50.546
System.out.println(dateTime); //2022-02-22T08:32:50.546
//of(),根据指定时间,日期创建对象
LocalDateTime dateTime1=LocalDateTime.of(2020, 12, 31, 2, 43);
System.out.println(dateTime1); //2020-12-31T02:43
//getXxx(),获取相应的属性
System.out.println(dateTime1.getDayOfYear()); //366
System.out.println(dateTime1.getHour()); //2
System.out.println(dateTime1.getMonth());//DECEMBER
System.out.println(dateTime1.getMonthValue()); //12
//withXxxx,对当前对象属性进行修改,体现不可变性,创建新的对象,原始对象不变
LocalDateTime dt=dateTime1.withDayOfYear(23);
System.out.println(dt); //2020-01-23T02:43
//plusXxx,在当前基础上添加一定的值
LocalDateTime dt1=dt.plusYears(2);
System.out.println(dt1); //2022-01-23T02:43
//minusXxx,在当前基础上减去一定的值
LocalDateTime dt2=dt.minusDays(10);
System.out.println(dt2); //2020-01-13T02:43
}
}
实例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Demo4 {
public static void main(String[] args) throws ParseException {
//java.time.format.DateTimeFormatter类替代以前的java.util.SimpleDateFormat
//1.创建对象
DateTimeFormatter dtf=DateTimeFormatter.ISO_DATE_TIME;
//2.格式化,Date-->>String
LocalDateTime ldt=LocalDateTime.now();
System.out.println(ldt); //2022-02-22T22:11:52.758
String format=dtf.format(ldt);
System.out.println(format); //2022-02-22T22:11:52.758
//3.解析,String-->>Date
TemporalAccessor date=dtf.parse("2022-02-22T22:11:52.758");
System.out.println(date); //{},ISO resolved to 2022-02-22T22:11:52.758
//4.本地化相关格式
DateTimeFormatter dtf1=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
System.out.println(dtf1.format(ldt)); //22-2-22 下午10:19
DateTimeFormatter dtf2=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
System.out.println(dtf2.format(ldt)); //2022年2月22日 下午10时19分47秒
//5.自定义格式
DateTimeFormatter dtf3=DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println(dtf3.format(ldt)); //2022-02-22
}
}
Java
比较器
实例:
import java.text.ParseException;
import java.util.Arrays;
public class Demo4 {
public static void main(String[] args) throws ParseException {
//对自定义类进行排序比较
Goods[] arr=new Goods[4];
arr[0]=new Goods("三国",32);
arr[1]=new Goods("水浒",44);
arr[2]=new Goods("红楼", 13);
arr[3]=new Goods("西游", 100);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//[name:红楼 price:13, name:三国 price:32, name:水浒 price:44, name:西游 price:100]
}
}
class Goods implements Comparable{
String name;
int price;
Goods(String name,int price){
this.name=name;
this.price=price;
}
@Override
public String toString() {
return "name:"+this.name+" price:"+this.price;
}
@Override
public int compareTo(Object o) {
if(o instanceof Goods){
Goods goods=(Goods) o;
if(this.price>goods.price) return 1;
else if(this.price<goods.price) return -1;
else return 0;
}
throw new RuntimeException("输入数据类型不一致!");
}
}
实例:
public class Demo4 {
public static void main(String[] args) throws ParseException {
//对自定义类进行排序比较
Goods[] arr=new Goods[4];
arr[0]=new Goods("三国",32);
arr[1]=new Goods("水浒",44);
arr[2]=new Goods("红楼", 13);
arr[3]=new Goods("西游", 100);
System.out.println(Arrays.toString(arr));
//[name:三国 price:32, name:水浒 price:44, name:红楼 price:13, name:西游 price:100]
//常见Comparator对象,重写compare对象
Arrays.sort(arr,new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Goods goods1=(Goods) o1;
Goods goods2=(Goods) o2;
if(goods1.price>goods2.price) return 1;
else if(goods1.price<goods2.price) return -1;
else return 0;
}
});
System.out.println(Arrays.toString(arr));
//[name:红楼 price:13, name:三国 price:32, name:水浒 price:44, name:西游 price:100]
}
}
其他常用类
实例:
public class Demo4 {
public static void main(String[] args) throws ParseException {
String javaVersion = System.getProperty("java.version");
System.out.println("java的version:" + javaVersion);
String javaHome = System.getProperty("java.home");
System.out.println("java的home:" + javaHome);
String osName = System.getProperty("os.name");
System.out.println("os的name:" + osName);
String osVersion = System.getProperty("os.version");
System.out.println("os的version:" + osVersion);
String userName = System.getProperty("user.name");
System.out.println("user的name:" + userName);
String userHome = System.getProperty("user.home");
System.out.println("user的home:" + userHome);
String userDir = System.getProperty("user.dir");
System.out.println("user的dir:" + userDir);
/*
* 运行结果:
* java的version:1.8.0_131
java的home:D:\ProgramFile\java_tools\JDK8\jre
os的name:Windows 10
os的version:10.0
user的name:Admin
user的home:C:\Users\Admin
user的dir:F:\Eclipse_workspace\javaTutorial
*/
}
}