Java SE 核心 I
1、Object类
在 Java 继承体系中,java.lang.Object 类位于顶端(是所有对象的直接或间接父类)。如果一个类没有写 extends 关键字声明其父类,则该类默认继承 java.lang.Object 类。Object 类定义了“对象”的基本行为,被子类默认继承。
public class Object
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
11个方法:3个重载方法。9个方法。
1)toString():得到对象的字符串表示形式。
2)equals(Object o):比较两个对象是否相等的。(比较内容)。
3)getClass():得到对象的大Class 对象。
4)hashCode():得到对象的哈希码。
5)wait():线程等待。(重载)
6)notify():唤醒线程。
7)notifyAll():唤醒所有线程。
8)clone():克隆 对象。
9)inalize():垃圾回收相关的。
2、String类
是字符串类型,是引用类型,是“不可变”字符串,无线程安全问题。在 java.lang.String中
注意事项:String str =“abc”;和 String str=new String(“abc”);的区别!
1)String 在设计之初,虚拟机就对他做了特殊的优化,将字符串保存在虚拟机内部的字符串常量池中。一旦我们要创建一个字符串,虚拟机先去常量池中检查是否创建过这个字符串,如有则直接引用。String 对象因为有了上述的优化,就要保证该对象的内容自创建开始就不能改变!所以对字符串的任何变化都会创建新的对象,而不是影响以前的对象!
2)String 的 equals 方法:两个字符串进行比较的时候,我们通常使用 equals 方法进行比较,字符串重写了 Object 的 equals 方法,用于比较字符串内容是否一致。虽然 java 虚拟机对字符串进行了优化,但是我们不能保证任何时候“==”都成立!
3)编程习惯:当一个字符串变量和一个字面量进行比较的时候,用字面量.equals 方法去和变量进行比较,即:if("Hello".equals(str))因为这样不会产生空指针异常。而反过来用,即:if(str.equals("Hello"))则我们不能保证变量不是 null,若变量是 null,我们在调用其 equals 方法时会引发空指针异常,导致程序退出。若都为变量则 if(str!=null&&str.equals(str1))也可。
4)String 另一个特有的 equals 方法:euqalsIgnoreCase,该方法的作用是忽略大小写比较字符串内容,常用环境:验证码。if("hello".equalsIgnoreCase(str))。
5)String 的基本方法:
① String toLowerCase():返回字符串的小写形式。如:str.toLowerCase()
② String toUpperCase():返回字符串的大写形式。如:str.toUpperCase()
③ String trim():去掉字符串两边的空白(空格\t\n\r),中间的不去。如:str.trim()
④ boolean startsWith():判断字符串是否以参数字符串开头。如:str.startsWith("s")
⑤ boolean endsWith():判断字符串是否以参数字符串结尾。如:str.endsWith("s")
⑥ int length():返回字符串字符序列的长度。如:str.length()
6)indexOf 方法(检索):位置都是从 0 开始的。
①int indexOf(String str):在给定的字符串中检索 str,返回其第一次出现的位置,找不到则返回-1。
②int indexOf(String str,int from):在给定的字符串中从 from 位置开始检索 str,返回第一次出现的位置,找不到则返回-1(包含 from 位置,from 之前不看)
③int lastIndexOf(String str):在给定的字符串中检索 str,返回其最后一次 出 现 的位置,找不到则返回-1(也可认为从右往左找,第一次出现的位置)。
④int lastIndexOf(String str,int from):给定字符串从 from 位置开始检索str,返回最后一次出现的位置,找不到则返回-1(包含 from 位置,from 之后的不看)
7)charAt 方法:char charAt(int index):返回字符串指定位置(index)的字符。
8)substring 方法(子串):字符串的截取,下标从 0 开始的。
①String substring(int start,int end):返回下标从 start 开始(包含)到 end 结束的字符串(不包含)。
②String substring(int start):返回下标从 start 开始(包含)到结尾的字符串。
9)getBytes 方法(编码):将字符串转换为相应的字节。
①byte[] getBytes():以当前系统默认的字符串编码集,返回字符串所对应的二进制序列。
如:byte[] array=str.getBytes(); System.out.println(Arrays.toString(array));
②byte[] getBytes(String charsetName):以指定的字符串编码集,返回字符串所对应的二进制序列。这个重载方法需要捕获异常,这里可能引发没有这个编码 集的异常,UnsupportedEncodingException,如:str="常"; byte[] bs=info.getBytes("UTF-8");
注意事项:
Windows 的默认编码集 GBK:英文用 1 个字节描述,汉字用 2 个字节描述;
ISO-8859-1 欧洲常用编码集:汉字用 3 个字节描述;GBK 国标;GB2312国标;UTF-8 编码集是最常用的:汉字用 3 个字节描述。
编码:将数据以特定格式转换为字节;解码:将字节以特定格式转换为数据。
String(byte[] bytes, String charsetName) :通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。如:String str=new String(bs,"UTF-8");
10)split 方法(拆分):字符串的拆分。
String[] split(String regex):参数 regex 为正则表达式,以 regex 所表示的字符串为分隔符,将字符串拆分成字符串数组。其中,regex 所表示的字符串不被保留,即不会存到字符串数组中,可理解为被一刀切,消失!
11)replace 方法:字符串的替换。
String replaceAll(String regex,String replacement):将字符串中匹配正则表达式 regex的字符串替换成 replacement。如:String str1=str.replaceAll("[0-9]+", "chang");
12)String.valueOf()方法:重载的静态方法,用于返回各类型的字符串形式。
String类常用方法
问题序列:
1)为什么String对象称为“不可变对象?
2)看图
3)String类和常量池
在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种:
1. 全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3. 运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
4)Java常用类的基本用法(结合Java API文档学习)
String类常用方法一
String类常用方法二
3、StringBuilder
与 String 对象不同,StringBuilder 封装“可变”的字符串,有线程安全问题。对象创建后,可通过调用方法改变其封装的字符序列。
StringBuilder 常用方法:
1)追加字符串:StringBuilder append(String str)
2)插入字符串:StringBuilder insert(int index,String str):插入后,原内容依次后移
3)删除字符串:StringBuilder delete(int start,int end)
4)替换字符串:StringBuilder replace(int start,int end,String str):含头不含尾
5)字符串反转:StringBuilder reverse()
StringBuilder和StringBuffer
StringBuilder和StringBuffer非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
StringBuilder和StringBuffer称之为“可变字符序列”。那两者有什么区别呢?
1)StringBuffer JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。
2)StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
4、Date时间类(java.util.Date)
java.util.Date 类用于封装日期及时间信息,一般仅用它显示某个日期,不对他作任何操作处理,作处理用 Calendar 类,计算方便。查看API文档大家可以看到其实Date类中的很多方法都已经过时了。JDK1.1之前的Date包含了:日期操作、字符串转化成时间对象等操作。JDK1.1之后,日期操作一般使用Calendar类,而字符串的转化使用DateFormat类。
5、Calendar日历类
java.util.Calendar 类用于封装日历信息,其主作用在于其方法可以对时间分量进行运算。
1)通过 Calendar 的静态方法获取一个实例该方法会根据当前系统所在地区来自行决定时区,帮我们创建 Calendar 实例,这里要注意,实际上根据不同的地区,Calendar 有若干个子类实现。而 Calendar 本身是抽象类,不能被实例化!我们不需要关心创建的具体实例为哪个子类,我们只需要根据 Calendar 规定的方法来使用就可以了。
2)日历类所解决的根本问题是简化日期的计算,要想表示某个日期还应该使用 Date 类描述。Calendar 是可以将其描述的时间转化为 Date 的,我们只需要调用其 getTime()方法就可以获取描述的日期的 Date 对象了。
3)通过日历类计算时间:为日历类设置时间,日历类设置时间使用通用方法 set。set(int field,int value),field 为时间分量,Calendar 提供了相应的常量值,value 为对应的值。
4)只有月份从 0 开始:0 为 1 月,以此类推,11 为 12 月,其他时间是正常的从 1 开始。也可以使用 Calendar 的常量 calendar.NOVEMBER……等。
5)Calendar.DAY_OF_MONTH 月里边的天---号;
Calendar.DAY_OF_WEEK 星期里的天---星期几
Calendar.DAY_OF_YEAR 年里的天
6)获取当前日历表示的日期中的某个时间单位可以使用 get 方法.
6、DateFormat类和SimpleDateFormat类
把时间对象转化成指定格式的字符串。反之把指定格式的字符串转化成时间对象。DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。
7、包装类(包装类均位于java.lang包,八种包装类和基本数据类型的对应关系)
Java 语言的 8 种基本类型分别对应了 8 种“包装类”。每一种包装类都封装了一个对应的基本类型成员变量,同时还提供了针对该数据类型的实用方法。
1)包装类的目的:用于将基本类型数据当作引用类型看待。
2)包装类的名字:除了 Integer(int),Character(char)外,其余包装类名字都是基本类型名首字母大写。
3)拆、装箱:Integer i=new Integer(1);创建一个以对象形式存在的整数 1,这种从基本类型转为引用类型的过程称之为“装箱”,反之叫“拆箱”。
4)装箱:方式一:Double d=new Double(2.2);//装箱
方式二:Double d=Double.valueOf(2.2);//基本类型都有 valueOf 方法
5)拆箱:double num=d.doubleValue();//拆箱
6)包装类使用前提:JDK1.5+
已经有了基本数据类型了,为何还要提供对应的包装类型的?
原因:
1:包装类中提供了各种用于操作基本数据类型的方法,主要的方法就是基本数据类型和字符串之间的相互的转换。
2:有些时候,基本数据类型不能直接使用,必须当作 Object 的实例才能使用。必须有对应的包装的类型才能满足需求。
自动装箱和拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing)
自动装箱底层实现:通过调用 Integer.valueOf(int) 实现。
自动拆箱底层实现:通过调用 对象.intValue()来实现的。
包装类空指针异常问题
null表示i没有指向任何对象的实体,但作为对象名称是合法的(不管这个对象名称存是否指向了某个对象的实体)。由于实际上i并没有指向任何对象的实体,所以也就不可能操作intValue()方法,这样上面的写法在运行时就会出现NullPointerException错误所以自动装箱与拆箱的功能是所谓的“编译器蜜糖(Compiler Sugar)”,虽然使用这个功能很方便,但在程序运行阶段得了解Java的语义,如不熟悉特殊情况,可能会出错!
来源:https://www.cnblogs.com/cao-yin/p/9588258.html