Java基础知识备忘录(三)

String类:

String创建出来的实例时不可修改的,除非实在字符串缓存区创建的字符串可以修改,所有String的实例时可以共享的
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
String类型在JDK9之前使用char保存,在9之后使用byte保存,节约了内存
string.length():获取字符串的长度
string.index(String s):返回子字符串出现的位置,-1未找到
string.index(int ch):同上,数字表示字符,具体查看ASCLL,int和char类型可以互相转化
string.lastIndexOf(String s):从后向前查找,返回子字符串出现的位置,-1未找到
string.charAt(int i):获取指定为位置字符,索引超出范围会报错
string.substring(int beginindex):获取子字符串,从输入索引到最后得子字符串
string.substring(int beginindex ,int endindex):同上,有设置结束索引得截取方式
string.startsWith(String prefix):判断字符是否串以什么开头
string.endsWith(String suffix):判断字符串是否以什么结尾
string.equals(String s):比较字符串是否相等
string.equalsIgnoreCase(String s):比较字符串是否相等,忽略大小写
string.compareTo(String s):比较字符串大小,用于字符串排序
string.contains(String s):判断是否包含
string.isEmpty():判断字符串是否为空,不是是否为null,而是""
string.toUpperCase():返回字符串大写表示
string.toLowerCase():返回字符串小写表示
string.split(String regex):字符串切割,返回字符串数组
string.replace(String old, String new):字符串替换,也可以用字符
string.trim():去除两边空格

Arrays中的方法(针对数组的操作,不是集合):

Arrays.fill(int[] a,int i)填充数组
Arrays.binarySearch():二分搜索,前提是数组必须有序

Scanner方法:

Scanner是一个简单的文本扫描器,可以对输入数据进行一些简单的格式化
Scanner不仅仅可以用System作为参数,字符串也可以
next()获取输入的字符串
nextLine()表示获取一行
nextInt()将输入转换成int获取,如果失败,抛出异常
hasNextInt()下一个是否是整数,是true,否false
同样的也有其它类型的方法,例如double、float、byte、short、long类型,还有BigDecimal和BigInteger
hasNext()是否有输入

StringBuffer类:

可变字符串
主要操作是 append 和 insert 方法,可接收任意类型数据
append():字符串拼接,返回拼接后的自身,可以实现链式编程
StringBuffer字符串的字符串缓冲区初始容量为 16 个字符
StringBuffer初始的总字符串容量为字符串长度 + 16
新建StringBuffer时可以设置缓冲区大小
如果容量被占慢,StringBuffer会申请一个是原来总容量两倍多一点的新空间,将内容复制到新空间,将引用地址修改为新空间,原来的空间就废弃了
delete(int start, int end):删除对应位置的字符串
capacity() :可以获取当前容量
为什么StringBuffer比String拼接快?
StringBuffer在创建的时候,会申请一块较大的空间,具体多大由存入的字符串决定,如果需要拼接字符串,只要把新的字符串复制到已经申请的空间里就可以了,而String申请只会申请字符串存储需要得空间,没有多余空间,拼接字符串需要申请空间,申请空间就需要时间。
StringBuffer创建时使用得字符串称为原序列,而后增加的序列为缓冲区序列,该类在缓冲区序列上同步

StringBuilder类:

方法和功能和StringBuffer几乎一样
StringBuilder性能略高于StringBuffer,但是线程不安全
StringBuffer虽性能不及StringBuilder,但是线程安全

BigDecimal类:

精度高的浮点类型数字,初始化时最好使用字符串形式的数字或者是使用valueOf方法
在Java里,float和double在小数点后几位都是不精确的,如果直接使用double类型转换,转换后的数值就会不精确(例如0.1),如果使用valueOf方法,会在数据类型的精度上进行调整,但最好还是使用字符串进行转换
BigDecimal由于是引用类型的数据,所以加减乘除的时候不可以直接使用 + - * /,必须要用方法取代,比如add(),返回值依然为BigDecimal:
add():加
multiply():乘
divide():除
subtract():减

Math类:

包含一些简单的数学运算方法,如初等指数、对数、平方根和三角函数。
abs():绝对值
round():四舍五入
squrt():平方根
pow(int x, int y):x的y次方
ceil():向上取整
floor():向下取整
max():从两个值里取最大值
min():从两个值里取最小值
random():成成随机数范围[0,1)

日期表示—Date,Calendar类:

Date被发现有一些缺陷,所以又有了Calendar类,可以看作升级版本
Calendar使用的是单例模式,Date不是
Date可以使用SimpleDateFormat格式化时间,使用参数:“yyyy-MM-dd HH:mm:ss”
Date可以调用方法查看年月日。
Calendar类种可以查看的信息比Date多
Calendar中定义了很多有用的字段,可以直接通过类来获取而不需要去转换
getTime()方法可以获得Date实例

各种基础数据类型包装类

int Integer
float Float
double Double
char Character
boolean Boolean

如果将基本类型赋值给对应的包装类,会自动装箱,反之拆箱
简单介绍下Integer,其他包装类的方法基本是一样的
parseInt():将字符串转换为int(10进制)类型
valueOf():将参数转换为Integer类型

如果存的数字很大,大到连long类型都存不下,可以使用BigInteger:
这个包放在 java.math.BigInteger底下
这个类的参数为字符串,且这个类没有整数范围。

集合类,集合类不能使用(因为都扩展了collection接口,所以每个集合类的方法都是差不多的):
集合类一般特点:
有序 :元素按照添加的顺序排序
重复:集合中的数据是可以重复的

Collection接口实现类(集合类):

list类型:
ArrayList:线程不安全,性能高
如果实例化时调用无参构造器,默认有10的容量
add():添加一个数据,如果没有使用范型则为Object类型,也可以在指定位置插入一个数据
addAll():可以传递一个集合对象,如果觉得一个一个传递慢的话
get():索取某个索引的值
remove():按照数据删除,或者是用索引删除,但如果数据是int型,则只能使用索引删除
removeAll():按照集合删除
contains():判断是否包含某个数据,参数不能是集合
toArray():将ArrayList转换为Object数组
iterator():获取集合的迭代器,可以使用集合器进行迭代,迭代过程不用临时索引
迭代器是一次性的,使用完后必须重新获得 ,迭代器是快速失败的
快速失败表示迭代器迭代时,集合如果改变,将会出现异常,ArrayList的迭代器的迭代器并不是拷贝数据迭代,而是直接观察集合内的值,所以观察使修改值会抛出异常(多线程),而安全失败则是拷贝

while(iterator.hasNext()) {
	System.out.println(iterator.next());
}

集合类还有Vector,使用起来和ArrayList差不多,Vector是线程安全的,性能比ArrayList低
集合类还有LinkedList,有addFirst()和addLast()方法,存储结构上和ArrayList不一样,ArrayList使用的是数组形式,而LinkedList使用的是链表,适合数据频繁插入删除
set类型:
集合类还有:HashSet,内部是无序的,就是遍历时不会按照添加顺序输出,且添加的数据时不会重复的,HashSet中实际上时维护一个HashMap。
HashSet中不能使用get()按照索引获得数据,因为数据无序,即使有方法也没有意义

与HashSet对应的,有一个TreeSet,也是无序且数据唯一
HashSet内部依靠Hash算法存储
TreeSet内部依靠树结构存储

Map接口实现类:

HashMap集合(提供键值对映射,使用Hash算法):
键的值不允许重复,重复值会覆盖
put():添加键值对
putAll():添加一个map集合
get():通过键获得值
keySet():获取map中的key集合
valueSet():获取map中的value集合
contains():判断是否包含某个键
containsValue():判断是否包含某个值

TreeMap和HashMap类似
HashTable和HashMap类型,HashTable为线程安全,但是效率低下
范型:
范型可以用在集合类型的数据里,比如:

ArrayList<String> arrayList = new ArrayList<String>();
Java中如何创建使用范型的类?

在类名后添加上< T >即可

public class My<T>{
	private T = (T[])new Object[10];
}
Java中的可变参数:
public static void add(String...arg)

在方法内可以把arg当成一个数组使用
可变参数可以是任意类型
可变参数的方法优先级比其他方法低,例如:
参数只有一个时,如果有两个方法,一个参数为单个String,一个参数为可变参数
虽然都可以匹配,但是一个参数的方法优先调用
如果有不止一个类型的参数,则可变参数最末尾匹配:
因为如果可变参数配置在前面,会引起程序混乱

public static void add(int i, String... arg)
JUnit基本测试:

JUnit注解:
@Test注解可以提醒编译器这是个测试方法,并赋予一些功能
该注解无法测试静态方法,或有参数的方法

Java中的File:
Java中File类的创建:
其中URL的地址可以是目录

File file = new File("d:test");

如果创建文件的话,要先将父目录取出判断是否创建,否则创建,再创建文件,否则Java会把文件名当成目录来创建
JUnit中常用的注解:

@Before //在test注解方法前调用
@After //在test注解方法后调用

使用这两个方法可以把一些不必要测试的准备和善后工作分开,注重于测试本身

File类中的方法:

isDirectory() :判断是否是一个目录(只有目录存在时才会判断正确)
isFile() :判断是否是一个文件
exists() :判断是否存在
canRead() :判断文件是否可读
canWrite() :判断文件是否可写
delete() :Java中为了防止误删,只有文件夹为空时,才可以删除文件夹,文件可以直接删除
renameTo(File dest) :修改文件或目录的名字
其实renameTo的操作可以看作时文件的移动,移动发生再同一个目录下,看起来就像是重命名一样,如果目录不一样,文件移动的效果就出来了,在移动的同时支持改名,用法和linux中的mv类似
getPath():获得文件的路径 + 名称(定义时的路径,如果定义文件时没有定义盘符,则默认在该项目目录下定义文件)
getAbsolutePath() :获得文件的绝对路径
getName():获取文件名
getParentFile():原理是对文件定义的字段进行切割
length():返回文件的长度(字节为单位)
lastModified():返回最后修改日期(毫秒)
list():列出子文件(字符串)
listFiles():以File对象的形式返回子文件

Java中的IO流:

对文件和目录操作
Java中的IO,I表示input,O表示output,所以IO流也叫做输入输出流

把文件重硬盘读取到内存里面-》读取-》读入-》输入-》input-》输入流
从内存里面吧数据保存到硬盘-》存储-》写入-》输出-》output-》输出流

数据类型:

文本数据
二进制数据

数据流:

字节流 可以读取任意类型数据
抽象类型:InputStream OutPutStream
字符流 只可以读取文本数据
抽象类型:Reader、Writer

流在使用完之后要关闭

FileInputStream:

read():按照字节读取
read(byte[] b):将数据读取到b数组里

FileOutputStream:

write():按照字节写入,参数为byte
write(byte[] b):将b数组的数据写入

缓冲区字节输出流
BufferedOutputStream:

比普通的输出流多了一个缓冲区(字节数组),使用缓冲字节输出流,可以不用频繁地对硬盘写入,集中在缓冲区里一起写入,可以提高效率。
缓冲区数据只有在满地时候和字节流关闭的时候会自动写入,或者手动调用flush,写入硬盘。
缓冲区字节输入流:

BufferedInputStream:

比普通的输入流对了一个缓冲区(字节数组),时用缓冲字节输出流,可以不用频繁的对硬盘读取,每次读取之前,缓冲中会自动读取一些数据到缓冲区中,读取时只要和缓冲区交互即可

转换流:
字符输出流
OutputStreamWriter:

将输出字节流转换为输出字符流,构造函数主要参数为字节流
在OutputStreamWriter中有一个缓冲区
OutputStreamWriter可以指定编码格式
字符输入流

InputStreamReader:

将输入字节流转换为输入字符流,构造函数主要参数为字节流
InputStreamReader也可以指定编码格式

所有的字符流都是带有缓冲区的
字符流其实是字节流的一个封装

FileReader和FileWriter的功能和上述两个类的功能一样,不同点是构造时会方便一点

字符缓冲区流:

虽然字符流自带有缓冲区但是不能够显示地设置缓冲区的大小,字符缓冲区流可以显式的设置缓冲区大小,别的功能一致

类结构:
 字节流
	InputStream
		FileInputStream
		BufferedInputStream(间接子类)包装类
	OutputStream
		FileOutputStream
		BufferedOutputStream(间接子类)包装类
字符流
	Reader
		InputStreamReader
			FileReader
		BufferedReader
	Writer
		OutputStreamWriter
			FileWriter
		BufferedWriter
发布了68 篇原创文章 · 获赞 12 · 访问量 5209

猜你喜欢

转载自blog.csdn.net/qq_40963076/article/details/104562509