要注意区分字符与字符串的区别:字符是指简单类型char,它的标准格式为单引号;而字符串是指复合类型String,它的标准格式为双引号。
在Java中字符串属于对象,Java提供了String类来创建和操作字符串。但是对字符串要进行频繁修改的时候使用StringBuffer和StringBuilder类,因为它们的对象经过多次修改而不产生新的未使用对象。
public static void main(String[] args) {
String s1="ab"+"c";//Java针对+和+=进行了重新定义,在字符串中+表示字符串拼接
String s2="abc";
System.out.println(s1==s2);//true 在复杂类中==用于比较两个对象的地址是否相同
System.out.println(s1.equals(s2));//true 调用String中定义的方法,用于比较两个字符串内容是否一致
}
注意:字符串常量的拼接,在方法区的常量池中完成
String s0="ab";
String s1=s0+"c";
String s2="abc";
System.out.println(s1==s2);//false
String类是不可改变的,一旦创建了String类它的值就不会发生改变了,否则就会导致对象的新建。
String类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果。
//String 类型的基本使用
public class Test{
public static void main(String[] args){
String s1="ab中c";//定义变量,String一般用于字符串常量如果修改内容会导致对象的新建
//获取字符串中的字符个数
int len=s1.length();//字符串中的length是一个方法,而数组中的length是一个属性
System.out.println(len);
//获取制定下标位置上的字符
for(int i=0;i
StringBuilder和StringBuffer的基本用法:
String一般是用于常用字符串,而StrinBuilder和StringBuffer用于频繁修改规则。
//构建对象
StringBuilder ss1=new StringBuilder();
StringBuffer ss2=new StringBuffer("abcd");
//拼接字符串
ss2.append("123");//在字符串末尾拼接
ss2.insert(1,"rst");//在指定下标位置上插入字符串
ss2.delete(1,3);//删除指定位置上的内容【start=1.end=3】
ss2.CharAt(1);//值删除指定下标上的字符
ss2.replace(1,2,"新的内容");//将指定下标位置上的内容替换为新内容
System.out.println(ss2);
ss2.reverse();//反转字符串
int len=ss2.length();//获取字符个数
int pos=ss2.indexof("容内")//查找位置
//其他方法基本和String一致
数据类型转换
String--Integer或者其他类型,基本语法:包装类名称.parseXxx
String s1="123"; int kk=Integer.parseInt(s1);//返回值int System.out.println(kk+1); int k2=Integer.valueof(s1);//返回值Integer,自动拆箱 System.out.println(k2+10);
Integer或者简单类型或者其它数据类型——String
int kk=123; String ss=""+kk;//自动转换
特殊方法:String类使用静态方法format()返回一个String对象,是用来创建可复用的格式化字符串。
最常见的格式符号:浮点数%f、整型%d、字符串%s。
String ss=null; //字符串的判空处理 //trim方法的含义是去掉字符串前后两端的空格 if(ss==null ||ss.trim().length()<1){ System.out.println("字符串内容为空!"); } String ss=null; //如果使用普通方法进行判断ss.equals("bbb")时会出现异常中断,使用Objects.equals可以避免空指针异常 if(Objects.equals(ss,"bbb")){ System.out.println("字符串内容为bbb"); }
可变与不可变:
String类中使用字符数组保存字符串,因为有final修饰符,所以可以知道string对象是不可变的。private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,可知这两种对象都是可变的。char[] value;
是否多线程安全:
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
StringBuilder与StringBuffer共同点:
StringBuilder与StringBuffer有公共父类AbstractStringBuilder抽象类。抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
java.util包提供了Date类来封装当前的日期和时间
Date: getTime()、setTime()
Date now=new Date();//创建一个日期对象,默认封装系统当前时间
System.out,println(now);
Date d1=new Date(2000-1900,2-1,3)//分别是year,month,date 【注意:要年-1900,月份-1】
long l1=now.getTime();//获取毫秒值
long s1=now.getTime()-d1.getTime();//日期中的减法:now-d1
//两个日期之间的天数差
System.out.println(s1/1000/60/60/24);
System.out.println(now.getYear()+1900);//年份
System.out.println(now.getMonth()+1);//月份
//now.getDate()日期 now.getDay()星期 now.getHours()小时 now.getMinutes()分钟 now.getSeconds()秒
Date now=new Date(); DateFormat df= new SimpleDateFormat("yyyy年MM月d日e HH点mm分ss秒");//自定义日期的格式 //将日期类型数据按照指定格式转换为字符串 String s1=df.format(now); System.out,println(s1);//当前系统具体时间 //将字符串按照指定格式转换为日期类型数据 try{ //可能出现异常,必须进行处理 Date dd=df.parse(s1); System.out.println(dd); }catch(ParseException e){ e.printStackTrace(); }
//根据现在的时间计算: Calendar now= Calendar.getInstance(); now.add(Calendar.Year,1)//现在时间是一年后 -1是一年前 //根据某个特定时间 date(Date 型)计算 Calendar specialDate =Calendar.getInstance(); specialDate.setTime(new Date());//注意在此处将specialDate的值改为特定日期 specialDate.add(Calendar.Year,1);//特定时间的一年后 -1是一年前