day16
java.lang.String类型:字符串类型
1、String类型是final修饰,不能被继承的
2、Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
简单的说,就是程序中的所有""构成的都是String的对象,只不过他们是字符串常量对象。
比较特殊的空字符串常量对象:"",它的长度为0
3、所有的 字符串都是常量;它们的值在创建之后不能更改。
简单理解就是String对象是不可变的,一旦修改(拼接、截取、替换...)一定会产生新的字符串对象。
4、因为 String 对象是不可变的,所以可以共享。
字符串常量对象是共享的,存在字符串的常量池中。
字符串常量池在JVM内存的哪个部分:
JDK1.6:方法区
JDK1.7:堆中单独开辟一块空间用于存储字符串的常量
JDK1.8:从堆中又挪出来,挪到了“元空间”
5、字符串对象中如何存储字符串的内容
内部使用一个char[]数组来存储的
"hello" -> {'h','e','l','l','o'}
字符串对象不可变有很多原因:
(1)value数组是final修饰的,无法创建新的value数组
(2)String类型中没有提供修改value数组的元素的方法
字符串的比较:
(1)==比较地址
(2)equals比较字符串内容
字符串对象的创建:
1、String str = "hello";
2、String s2 = new String("hello");
字符串的常用方法系列1:
(1)int length():返回字符串对象的长度,其实就内部value数组的长度
(2)String toUpperCase():把当前字符串中的字符转成大写,返回一个新的字符串对象
(3)String toLowerCase():把当前字符串中的字符转成小写,返回一个新的字符串对象
(4)字符串比较:boolean equals() 严格区分大小写
boolean equalsIgnoreCase():不区分大小写
(5)String trim():去掉前后空格
(6)String concat():完全等价于 +
(7)判断字符串是否为空
!"".equals(字符串) 非空
"".equals(字符串) 空字符串
字符串的常用方法系列之二:
字符串与字符数组之间的转换:
1、把字符数组 -> 字符串
String(char[] arr):用整个数组构建字符串
String(char[] arr, int start, int count):取arr[start]开始的count个字符构造字符串
2、把字符串转成字符数组:
char[] toCharArray()
思想:
String中用char[] value存
toCharArray()复制了一个新数组,原因是保证字符串的不可变性
3、取第几个字符
charAt(index)
String的常用方法系列三:
编码与解码
字符:给人看的
字节:给机器识别
所以在开发中,输出到“文件”,在网络中传输,都要把“字符”->"字节"
如果对方接收到数据,从"文件”中读取,显示给用户看,又得“字节”-“字符”
编码:把字符-->字节
解码:把字节-->字符
编码方式:GB2312,GBK,UTF-8,ISO8859-1
编码的方法:
byte[] getBytes():按照平台默认的字符编码
byte[] getBytes(String charsetName) :按照指定的字符编码方式进行编码
解码的方法:
String(byte[] data):按照平台默认的字符编码
String(byte[] data,String charsetName):按照指定的字符编码方式进行解码
GBK:一个汉字对应2个字节
UTF-8:一般一个汉字对应3个字节
ASCII码表中的字符是在任意字符集中都兼容的,这些个只占1个字节
String的常用方法系列之四:
判断字符串是否以xx开头,结尾
boolean startsWith(xx)
boolean endsWith(xx)
String的常用方法系列之五:
在字符串中查找:
(1)boolean contains(str):是否包含
(2)int indexOf(str):如果存在就返回从左到右第一次出现的下标,否则返回-1
(3)int lastIndexOf(str):如果存在就返回最后一次出现的下标,否则返回-1
字符串的常用方法系列六:
字符串的截取
substring(起始下标) [起始下标,最后]
substring(起始下标,结束下标) [起始下标,结束下标)
几个和正则相关的String方法:
正则:不是Java的概念,在js等其他语言都有正则。
正则表达式的目的是为了按照某个格式要求去匹配字符串
1、boolean matches(正则):判断当前字符串是否满足某种正则(规则)
2、String replaceAll(正则,新值):把当前字符串中的复合这个“正则”部分替换为“新值”
3、String replaceFirst(正则,新值):把当前字符串中的找到的第一个复合这个“正则”部分替换为“新值”
4、String[] split(正则):按照要求进行拆分
和正则无关的替换方法:
(1)String replace(char oldChar, char newChar) :注意形参是char
(2)String replace(CharSequence target, CharSequence replacement) :形参是字符虚列,就是字符串
java.lang.String:对象不可变,一旦变就会有新对象
字符串的兄弟类:可变字符序列
java.lang.StringBuffer:线程安全的可变字符序列。旧的。效率相对低。
java.lang.StringBuilder:线程不安全的可变字符序列。新的JDK1.5。效率更高
StringBuffer和StringBuilder的API是完全兼容,即方法签名一样,不一定的是一个适用于单线程,一个在适用于多线程。
StringBuffer和StringBuilder对象的创建必须通过new,和String的可以直接等于"xxx"不同
StringBuffer和StringBuilder的方法:
(1)append(xx):直接在value中修改,如果value长度不够了,会重写扩容为原来的2倍+2。默认的value长度为16
(2)insert(int offset, xx):即在字符串缓冲区的[offset]开始插入xx。如果value长度不够,也会扩容。
(3)delete(int start, int end):删除[start,end)
deleteCharAt(int index):删除指定位置的字符
(4)reverse()
(5)String toString()
系统类java.lang.System:
常量对象有三个
(1)System.out:打印普通信息 PrintStream
(2)System.err:打印错误信息 PrintStream
(3)System.in:默认情况下,代表键盘输入 InputStream
其他的方法:
(1)System.currentTimeMillis():当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
(2)System.arraycopy(src, srcPos, dest, destPos, length):
如果src和dest是不同的数组,表示复制,从srt的[srcPos]开始,一共复制length个到dest的[destPos]开始存。
如果src和dest是同一个数组,表示移动元素:
如果srcPos > destPos:左移 一般用于删除
如果srcPos < destPos:右移 一般用于插入
(3)System.gc():表示通知垃圾回收器来回收垃圾,但不是立马响应,但是只要调用了,一定会来。
开发是不建议手动调用gc()方法,因为垃圾回收算法已经很好了。
(4)System.exit(0):0表示正常退出
System.exit(1):1表示异常退出
(5)Properties getProperties() :获取系统属性
....
String中内部用final char[] value;
StringBuffer和StringBuilder的内部用:char[] toStringCache;
ava.util.Calendar:日历类型
它的子类:GregorianCalendar
方法:
(1) Calendar getInstance()
(2)get(常量名)
DK1.8之前:
java.util.Date:
类 Date 表示特定的瞬间,精确到毫秒。
(1)new Date():获取系统时间
(2)new Date(毫秒值):把毫秒转时间
(3)long getTime():把时间转毫秒
日期时间的格式化:
1、把指定格式字符串转成日期时间对象
2、把日期时间对象转成指定格式字符串
java.text.DateFormat
java.text.SimpleDateFormat
(1)Date parse(字符串)
(2)String format(Date的日期对象)