一、Objcet类
Object是类层次结构的根类
所有类都直接或间接继承自object类
1、构造方法:
Object类只有一个构造方法,且是无参构造
2、常用方法:
-
int hashCode()
:不同对象不同整数,相同对象返回相同整数 -
public final
Class<?> getClass()
:返回Class类型的对象,获取对象的运行时对象的类- 扩展:Class类的
String getName()
:返回当前类的名字
Student stu = new Student(); // 链式调用 System.out.println(stu.getClass().getName());
- 扩展:Class类的
-
public
String toString()
:返回对象的字符串表示形式,直接输出对象,相当于调用这个对象的toString方法。默认返回格式:
对象的 class 名称 + @ + hashCode 的十六进制字符串
。 -
public
boolean equals(Object obj)
:比较调用这个方法的对象和传入的对象是否相等。equals与 == 的区别 ==: 基本类型:比较值是否相等 引用类型:比较的是地址值是否相等 equals: 只能比较引用类型,默认情况也是比较地址值是否相等,如果要比较值是否相等的需要重写equals方法。 自定义的类重写equals方法:
-
protected void finalize():垃圾回收器回收对象的时候会调用此方法
System.gc(); // 运行垃圾回收器
-
protected
Object clone()
:创建并返回此对象的**副本**使用clone:
- 实现Cloneable接口(不实现报CloneNotSupportedException异常)
- 重写clone方法
- 需要抛异常(处理异常)
- 向下转型
二、String类
String 类不能被继承,因为被final修饰
String的底层是一个字符数组,因为它被final修饰一旦确定了值不可被更改。
概述:
java.lang.String类代表字符串。Java程序中所有的字符串文字(例如:“abc”)都可以看作是实现此类的实例。
类String中包括用于检查字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大小写的所有字符串的副本。
特点:
-
字符串不变:字符串的值在创建后不能被改变。
String str1 = "abc"; String str2 = "abc"; 此时str1 等于 str2 ???why? 因为通过直接赋值的方式创建的String将会被存储到方法区的常量池,系统将会在下一次创建这样的字符串时去常量池查找该值,如果有这个值就把该地址返回给这个String变量。
字符串常量池:
-
因为String对象是不可改变的,所以它可以被共享。
-
"abc"等效于
char[] data = {'a','b','c'};
String str= new String(data);
1、字符串的创建
String =创建的字符串存储在常量池中,而 new 创建的字符串对象在堆上:
// String直接创建,在常量池创建值
String str = "abc";
// new对象创建,在堆中创建值
String str = new String("abc");
// 传入char[]
char[] chs = {'a','b','c'};
String str = new String(chs);
2、获取功能的方法
- int length() 返回此字符串的长度。
- boolean equals(Object anObject)将此字符串与指定的对象比较。
- String concat(String str)将指定字符串连接到此字符串的结尾。
- char charAt(int index)返回指定索引处的 char 值。
- int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。
- int lastIndexOf(String str返回指定子字符串在此字符串中最右边出现处的索引。
- String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。
- String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。
- String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。如果有尾随的空字符串,不会加入到切割后的字符串数组当中。
- contains(CharSequence chars)判断是否包含指定的字符系列。
- boolean startsWith(String prefix)测试此字符串是否以指定的前缀开始。
- boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束
3、转换功能的方法
- char[] toCharArray()将此字符串转换为一个新的字符数组。
- byte[] getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
- String replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
- String toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
- String toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
- String trim()返回字符串的副本,忽略前导空白和尾部空白。
4、静态方法
-
static String join(CharSequence delimiter, CharSequence... elements)
返回由CharSequence elements
的副本组成的新String,该副本与指定的delimiter
的副本连接在一起.String str = String.join("拼接符","元素1","元素2",...); String str = String.join("-","a","b","c"); // str = "a-b-c"
StringBuffer类和StringBuilder类
StringBuffer和StringBuilder的方法类似
StringBuffer类
线程安全,可变的符号序列。字符串缓冲区就像一个String,但可以修改值, 并且不产生新的未使用对象。
多线程的情况下为了保证线程安全使用StringBuffer
StringBuilder类
一个可变的字符序列。此类提供与StringBuffer的API,但不保证同步(线程不安全)
StringBuilder不能安全的使用**多线程。如果需要同步,那么建议使用StringBuffer**
如果不需要保证线程安全的话建议优先使用StringBuilder
-
构造方法:
- StringBuilder():构造一个没有字符的字符串构建器,初始容量为16个字符。
- StringBuilder(CharSequence seq):构造一个包含与指定的相同字符的字符串构建器CharSequence。
- StringBuilder(int capacity):构造一个没有字符的字符串构建器,由capacity参数指定初始容量。
- StringBuilder(String str):构造一个初始化为指定字符串内容的字符串构建器。长度为
16+传入字符串长度
-
成员方法:
底层是一个char[]如果长度不够,会自动扩容
- public
StringBuffer append(String s)
:将指定的字符串追加到此字符序列。 - public
StringBuffer reverse()
:将此字符序列用其反转形式取代。 - public
delete(int start, int end)
:移除此序列的子字符串中的字符。 - public
insert(int offset, String str)
:将str
参数的字符串插入此序列中。 replace(int start, int end, String str)
使用给定String
中的字符替换此序列的子字符串中的字符。
3、String与StringBuilder的转换
- String -> StringBuilder
// 第一种 String str = "abc"; StringBuilder sb=new StringBuilder(str); // 第二种 String str = "abc"; StringBuilder sb=new StringBuilder(); sb.append(str)
- StringBuilder -> String
// 第1种 StringBuilder sb=new StringBuilder(); sb.toString(); // 第2种 StringBuilder sb=new StringBuilder(); String str = new String(sb);
- public
字符串类型作为参数的注意事项:
String虽然是引用类型,但是在作为参数时,效果与基本类型的传递是一样的(传递的是值,而不是地址)不会影响实参,但是如果通过StringBuffer等可变字符串传递,在方法中调用append()等方法的话会改变实参的值
三、Math类
math类的方法全是静态方法。
-
abs()返回参数的绝对值。
-
ceil() 向上取整,类型为双精度浮点型。
-
floor() 向下取整,类型为双精度浮点型。
-
round()它表示四舍五入 ,类型为整型
-
sqrt() 求参数的算术平方根。
-
random()返回一个[0-1)随机数。
-
Random类
Random random = new Random(); int num = random.nextInt(100); // 伪随机产生一个[0-100)的整数
-
四、Arrays类
arrays类的方法全是静态方法,需要用类名来调用
-
public static void
sort(需要排序的数组 a, int fromIndex, int toIndex)
:按升序对数组的指定范围进行排序。Arrays.sort(a[],startIndex,endIndex);
参数
a
- 要排序的数组fromIndex
- 要排序的第一个元素的索引(包括在内toIndex
- 要排序的最后一个元素的索引(不包括)
异常
- IllegalArgumentException
- 如果
fromIndex > toIndex - ArrayIndexOutOfBoundsException
- 如果
fromIndex < 0或
toIndex > a.length
-
Arrays.toString(object[] a)
:方法,将数组转变为字符串方便输出 -
Arrays.equls(object[] a,object[] b)
:,比较两个数组的内容是否相同,Arrays类已经重写了该方法 -
Arrays.binarySearch(Object[] a, Object key )
:方法, 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点/查找值应该在该数组的位置) - 1)。 -
Arrays.copyOf(Object[] original, int newLength)
:便于缩容扩容Arrays.copyOfRange(Object[] original,int from,int to)
:截取从[from,to)位置的元素到新数组。
五、System类
java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。 它不能被实例化。
- 在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
System类的成员变量:
-
public static final InputStream in;
“标准”输入流。 此流已打开并准备好提供输入数据。该流通常对应于**键盘输入**或由主机环境或用户指定的另一输入源。
// main方法的args接收参数。用于控制台运行java程序。 // 1、先将HelloWorld.java文件编译为class文件 : javac HelloWorld.java // 2、通过java命令运行class文件 //HelloWorld表示HelloWorld的class文件,后面的hello和world代表传递的参数,之间使用空格隔开的 java HelloWorld hello world
例子:
public class HelloWorld{ public static void main(String[] args){ if(args.length == 0){ System.out.println("此main方法没有传递参数!"); return; } System.out.println("此main方法传递de参数!"); for(String arg : args){ System.out.print(arg+"\t"); } } }
//在jdk1.5之后java引入了Scanner类便于用户输入 Scanner sc = new Scanner(System.in); 在读取前一般需要使用 hasNext()与 hasNextLine()判断是否还有输入的数据: String str = sc.next(); next(): //1、一定要读取到有效字符后才可以结束输入。 //2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。 //3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。 //4、next() 不能得到带有空格的字符串。 str = sc.nextLine(); nextLine(): //1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。 //2、可以获得空白。 如果要输入 int 或 float 等类型的数据,在Scanner类中也有支持,但是在输入之前最好先使用 hasNextXxx()方法进行验证 int i1 = sc.nextInt(); // 接收输入整数 float f1 = sc.nextFloat(); // 接收输入的浮点数 double d1 = sc.nextDouble(); // 接收输入的双精度浮点数 long l1 = sc.nextLong(); Byte b1 = sc.nextByte(); Short s1 = sc.nextShort(); booleam bool1 = sc.nextBoolean(); BigInteger big1 = sc.nextBigInteger();
-
public static final PrintStream out;
“标准”输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。
对于简单的独立Java应用程序,编写一行输出数据的典型方法是:
System.out.println(data)
-
public static final PrintStream err;
“标准”错误输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。
按照惯例,此输出流用于显示应立即引起用户注意的错误消息或其他信息。
成员方法:
-
public static void gc()
:运行垃圾回收器。 -
public static void exit(int status)
:终止当前正在运行的java虚拟机,参数用作状态码;根据惯例,非 0 的状态码表示异常终止。public static void main(String[] args){ System.out.println("我正在学java"); System.exit(0); System.out.println("我正在学java"); System.out.println("我正在学java"); System.out.println("我正在学java"); } // 正常情况会打印四句"我正在学java",但是遇到System.exit(0);将会终止当前运行的虚拟机(java程序是运行在jvm上的),所以java程序也会终止运行。
-
static long currentTimeMills()
:基于系统时间返回当前时间的毫秒数,从1970年1月1日0:0:0到当前时间。// 打印输出10000个helloworld需要花费的毫秒数 public static void main(String[] args){ //获取当前时间的毫秒值 long start = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++){ System.out.println("第"+i+"个hello world"); } // 获取打印完成后的毫秒数 long end = System.currentTimeMillis(); //输出结果自己测试 System.out.println("这段程序共用了"+(end - start)+"毫秒"); }
补充:
public static long nanoTime()
: 返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。 仅当计算在Java虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。区别:
- System.nanoTime()的精确度更高一些,如今的硬件设备性能越来越好,如果要更精密计算执行某行代码或者某块代码所消耗的时间,该方法会测量得更精确。
- 记录当前时间,用System.currentTimeMills()单独获取System.nanoTime()没有什么意义,因为该值是随机的,无法表示当前的时间。
- System.currentTimeMills()得到的值是基于系统时间的,值可以人为地进行修改。能够和Date类方便地转换。
- 如果需要根据时间差来过滤某些频繁的操作,用System.nanoTime()会比较合适。
-
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。参数说明: src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 异常 IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。 ArrayStoreException - 如果由于类型不匹配, src阵列中的元素无法存储到 dest阵列中。 NullPointerException - 如果 src或 dest是 null。
public static void main(String[] args){ int[] arr = {11 , 12 , 13 , 14 , 15}; int[] arr2 = {1, 2 , 3 , 4 , 5}; System.arraycopy(arr, 1, arr2, 2, 2); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(arr2)); //输出结果为: //[11 , 12 , 13 , 14 , 15] //[1 , 2 , 12 , 13 , 5] }
rc或 dest是 null。
```java
public static void main(String[] args){
int[] arr = {11 , 12 , 13 , 14 , 15};
int[] arr2 = {1, 2 , 3 , 4 , 5};
System.arraycopy(arr, 1, arr2, 2, 2);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
//输出结果为:
//[11 , 12 , 13 , 14 , 15]
//[1 , 2 , 12 , 13 , 5]
}