1、字符串类:String类型时java中表示字符串的一种类型,是平时使用最多的类型。所有的输入输出都是针对字符串,类型的变化是程序内部的需要。以为String是用得最多的数据类型,所以java中有许多针对它的特殊设计。
1)语法上,它是唯一一个可以直接赋常量值得引用数据类型
String str = “hello”;
2)String常量的内存中有特殊处理:a. String常量是对象
b.String常量在加载期即放入内存中(数据
段的字符串常量池)
3)String对象内容不可变,对String对象做任何内容改变都是得到一个新的
String对象
4)String提供了非常丰富的API
a. String与字符数组相关的操作
String str = “hello”;
char[]array = str.toCharArray();把String转换为char[]
int length = str.length();得到字符串长度
char c = str.charAt(0);根据下标得到字符串的第几个字符
int postion = str.indexOf(“l”);根据下标得到字符在String中首次出
现的位置,没有就返回-1
postion = str.lastIndexOf(“l”);根据下标得到字符在String中最后出
现的位置,没有就返回-1
String subStr = str.substring(1,3);//根据位置截取字符串,前闭后开
的区间,得到的是“hl”。
subStr = str.substring(2);重载方法,只给起始位置,一直截取到最后
b. String与比较相关的操作
System.out.println("hello".equals(str));
System.out.println("hello".equalsIgnoreCase(str));忽略大小写比较相等
System.out.println(str.compareTo("helloworld"));//区分大小写//字符串是可以比较大小的,使用的是字典顺序。
System.out.println(str.compareToIgnoreCase("helloworld"));//不区分大小写
特点:结果是第一个字符串减第二个字符串的差值,得到正数说明第一个比第二个大,得负数说明第一个比第二个小
差值首先是返回第一个对不同的字符的ASCII之差,如果某个字符串比较完了,它的每个字符都和对象相同,则返回两个字符串的长度之差
只有当每个字符都一样,长度也一样才会返回0,
c. 与String内容相关的
String upStr = str.toUpperCase( );//把String转换为全大写
String dnStr = str.toLowerCase( );//把String转换为全小写
String newStr = str.replace('l','L');//替换字符串中的某个字符为另一个字符
newStr = “Helloworld”.replace("l","fuck");//替换字符串中个的某个字符为另一个字符串,将l换成fuck
newStr = “Helloworld”.replaceAll("l[od]","fuck");//根据正则表达式进行替换,将lo、ld换成fuck
String hi = “hello”.concat(“world”);//把一个String拼接到另一个的末尾
System.out.println(hi.contains("wo"));//查看一个String是否在另一个String当中
d. 3个特殊方法:
trim()---去掉字符串前后的空格,不会去掉中间的空格
String input = “ hel lo ”;
String newInput = input.trim();
结果为:“hel lo”;
matches()---正则表达式比较
正则表达式(regex):用来规定一个字符串样式的模板,其本身也是字符串形式----1、[ ]:一个方括号表示一个字符,里面填上这个字符所允许的符号
2、{ }:表示前面表达式重复的次数
{m,n}表示至少出现m次,最多n次
{m,}表示至少出现每次,最多不限次数
{m}表示只能出现m次
(表达式1|表达式2|表达式3);可选 “8320”([0-9]{4}|110|120|114)"
8320后面可接0-9,出现4次,或者110,或者120,或者114
split()---字符串拆分
如果以分隔符开头,会正常拆分;如果以分隔符结尾,则后面不会拆分
分隔符可以用正则表达式表示
String birthday = “-1992-6-8”;
String[ ] strArray = birthday.split(“-”);
String最大的问题就是内容不可变
String str1 = “hello”;
String str2 = “world”;
String str3 = new Scanner(System.in).nextLine();
当需要操作到大量的字符串拼接时,String就会对性能产生影响
由此提出StringBuilder:也是JDK中提供的字符串类型,专门用来解决内容不可变的问题
它与String没有任何继承关系
StringBuilder:当我们做大量的String拼接时,会出现性能的消耗(内容可变的) ,此时选用StringBuilder或StringBuffer的append 或insert方法解决String的拼接问题
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = sb;
sb.append("world");//在尾部进行拼接
sb.insert(5," ");//在中间进行拼接
结果为:sb = sb2 = hello world
StringBuffer:跟StringBuilder一样,内容可变,用来解决String拼接的问题
两个提供的API都是一模一样的
StringBuilder是线程不安全的;
StringBuffer是线程安全的;
(1、凡是线程安全的,由于执行了同步动作,导致效率低,线程不安全的没有执行同步操作,所以效率相对高;2、线程安全性问题只会在多线程的特殊情况下才会出现(不是说多线程一定会出现),所以没有安全问题的多线程情况或单线程情况优先使用StringBuilder)
2、包装类
每一个基本数据类型都有一个包装类与之对应,提供大量的属性和行为,
基本<————>包装类对象<————>String (三种相互转换)
3、时间日期类
直接调用Date的无参构造得到的就是表示当前日期时间的Date对象
直接打印Date对象,得到的来自于toString方法的结果并不可用
Date方法中单独获取和设置年、月、日、时、分、秒的所有方法都已过时
Date的使用:1、方便快速的获取当前日期时间的Date对象:
2、配合一个SimpleDateFormate的类,完成根据我们使用要
求格式化时间日期字符串
不方便:1、没有办法设置一个除了当前时间日期以外的特定日期时间---使用Calendar类来解决
Date date = new Date();
SimpleDateFormat sd = new SimpleDateFormat("yyyy年MM月dd日 E hh:mm:ss");设置时间日期格式
String result = sd.format(date);
System.out.println(result);
采用 了工厂模式,无需使用者产生对象,由Calendar提供工厂方法生成对象,我们只管使用就可以了
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH,3); 给某个字段设置一个特定值(充分体现了设计符号常量的意义)
cal.set(1949,10,1); 根据年月日设置特定日期,月份需要-1处理
结论:1、获取当前日期时间,用Date
2、获取指定日期时间,用Calendar
3、获取格式化日期时间字符串,用Date配合SimpleDateFormat
4、掌握Calendar和Date之间的转换
4、Properties
是一个集合类(是用来装东西的容器)。
map ----映射
Properties props = new Properties(); 产生了一个容器
K(键) V(值)
props.setProperty("001","丁1");放数据的时候是KV对,成对存放
props.setProperty("002","丁2");
props.setProperty("002","丁22");放入重复键,相当于在做修改
String value = props.getProperty("001"); 获取数据
value = props.getProperty("003"); 如果键不存在不会报异常,而是返回null
props.remove("001"); 删除数据
Properties:相对于其他映射集合来说,最大的特点就是可以操作属性文件(一种用键值对表示的特殊文件)
//将文件存放在D:/test.properties,不加D,则存放在对应的工程文件中
存文件,如果文件不存在会在相应位置新建文件,并放入集合中所有的数据
如果文件存在,就会把集合中的所有数据存入,覆盖掉文件已有的数据
props.store(new FileOutputStream("D:/test.properties"),"第一次添加的数据");
读取文件:如果文件不存在,则会报错
Properties np = new Properties();
np.load(new FildInputStream)
5、System类
System.in 代表当前系统提供的标准输入流---往往特指控制台输入
用法:new Scanner(System.in)
System.out 代表当前系统提供的标准输出流---往往特指控制台输出
System.err 代表当前系统提供的错误流---也是指代控制台输出,红色字符
表示错误
System.err.println(”发生了一个错误“)
System类的常用方法:
System.gc();----召唤垃圾回收:不是操控,只能召唤
System.arraycopy();----完成数组拷贝
System.exit(0);----完成虚拟机的关闭(参数表示结束时的状态码,按惯
例非0表示异常结束)
//返回当前毫秒数
System.currentTimeMillis();---返回当前计算的时间,类型为long
long now = System.currentTimeMillis();
System.out.println(now);
当前时间原点:1970/1/1 00.00.00.000
//获取系统属性
String javaHome = System.getProperty("java.home");
System.out.println(javaHome);
Runtime类: