Java基础
1、Object
1.Object是所有类的根类,所有的类都是直接或者间接的去继承Object类。
根类:最上层的类
超类:根类和父类之间的类
2.类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
3.Object里面的方法:
(1)toString:
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
(2)hashCod:
由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。每一个对象都有一个唯一的hash值。
(3)finalize:
用于垃圾回收,我们不用手动的去调用,由jvm来调用,
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
(4)equals:
==:
1.基本数据类型:比较的是值
2.引用数据类型:比较的是地址
2、字符串
字符串是类,是引用的数据类型
String str = “abc”;
这是定义了一个字符串的常量。常量是不可改变的量,字符串是不能改变的。
1.字符串常量是共享的
2.字符串不能变化,如果我们在字符串上做拼接,其实是新产生一个字符串。
空字符串和null的区别:空字符串是有效的引用,有地址的,只不过是内容的长度是0,null这个引用是空引用,不能使用。使用一定会报空指针的错误。引用数据类型的默认值是null。
字符串的常用方法:
1. boolean equals = s.equals(s1); //判断两个字符串的值是否相等
2. boolean empty = "".isEmpty();//判断一个字符串是否是空串
3.int length = s.length(); //获得一个字符串的长度
4.char[] chars = s.toCharArray();//把字符串转换成字符的数组
5. String s1 = s.substring(5, 8);//截取指定的开始索引和结束索引之间的字符串,包头不包尾
6.String[] s1 = s.split("\\-"); //把一个字符串按着某种字符拆分成数组(\\:防止转义字符)
3、可变字符串
StringBuffer创建后值可以变化(增删改),地址不会有变化,不会产生新的字符串。
多个线程同时操作同一个资源的时候,可能发生数据安全性的问题。
StringBuffer是线程同步的(线程安全的)。
注意:凡事有利就有弊,牺牲了性能。
追加:append
可变字符串的追加返回的都是这个可变字符串的本身的引用,所以通过链式方式来追加代码。
插入:insert
删除:delete
4、包装类
把基本数据类型转换成类,我们使用基本数据类型做进制转换很麻烦,对于临界值也不好判断,我们的包装类提供了很多方法供我们使用,这样会方便很多。
基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
Integer常用做类型直接的转换(Integer,int ,String)
Integer i = new Integer ( 10 ) ;
int i1 = i. intValue ( ) ;
Integer i2 = new Integer ( "55" ) ;
String s2 = i2 + "" ;
String s3 = i3 + "" ;
int i4 = Integer. parseInt ( s3) ;
注意:
System. out. println ( i == i1) ;
System. out. println ( i. intValue ( ) == i1. intValue ( ) ) ;
boolean equals = i. equals ( i1) ;
默认值:基本数据类型int 的默认值是0 ,Integer的默认值是null
5、自动装箱拆箱
装箱:把int类型转换正Integer--------------》new Integer(int i)
拆箱:把Integer转换成int------------》intValue()对象方法
装箱和拆箱是不需要我们主动调用的,是jvm自动给我们完成的。
其他的7种基本数据类型和Integer一样。
6、date
Date d = new Date ( ) ;
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss SSS E" ) ;
String format = sdf. format ( d) ;
String s = "1997/12/12 12:34:22" ;
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy/MM/dd HH:mm:ss" ) ;
try {
Date date = sdf. parse ( s) ;
System. out. println ( date) ;
} catch ( ParseException e) {
e. printStackTrace ( ) ;
}
7、集合
概念:对象的容器,定义对多个对象进行操作的常用方法。可实现数组的功能。
和数组的区别:
(1)数组长度固定,集合长度不固定。
(2)数组可以存储基本类型和引用类型,集合只能存储引用类型。
位置:java.util.*;
(1)Collection体系集合
Collection:该体系结构的跟接口,代表一组对象,称为“集合”。
List接口的特点:有序、有下标、元素可重复。
Set接口的特点:无序、无下标、元素不能重复。
Collection接口方法:
1.add(Object obj)//添加一个对象。
2.addAll(Collection c)//将一个集合中的所有对象添加到此集合中。
3.clear()//清空次集合中的所有对象。
4.contains(Object o)//检查此集合中是否包含o对象。
5.equals(Object o)//比较此集合是否与指定对象相等。
6.isEmpty()//判断此集合是否为空。
7.remove(Object o)//在此集合中移除o对象。
8.size()//返回此集合中的元素个数。
9.Object[] toArray()//将此集合转换成数组
遍历元素(重点)
1. 使用增强for
for ( Object o: collection) { System. out. println ( o) ; }
2. 使用迭代器(迭代器专门用来遍历集合的一种方式)
Iterator it= collection. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
it. remove ( ) ;
}
(2)List
1.List是有序的集合,就像我们的数组一样。我们可以把list理解为是一个长度可变的数组,而且提供了丰富的api。List的集合底层就是数组。
2.List的迭代器ListIterator
3.通过ListIterator的方式遍历
我们可以使用for循环来动态的遍历List集合
4.List中元素是可以重复的。
方法:
add ( int index, Object o)
addAll ( int index, Collection c)
get ( int index)
subList ( int fromIndex, int toIndex)
ListIterator lit= list. listIterator ( ) ;
while ( lit. hasPrevious ( ) ) {
System. out. println ( lit. Previous ( ) ) ;
}
(3)ArrayList
数组结构实现,查询快,增删慢;
运行效率快,线程不安全。
ArrayList在添加数据的时候初始的长度是10,后续会以1.5倍来扩充集合的长度。
(4)LinkedList
链表结构实现,查询慢,增删快;
Linked也不是线程安全的。
(5)Vector
数组结构实现,查询快,增删慢;
运行效率慢,线程安全。
Vector底层也是数组。
线程安全的。
(6)HashSet
基于HashCode计算元素存放位置。后者存入。
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
存储结构:哈希表(数组+链表+红黑树)
存储过程:
(1)根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
(2)再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表。
(7)TreeSet
基于排列顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序。
元素对象的类型必须实现Comparable接口,指定排序规则。
通过CompareTo方法确定是否为重复元素。(CompareTo方法返回值为0,认为是重复元素)
CompareTo:实现定制比较(比较器)
(8)Map集合
特点:
1.用于存储任意键值对(key-value)
2.键:无序、无下标、不允许重复(唯一)
3.值:无序、无下标、允许重复
方法:
put(K key,V value)//将对象存入到集合中,关联键值。key重复则覆盖原值。
get(Object key)//根据键获取对应的值。
entrySet()//返回此映射中包含的映射关系的Set视图。
keySet()//返回此映射中包含的键的Set视图。
使用entrySet ( ) 方法遍历:
for ( Map. Entry< String, String> entry: map. entrySet ( ) ) {
System. out. println ( entry. getKey ( ) + "---" + entry. getValue ( ) ) ;
}
总结:
1.HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16.
2.当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
3.jdk1.8当每个链表长度大于8,并且数组元素个数大于等于64时,会调整红黑树,目的提高执行效率。
4.jdk1.8当链表长度小于6时,调整成链表。
5.jdk1.8以前,链表时头插入,jdk1.8以后时是尾插入。
HashMap:线程不安全,运行效率快;允许用null作为key或是value。
Hashtable:线程安全,运行效率慢;不允许用null作为key或是value。
Properties:Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
TreeMap:实现了SortedMap接口(是Map的子接口),可以对key自动排序。(元素对象的类型实现Comparable接口)
(9)Collections工具类
集合工具类,定义了除了存取以外的集合常用方法。
Collections. sort ( list) ;
Collections. binarySearch ( list, 13 ) ;
Collections. copy ( dest, list) ;
Collections. reverse ( list) ;
Collections. shuffle ( list) ;
Integer[ ] arr= list. toArray ( new Integer [ 0 ] ) ;
List< String> list= Arrays. asList ( arr) ;
8、泛型
本质是参数化类型,把类型作为参数传递。
常见形式有泛型类、泛型接口、泛型方法。
语法:<T,...> T称为类型占位符,表示一种引用类型。
好处:(1)提高代码的重用性。
(2)防止类型转换异常,提高代码的安全性。
泛型类注意:
1.泛型只能使用引用类型
2.不同泛型类型对象之间不能相互赋值。
9、文件
(1)文件构造器
File file = new File ( "D:\\tx.txt" ) ;
File file1 = new File ( "D:\\aaa" , "拓薪教育.txt" ) ;
File file2 = new File ( "D:\\aaa" ) ;
File file3 = new File ( file2, "拓薪教育.txt" ) ;
(2)创建文件
File file = new File ( "D:\\aaa\\hello.txt" ) ;
boolean newFile = file. createNewFile ( ) ;
File file = new File ( "D:\\aaa\\bbb" ) ;
boolean mkdir = file. mkdir ( ) ;
File file = new File ( "D:\\aaa\\ccc\\hhh\\ggg" ) ;
boolean mkdir = file. mkdirs ( ) ;
(3)文件删除
File file = new File ( "D:\\tx.txt" ) ;
file. delete ( ) ;
File file1 = new File ( "D:\\aaa\\bbb" ) ;
boolean delete = file1. delete ( ) ;
(4)文件判断
File file = new File ( "D:\\tx.txt" ) ;
boolean exists = file. exists ( ) ;
boolean isFile = file. isFile ( ) ;
boolean isDir = file. isDirectory ( ) ;
boolean absolute = file. isAbsolute ( ) ;
boolean b = file. canRead ( ) ;
boolean w = file. canWrite ( ) ;
boolean h = file. isHidden ( ) ;
(5)文件获取
File file = new File ( "D:\\tx.txt" ) ;
String absolutePath = file. getAbsolutePath ( ) ;
String path = file. getPath ( ) ;
String name = file. getName ( ) ;
long length = file. length ( ) ;
long l = file. lastModified ( ) ;
File[ ] files = File. listRoots ( ) ;
File file1 = new File ( "D:\\aaa" ) ;
File[ ] files1 = file1. listFiles ( ) ;
for ( File f : files1) {
System. out. println ( f) ;
}
String[ ] list = file1. list ( ) ;
System. out. println ( Arrays. toString ( list) ) ;
10、IO流
(1)概述
流概念:内存与存储设备之间传输数据的通道。
IO概述:IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。
对于java来说输入输出问题,java将它抽象成流对象来解决。
以游戏程序为中心读取文件就是输入,写入文件是输出。
(2)分类
IO流在java中从输入输出角度分类:
1.输入流:将存储设备中的内容读入到内存中。
2.输出流:将内存中的内容写入到存储设备中。
IO流在java中从数据的角度来分类:
1.字符流:以字符为单位,只能读写文本数据。
文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等
2.字节流:以字节为单位,可以读写所有数据。
二进制的数据,这种数据一般用文本打开我们读不懂。比如,图片文件,mp3文件,等等。
(3)字节流
1. 输入:
FileInputStream fis= new FileInputStream ( "D:\\test.txt" ) ;
int data= 0 ;
while ( ( data= fis. read ( ) ) != - 1 ) {
System. out. println ( ( char ) data) ;
}
int count= 0 ;
byte [ ] buf= new byte [ 3 ] ;
while ( ( count= fis. read ( buf) ) != - 1 ) {
System. out. println ( new String ( buf, 0 , count) ) ;
}
fis. close ( ) ;
2. 输出:
FileOutputStream fos= new FileOutputStream ( "D:\\test.txt" , true ) ;
fos. write ( 97 ) ;
fos. write ( 'b' ) ;
fos. write ( 'c' ) ;
String s= "helloworld" ;
fos. write ( s. getBytes ( ) ) ;
fos. close ( ) ;
(4)缓冲字节流
1. 输入流:
FileInputStream fis= new FileInputStream ( "D:\\test.txt" ) ;
BufferedInputStream bis= new BufferedInputStream ( fis) ;
2. 输出流:
FileOutputStream fos= new FileOutputStream ( "D:\\test.txt" ) ;
BufferedOutputStream bis= new BufferedOutputStream ( fos) ;
for ( int i= 0 ; i< 10 ; i++ ) {
bos. write ( "helloworld" . getBytes ( ) ) ;
bos. flush ( ) ;
}
(5)对象流
使用流传输对象的过程称为序列化、反序列化。(序列化类必须要实现Serializable接口)
1. 序列化( 将对象通过流写入到文件)
FileOutputStream fos= new FileOutputStream ( "D:\\test.txt" ) ;
ObjectOutputStream oos= new ObjectOutputStream ( fos) ;
Student zhangsan= new Student ( "张三" , 20 ) ;
oos. writeObject ( zhangsan) ;
oos. close ( ) ;
2. 反序列化( 将对象通过流读取到内存)
FileInputStream fos= new FileInputStream ( "D:\\test.txt" ) ;
ObjectInputStream ois= new ObjectInputStream ( fos) ;
Student s= ( Student) ois. readObject ( ) ;
oos. close ( ) ;
3. 注意事项:
(1 )序列化类必须要实现Serializable接口。
(2 )序列化类中对象属性要求实现Serializable接口
(3 )序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类。
(4 )使用transient (瞬间的)修饰属性,这个属性不能序列化。
(5 )静态属性不能序列化。
(6 )序列化多个对象,可以借助集合实现。
(6)字符流(使用字符流向一个文件输入helloworld)
File file = new File ( "test.txt" ) ;
Writer writer = null;
try {
writer = new FileWriter ( file) ;
for ( int i = 0 ; i < 100 ; i++ ) {
writer. write ( "HelloWorld\r\n" ) ;
if ( i % 10 == 0 ) {
writer. flush ( ) ;
}
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
} finally {
if ( writer != null) {
try {
writer. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}
(7)缓冲字符流
1. 输入流:
FileReader fr= new FileReader ( "D:\\test.txt" ) ;
BufferedReader br= new BufferedReader ( fr) ;
br. readLine ( ) ;
2. 输出流:
FileWriter fw= new FileWriter ( "D:\\test.txt" ) ;
BufferedWriter bw= new BufferedWriter ( fw) ;
for ( int i= 0 ; i< 10 ; i++ ) {
bw. write ( "helloworld" . getBytes ( ) ) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
(8)打印流
PrintWriter pw= new PrintWriter ( "D:\\test.txt" ) ;
pw. println ( 97 ) ;
(9)转换流
FileInputStream fis= new FileInputStream ( "D:\\test.txt" ) ;
InputStreamReader isr= new InputStreamReader ( fis, "gbk" ) ;
FileOutputStream fos= new FileOutputStream ( "D:\\test.txt" ) ;
OutputStreamWriter osw= new OutputStreamWriter ( fos, "gbk" ) ;
11、Properties
Properties:属性集合
特点:
1.存储属性名和属性值。
2.属性名和属性值都是字符串类型。
3.没有泛型。
4.和流有关。
Properties properties= new Properties ( ) ;
properties. setProperty ( "username" , "zhangsan" ) ;
properties. setProperty ( "age" , "20" ) ;
Set< String> pronames= properties. stringPropertyNames ( ) ;
for ( String pro: pronames) {
System. out. println ( pro+ "===" + properties. getProperty ( pro) ) ;
}
PrintWriter pw= new PrintWriter ( "D:\\test.txt" ) ;
properties. list ( pw) ;
pw. close ( ) ;
FileOutputStream fos= new FileOutputStream ( "D:\\test.txt" ) ;
properties. store ( fos, "注释" ) ;
fos. close ( ) ;
Properties properties2= new Properties ( ) ;
FileInputStream fis= new FileInputStream ( "D:\\test.txt" ) ;
properties. load ( fis) ;
fos. close ( ) ;