Java学习总结(二)

一、String字符串

字符串定义后是一个常量

//创建一个hello字符串对象,将其地址保存在str变量中
String str="hello";
str="abc";//这里实际是又创建了一个字符串对象abc,将其地址保存在str变量中
//str只引用最后赋值的字符串地址abc

//字符串实际是一个字符数组
String str2="abc";
char[] list = {'a','b','c'};
String str3= new String(list);
//这里str2和str3中保存的内容是一样的

如果要频繁更改字符串中的值,建议使用StringBuilder类或StringBuffer

创建一个字符串对象

1.使用""赋值创建

String str="hello你好";

2.通过构造方法创建

常用构造方法说明
String()创建一个空白字符串对象,实际创建一个空字符数组
String(String str)创建一个指定的字符串对象,实际是创建一个形参字符串的副本
String(char[] list)创建一个指定字符数组的字符串对象。
String(byte[] list)按默认编码格式创建一个指定字节数组的字符串对象。
String(byte[] list,String charsetName)按指定的编码格式创建一个指定字节数组的字符串对象。

字符串常用方法

方法名返回值作用
length()int获取字符串的长度
trim()String去除字符串首尾的所有空格
toLowerCase()String转换字符串为小写
toUpperCase()String转换字符串为大写
isEmpty()boolean判断是否为一个空字符串
getBytes()byte[]按默认编码格式将字符串转换为字节数组
toCharArray()char[]将字符串转换为字符数组
equalsIgnoreCase(String str)boolean忽略大小写比较指定字符串是否相同
equals(String str)boolean判断字符串是否相同
charAt(int index)char获取index位置上的字符串
indexOf(String str)int获取str第一次出现的位置,如果没有返回-1
lastIndexOf(String str)int获取str最后一次出现的位置,如果没有返回-1
contains(字符序列)boolean判断指定的字符序列(字符串)是否存在于原字符串中
concat(String str)String将str拼接到原字符串末尾
startsWith(String str)boolean判断是否以指定字符串开头
endsWith(String str)boolean判断是否以指定字符串结尾
substring(int index)String截取原字符串在[index,数组长度)区间内的字符。(从指定位置截取至末尾,包含指定位置)
substring(int from,int to)String截取原字符串在[from,to)区间内的字符。(从from截取至to,包含from不包含to)
split(String reg)String[]按指定字符串或正则表达式切分原字符串。如果指定内容不在末尾,n个指定字符能得到n+1个子串;如果指定内容在末尾,n个指定字符能得到n个子串(不包含末尾的无效字符)。
String.valueOf(参数)String将一个参数转换为字符串,参数可以是原始类型,也可以是任意对象。
replace(char oldChar,char newChar)String使用newChar替换oldChar

字符串注意事项

在比较字符串是否相同时,要使用String重写的equals方法进行判断。

String中equals方法判断的原理,大致为:将两个字符串保存到字符数组中,再对每个字符逐一比较,如果全部一致则返回。

在使用equals方法时,通常要将已知的非空字符串作为调用者。

二、可变字符串

在程序中,如果要频繁操作某个字符串,一定使用可变字符串类StringBuilderStringBuffer创建对象。

StringBuilder类

用于表示可变字符串的一个类,是非线程安全的,建议在单线程环境下使用,效率略高于StringBuffer。

StringBuffer类

用于表示可变字符串的一个类,是线程安全的,建议在多线程环境下使用,效率略低于StringBuilder。

StringBuilder和StringBuffer中的方法作用都一致,只不过StringBuffer中的方法使用了synchronized关键字修饰,表示一个同步方法,在多线程环境下不会出现问题。

所以这里以StringBuilder为例。

构造方法

常用构造方法作用
StringBuilder()创建一个大小为16的字符数组。类似于String str=“”;
StringBuilder(int capacity)创建一个指定大小的字符数组
StringBuilder(String str)创建一个str长度+16的字符串数组后,将str添加到其中。类似于String str=“初始值”;

普通方法

方法作用
append(Object obj)将指定内容添加到原可变字符串对象末尾
delete(int start,int end)删除[start,end)范围内的字符
deleteCharAt(int index)删除指定索引的字符
insert(int index,Object obj)将obj添加到index位置上
replace(int start,int end,String str)将[start,end)范围内的字符替换为str
reverse()翻转原字符串

注意

  • 以上方法都是在直接操作原字符串,每个方法调用后,原字符串都会发生变化。

  • StringBuilder或StringBuffer中并没有重写equlas方法,所以要比较两个可变字符串对象的值是否相同时,需要将可变字符串对象转换为String对象后,调用equals方法比较。

可变字符串与不可变字符串之间的转换

不可变字符串转换为可变字符串

通过创建一个可变字符串对象,将不可变字符串作为参数实现转换

//定义一个不可变字符串对象
String str="hello";
//创建一个可变字符串对象,将不可变字符串对象作为参数
StringBuilder sb = new StringBuilder(str);

可变字符串转换为不可变字符串

通过调用可变字符串的toString()方法实现转换

//创建一个可变字符串对象
StringBuilder sb = new StringBuilder("hello");
//调用toString()转换为String类型
String str=sb.toString();

三、System类

常用属性和方法作用
System.in获取系统输入流对象,通常用于获取输入信息
System.out获取系统打印输出流对象,通常用于打印普通信息
System.err获取系统打印输出流对象,通常用于打印异常信息
System.exit(int statues)终止虚拟机运行,0表示正常结束
System.getenv(String key)获取系统指定的环境变量信息
System.arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,原数组要赋值的元素数量)将原数组中指定长度的元素复制到新数组中
System.currentTimeMills()获取从1970.1.1 0:0:0(UTC)至今经过了多少毫秒。中国是UTC(+8)所以是从1970.1.1 8:0:0至今经过了多少毫秒,返回long类型

四、Runtime类

Runtime类的对象,用于表示程序运行时对象(程序运行环境对象)。

包含了程序运行环境相关的信息。常用于获取运行环境信息(如虚拟机内存)或执行某个命令。

特点

这个类不是一个抽象类,但不能创建对象,因为其构造方法是私有的。

但是它提供了一个静态方法getRuntime(),通过这个方法,可以获取一个Runtime类的对象。

五、包装类

**包装类就是原始类型对应的类类型。**包装类通常用于将字符串转换为对应的原始类型。

在web应用中,从浏览器中获取到后台的数据,全是String类型,一定要使用转换的方法。

包装类原始类型将字符串转换为原始类型
BytebyteByte.parseByte(String str)
ShortshortShort.parseShort(String str)
IntegerintInteger.parseInt(String str)
LonglongLong.parseLong(String str)
FloatfloatFloat.parseFloat(String str)
DoubledoubleDouble.parseDouble(String str)
BooleanbooleanBoolean.parseBoolean(String str)
Characterchar

装箱和拆箱

  • 所有包装类都有一个静态方法valueOf(原始类型),将某个原始类型的数据转换为相应的包装类对象,这个过程称为装箱

    //手动装箱
    int i=123;//定义一个原始类型的数据
    Integer aInteger=Integer.valueOf(i);//调用包装类的valueOf()方法将原始类型转换为包装类对象
    
  • 所有包装类都有一个原始类型Value()方法,用于将包装类对象转换为原始类型,这个过程称为拆箱

    //手动拆箱
    Integer aInteger=new Integer(123);//创建一个包装类对象
    int i = aInteger.intValue();//调用包装类的"原始类型Value()"方法将其转换为原始类型
    
  • 自动装箱拆箱。在jdk1.5之后,加入了自动装箱拆箱的特性,可以直接在原始类型和对应的包装类中互相赋值

    //自动装箱
    Integer aInteger=123;
    //自动拆箱
    int i=aInteger;
    

六、异常

异常的产生

异常在程序中以对象的形式存在。当代码执行时出现异常,虚拟机会自动创建一个相应的异常对象,如果没有对该异常进行处理,就会导致程序中断。

异常的分类

异常在程序中以对象的形式存在,所以异常有对应的类。

Throwable是异常类的根类,通常所说的异常,其实指的是Exception子类

1.Error错误

如果出现XXXXXError,如StackOverflowError栈空间溢出时,无法通过额外的代码去解决,只能修改源码。

2.Exception异常

如果出现XXXXException,如NullPointerException空指针异常时,可以通过额外代码去避免。

运行时异常和非运行时异常

如果一个异常属于RuntimeException异常类的子类,称为运行时异常,可以通过编译,运行时可能抛出异常对象。

如果一个异常属于Exception异常类的子类,称为非运行时异常,无法通过编译,只有处理后才能编译运行。

处理异常Exception

只要处理Exception异常类的子类时,都称为处理异常。处理异常的目的就是为了保证程序正常运行,不要中断。

方式一:try-catch-finally语句

这种方式能成功地处理异常,无论会不会抛出异常,都能让程序保证正常执行。

try{
    //可能出现异常的代码
}catch(异常类 异常对象){
    //如果出现异常对象,且与catch中的异常类匹配,则执行
}catch(异常类 异常对象){//后续的catch中的异常类型只能与之前的异常类型同级或是父类
    //如果出现异常对象,且与catch中的异常类匹配,则执行
}finally{
    //无论程序是否会抛出异常,一定要执行的代码
}

方式二:throws关键字

这种方式,可以让非运行时异常通过编译,定义方法的时候,声明可能抛出的异常。

用法:方法的参数小括号之后,添加"throws 异常类型1,异常类型2…"

public class Test{
    public void fun() throws InterruptException{//在定义方法时,声明可能抛出的异常类型
        //如果直接写这句话,会报错,因为sleep()方法会抛出一个非运行时异常,必须要处理
        Thread.sleep(5000);
    }
}

throw和throws

  • throws表示用于方法声明异常。使用时写在方法的小括号之后

    //用于声明方法的异常
    public void fun() throws Exception{
        
    }
    
  • throw用于手动抛出异常对象。使用时写在{}中,通常用于满足某种条件时,强制中断程序。

    public void fun(){
        //用于手动抛出一个异常对象
        RuntimeException e =  new RuntimeException();
        throw  e;
    }
    

自定义异常

可以自定义异常,在满足某种条件下,手动通过throw关键字抛出异常,人为中断程序。

步骤

  • 定义一个类,继承某个异常类。

    ​ 如果继承的是RuntimeException,表示自定义的异常类属于运行时异常,该异常对象可以不用处理。

    ​ 如果继承的是非RuntimeException,表示自定义的异常类属于非运行时异常,该异常对象必须要处理。

  • [可选操作]定义一个无参数的构造方法,调用父类中无参的构造方法,定义一个带字符串参数的构造方法,调用父类带字符串参数的构造方法。

七、集合

集合框架(集合家族)

Iterable接口并不算严格意义上的集合的"根",它称为迭代器,用于遍历集合元素的一个工具接口。

所以集合的根接口为:Collection接口Map接口位于java.util包中

Collection接口

核心的两个子接口:Set和List。

这两个接口都可以保存一组数据,Set接口保存数据时,是无序不重复的;List接口保存数据时,是有序可重复的。

List接口(有序可重复)

有序集合,元素可以重复,允许保存null,可以通过索引获取对应位置上的元素。

在接口中定义了一些操作元素的方法,如获取元素数量、添加、删除、替换、截取等。

ArrayList实现类

  • 采用数组实现的集合
  • 可以通过索引访问元素、可以改变集合大小。如果要在其中插入或删除元素时,会影响其余元素。该集合查询效率高、增删中间元素效率低。
构造方法
常用构造方法说明
ArrayList()创建一个无参的ArrayList对象。实际是创建了一个空的Object数组。在调用添加元素方法时,才会初始化该数组大小为10。
ArrayList(int capacity)创建一个指定容量的ArrayList对象,实际是创建一个指定大小的Object数组,如果参数为负,会抛出IllegalArgumentException异常

常用方法

常用方法作用返回值
add(Object obj)添加obj到集合的末尾boolean
add(int index,Object obj)添加obj到index索引上void
get(int index)得到指定index索引的元素Object
set(int index,Object obj)使用obj覆盖index索引的元素,返回被覆盖的元素Object
size()获取集合中的元素数量int
isEmpty()判断集合是否为空boolean
clear()清空集合void
remove(Object obj)删除指定obj对象boolean
remove(int index)删除指定Index索引的元素,返回被删除的元素Object
contains(Object obj)判断是否存在obj元素boolean
indexOf(Object obj)得到元素obj第一次出现的索引int
lastIndexOf(Object obj)得到元素obj最后一次出现的位置int
subList(int from,int to)得到[from,to)区间内的元素List
toArray()将集合转换为数组Object[]

LinkedList实现类

  • 采用双向链表实现的集
    -中间进行插入和删除的效率高,随机读取的效率低
构造方法
常用构造方法说明
LinkedList()创建一个空链表
常用方法

由于LinkedList实现了List接口,所有这里省略List接口中常用的方法,如add(Object obj)、Remove(Object obj)等。参考ArrayList中的方法

常用方法
addFirst()添加头结点
addLast()添加尾结点
getFirst()得到头结点
getLast()得到尾结点
remove()删除头结点
removeFirst()删除头结点
removeLast()删除尾结点
push(Object obj)添加头结点(入栈)
pop()得到并移除头结点(出栈)
peek()得到头结点
poll()删除头结点
offer(Object)添加尾结点

ArrayList和LinkedList的区别

  • 两者都是List接口的实现类,保存的元素有序可重复,允许保存null,拥有一些公共的方法,如size(),isEmpty(),subList(int from,int to)等
  • ArrayList采用数组实现,对于随机读取效率更高,通常用于查询;LinkedList采用双向链表实现,插入删除不影响其他元素位置,通常用于中间插入删除。

Set接口(无序不重复)

无序集合,元素不可以重复,允许保存null,没有索引。

在接口中定义了一些操作元素的方法,如获取元素数量、添加、删除、替换、截取等。

HashSet实现类

  • 采用哈希表实现
  • 元素不能重复,无序保存,允许保存null
  • 本质是一个HashMap对象,调用add()方法,实际调用的也是HashMap中的put()方法,参数作为put()方法的键,new Obejct()作为put()方法的值

构造方法

常用构造方法说明
HashSet()创建一个默认的集合对象,实际是创建了一个大小为16,加载因子为0.75的HashMap对象
HashSet(int capacity)创建一个指定容量的集合对象,实际是创建了一个指定大小,加载因子为0.75的HashMap对象
HashSet(int capacity,float loadFactor)创建一个指定容量和指定加载因子的集合对象。

常用方法

常用方法说明
add(Object obj)添加元素到集合中
size()得到元素数量
isEmpty()判断集合是否为空
remove(Object obj)根据对象删除元素
contains(Object obj)判断是否存在某个元素
toArray()将集合转换为Object数组
clear()清空集合

TreeSet实现类

构造方法

常用构造方法说明
TreeSet()实际会创建一个TreeMap对象

常用方法

常用方法作用
add(Object obj)添加元素到集合中
size()得到元素数量
isEmpty()判断集合是否为空
clear()清空集合
ceiling(Object obj)得到比指定元素大的最小元素
floor(Object obj)得到比指定元素小的最大元素
first()/last()得到第一个/最后一个元素

HashMap实现类

  • JDK1.8之后,HashMap的数据结构采用"数组+链表+红黑树"实现
  • 数据采用**"键值对"的形式保存,键称为key**,值称为value ,键不能重复,允许null,值没有限制,键和值都是引用类型

构造方法

常用构造方法说明
HashMap()创建一个空的集合对象,默认大小为16,加载因子为0.75

常用方法

常用方法作用
put(Object key,Object Value)添加一组键值对
get(Object key)根据键得到值
size()得到键值对的数量
clear()清空所有键值对
keyset()得到所有键的集合
values()得到所有值的集合
containtsKey(Object key)判断是否包含某个键
containsValue(Object value)判断是否包含某个值
remove(Object key)根据键删除键值对

遍历集合的方式

遍历List

方式一:普通for循环
List list= new ArrayList();
list.add("123");
list.add("123");
list.add("123");
list.add("123");
for(int i=0;i<list.size();i++){
    Object obj= list.get(i);
}
方式二:增强for循环
List list= new ArrayList();
list.add("123");
list.add("123");
list.add("123");
list.add("123");
for(Object o:list){
    Object obj= o;
}
方式三:迭代器
List list= new ArrayList();
//获取迭代器对象
Iterator it= list.iterator();
//hasNext判断是否还有下一个元素
while(it.hasNext()){
    //获取读到的元素
    Object obj=it.next();
}

遍历Set

方式一:增强for循环

Set list= new HashSet();
list.add("123");
list.add("qwe");
list.add("hello");
list.add(null);
for(Object o:list){
    Object obj= o;
}

方式二:迭代器

Set list= new HashSet();
//获取迭代器对象
Iterator it= list.iterator();
//hasNext判断是否还有下一个元素
while(it.hasNext()){
    //获取读到的元素
    Object obj=it.next();
}

泛型

一种规范,常用于限制集合中元素的类型,省去遍历元素时转型的过程。

//定义集合,默认不限制元素类型
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add(123);

//如果没有限制集合的类型,要通过循环做某个事情时,可能对于某些元素并不适用
for(int i=0;i<list.size();i++){
    //String有length属性,Integer没有,运行时就会抛出异常
    System.out.println(list.get(i).length);
}

用法

在定义集合时,在接收集合变量的数据类型后,写上<数据类型>。

集合类或接口<数据类型> 集合变量名 = new 集合实现类<>();

List<String> list = new ArrayList<>();
//这样只能在集合中保存String
//list.add(123);//不能通过编译
//如果要限制集合保存int类型的数据,不能写int,要写int的包装类Integer。因为集合中保存的都是引用类型。
//List<int> list2=new ArrayList();//无法通过编译
List<Integer> list2=new ArrayList();

Collections集合工具类

  • Collection是集合的根接口,定义了集合的方法
  • Collections是集合的工具,定义了很多静态方法,直接通过类名使用

常用方法

常用方法
Collections.shuffle(List list)打乱有序集合中的元素顺序
Collections.swap(List list,int i,int j)交换有序集合中i和j索引上的元素
Collections.replaceAll(List list,Object oldVal,Object newVal)将有序集合中的旧元素替换为新元素
Collections.fill(List list,Object obj)将有序集合使用obj填充
Collections.rotate(List list,int distance)将最后distance个元素放在最前
Collections.sort(List list)对有序集合中的元素进行排序,元素必须实现了Comparable接口
Collections.max(Collection list)得到有序集合中的最小元素,元素必须实现了Comparable接口
Collections.min(Collection list)得到有序集合中的最大元素,元素必须实现了Comparable接口

八、File文件

构造方法

常用构造方法说明
File(String pathName)根据文件的完整路径创建对象
File(String parent,String name)根据文件所在的父目录路径和自身文件名创建对象
File(File parent,String name)根据文件所在父目录文件对象和自身文件夹创建对象

常用方法

常用方法说明返回值
exists()判断文件是否存在boolean
isFile()判断是否为文件boolean
isDirectory()判断是否为目录boolean
getName()得到文件名String
getPath()得到文件所在相对路径String
getAbsolutePate()得到文件所在绝对路径String
getParent()得到父目录的名称String
getParentFile()得到父目录的对象File
lastModified()得到文件最后一次修改时间对应的毫秒数long
length()得到文件的所占字节大小long
isHidden()判断文件是否为隐藏boolean
list()得到目录下的第一层子文件名的字符串数组String[]
listFiles()得到目录下的第一层子文件的文件数组File[]
delete()删除某个文件或空目录boolean
mkdir()创建一个空目录boolean
renameTo(File newFile)将原文件命名为新文件(新文件可以指定新位置)boolean

九、流

在Java中,流用于表示计算机硬盘与内存之间传输数据的通道

流的分类

Java中将流定义成了类,以对象的形式保存。流有"四大家族",是所有流的父类。

InputStream字节输入流

FileInputStream文件字节输入流 ObjectInputStream对象字节输入流(反序列化)

OutputStream字节输出流

FileOutputStream文件字节输出流 ObjectOutputStream对象字节输出流(序列化)

Writer字符输出流

FileWriter文件字符输出流 **BufferedWriter缓冲字符输出流(包装流) ** OutputStreamWriter字节输出流转换为字符输出流(转换流)

Reader字符输入流

FileReader文件字符输入流 BuffedredReader缓冲字符输入流(包装流) InputStreamReader字节输入流转换为字符输入流(转换流)

FileInputStream文件字节输入流

按字节读取本地文件,本地文件必须存在

构造方法

常用构造方法说明
FileInputStream(String pathName)根据文件名创建文件字节输入流对象
FileInputStream(File file)根据文件对象创建文件字节输入流对象

常用方法

常用方法作用
read()读取一个字节。返回读取到的字节本身。
read(byte[] b)按字节数组读取。返回读取到的字节数量。读取到的内容保存在了字节数组中
close()关闭流对象

FileOutputStream文件字节输出流

按字节将数据写入到本地文件中,本地文件可以不存在

构造方法

常用构造方法说明
FileOutputStream(String pathName)根据文件名创建文件字节输出流对象,写入内容时覆盖原内容
FileOutputStream(String pathName,boolean append)根据文件名创建文件字节输出流对象,写入内容时追加在原内容之后
FileOutputStream(File file)根据文件对象创建文件字节输出流对象,写入内容时覆盖原内容
FileOutputStream(File file,boolean append)根据文件对象创建文件字节输出流对象,写入内容时追加在原内容之后

常用方法

常用方法作用
write(int i)写入一个字节
write(byte[] bytes)写入一个字节数组
write(byte[] bytes,int off,int len)写入字节数组中从off开始的len个字节
flush()将数据冲刷到本地文件中
close()关闭流对象

FileReader文件字符输入流

按字符读取文件。

构造方法

常用构造方法说明
FileReader(String fileName)根据文件名创建文件字符输入流对象
FileReader(File file)根据文件对象创建文件字符输入流对象

常用方法

常用方法作用
ready()判断是否还有下一个字符
read()读取下一个字符,返回读取到的字符
read(char[] chars)按字符数组读取字符,返回读取到的字符数量,读取到的字符保存在了字符数组中
close()关闭流对象

FileWriter文件字符输出流

按字符写入。

构造方法

常用构造方法说明
FileWriter(String fileName)按文件名创建字符输出流对象
FileWriter(String fileName,boolean append)按文件名创建字符输出流对象,允许追加写入
FileWriter(File file)按文件对象创建字符输出流对象
FileWriter(File file,boolean append)按文件对象创建字符输出流对象,允许追加写入

常用方法

常用方法作用
write(String str)按字符串写入
write(char[] c)按字符数组写入
write(String str,int off,int len)按字符串写入,从off开始写入len个字符
write(char[] c,int off,int len)按字符数组写入,从off开始写入len个字符
flush()冲刷流中的数据到硬盘中(必须调用该方法或close方法后,才能真正写入)
close()关闭流对象

BufferedReader字符缓冲输入流

构造方法

常用构造方法说明
BufferedReader(Reader reader)创建一个带有缓冲区(字符数组)的字符输入流对象,默认缓冲区大小为8192。参数注意是一个Reader类型的对象,但Reader是一个抽象类,所以要使用其子类,如FileReader,然后在FileReader中定义要读取的文件信息
BufferedReader(Reader reader,int size)创建一个指定缓冲区(字符数组)大小的字符输入流对象

常用方法

常用方法作用
ready()判断是否还有字符
readLine()读取整行字符
close()关闭流对象

BufferedWriter字符缓冲输出流

自带字符数组(缓冲区)的字符输出流。

构造方法

常用构造方法说明
BufferedWriter(Writer writer)创建一个带有缓冲区(字符数组)的字符输出流对象,参数为一个Writer对象,但Writer是一个抽象类,所以要使用其子类,如FileWriter对象,在FileWriter中定义要写入的文件
BufferedWriter(Writer writer,int size)创建一个指定缓冲区(字符数组)大小的字符输出流对象

常用方法

常用方法作用
write(String str)写入一个字符串
newLine()换行
flush()将输出流中的字符冲刷到文件中
close()关闭流对象

ObjectOutputStream对象字节输出流(序列化)

序列化:将对象转换为文件的过程

被序列化的对象,必须要实现Serializable接口

这个接口是一个特殊的接口,没有定义方法,只是给这个类打上标记,表示该类可以被序列化。

构造方法

常用构造方法说明
ObjectOutputStream(OutputStream os)创建一个对象字节输出流对象,参数为一个字节输出流对象,由于是抽象类,所以要使用其子类,如FileOutputStream对象,在其中定义要写入的文件。

常用方法

常用方法作用
writeObject(Object obj)将一个对象写入到本地文件中
close()关闭流对象

ObjectInputStream对象字节输入流(反序列化)

反序列化:将文件转换为对象的过程

构造方法

常用构造方法说明
ObjectInputStream(InputStream is)创建一个对象字节输入流对象,参数为一个字节输入流对象,由于是抽象类,所以要使用其子类,如FileInputStream对象,在其中定义要读取的文件

常用方法

常用方法作用
readObject()读取序列化后的文件,返回对象Object
close()关闭流对象

转换流

实际属于字符流,作用为将一个字节流对象转换为字符流对象

OutputStreamWriter

将字节输出流转换为字符输出流

InputStreamReader

将字节输入流转换为字符输入流

十、Java中的线程

Java中,线程以对象的形式存在。Thread表示线程类。

构造方法

常用构造方法说明
Thread()创建一个默认的线程对象
Thread(String name)创建一个指定线程名的线程对象
Thread(Runnable target)将一个Runnable对象包装为线程对象
Thread(Runnable target,String name)将一个Runnable对象包装为线程对象同时命名

常用方法

常用方法作用
setName(String str)设置线程名称
setPriority(int i)设置线程优先级(1~10),数字越大优先级越高,线程越先执行完
setDaemon(boolean f)是否将该线程设置为守护线程
getId()获取线程ID
getName()获取线程名,主线程名默认main,自定义线程名默认Thread-N
getPriority()获取线程优先级
getState()获取线程状态
isDaemon()判断该线程是否属于守护线程
start()启动线程
run()线程启动后执行的方法
Thread.currentThread()获取当前运行的线程对象
Thread.sleep(long m)设置当前线程休眠m毫秒
Thread.yield()线程让步,让其他线程执行

实现多线程

方式一:继承Thread类

  • 1.让某个类成为Thread类的子类
  • 2.重写Thread类中的run方法,将要让该线程执行的内容写在该方法中
  • 3.创建Thread类的对象后,调用start()方法,启动线程

方式二:实现Runnable接口(建议使用)

由于Java中是单继承,所以如果某个类已经使用了extends关键字去继承了另一个类,这时就不能再使用extends继承Thread类实现多线程,就需要使用实现Runnable接口的方法实现多线程。

  • 1.自定义一个类,实现Runnable接口
  • 2.重写run方法,将要多线程执行的内容写在该方法中
  • 3.创建Thread线程对象,将自定义的Runnable接口实现类作为构造方法的参数
  • 4.调用线程对象的start()方法启动线程

方式三:使用匿名内部类

如果不想创建一个Runnable接口的实现类,就可以使用匿名内部类充当Runnable接口的实现类

package com.hqyj.UnnameInnerClassThreadTest;
/*
* 使用匿名内部类
* 本质还是使用Thread(Runnable target)
* 并没有创建一个Runnable接口的实现类,而是直接用一个匿名内部类作为参数,包装成一个线程对象
* */
public class Test {
    public static void main(String[] args) {
        //newThread()小括号中的参数就是一个匿名内部类
        //创建线程对象,将匿名内部类包装成Thread对象后直接start()启动
        new Thread(new Runnable() {
            //多线程做的事情依然写在run方法中
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + i);
                }
            }
        }, "线程A").start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + i);
                }
            }
        }, "线程B").start();
    }
}

线程的生命周期

线程的初始化到终止的整个过程,称为线程的生命周期

新生状态

当线程对象被实例化后,就进入了新生状态。new Thread()

就绪状态

当某个线程对象调用了start()方法后,就进入了就绪状态。

在该状态下,线程对象不会做任何事情,只是在等待CPU调用。

运行状态

当某个线程对象得到运行的机会后,则进入运行状态,开始执行run()方法。

不会等待run()方法执行完毕,只要run()方法调用后,该线程就会再进入就绪状态。这时其他线程就有可能穿插其中。

阻塞状态

如果某个线程遇到了sleep()方法或wait()等方法时,就会进入阻塞状态。

sleep()方法会在一段时间后自动让线程重新就绪。

wait()方法只有在被调用notify()或notifyAll()方法唤醒后才能进入就绪状态。

终止状态

当某个线程的run()方法中所有内容都执行完,就会进入终止状态,意味着该线程的使命已经完成。

十一、该部分知识重点难点:

1.可变字符串:StringBuffer类的应用
2.集合:Arraylist、HashMap的应用
3.流:FileInputStream文件字节输入流、FileOutputStream文件字节输出流、BufferedReader字符缓冲输入流、ObjectOutputStream对象字节输出流(序列化)、ObjectInputStream对象字节输入流(反序列化)的应用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XMind是一款功能强大的思维导图软件,可以帮助开发者更好地组织和管理自己的学习进程。对于Java开发学习来说,XMind可以扮演着重要的角色。 首先,XMind可以用来制定学习计划。在学习Java开发的过程中,我们需要系统地学习各个方面的知识,包括语法、面向对象思想、数据结构等等。使用XMind,我们可以将这些知识点以树状结构组织起来,清晰地列出每个知识点的内容,规划好学习的先后顺序。这样一来,我们就可以明确自己需要学习的内容,并制定相应的学习计划。 其次,XMind还可以用来整理学习笔记。在学习过程中,我们难免会遇到各种各样的问题和知识点。使用XMind,我们可以将这些问题和知识点整理成思维导图,清晰地呈现出与学习相关的核心概念和关系。这样一来,我们可以更好地理解和掌握学习内容,并在需要的时候轻松地找到相关的知识点。 另外,XMind还可以用来复习和总结学习成果。随着学习的进行,我们掌握的知识点越来越多。使用XMind,我们可以将已经学习过的知识点整理成思维导图,复习和回顾学习过程中的重要内容。这样一来,我们可以巩固已经掌握的知识,并发现可能存在的问题和不足。 总之,XMind可以作为学习Java开发的有效工具,有助于规划学习进程、整理学习笔记、复习和总结学习成果。通过合理地使用XMind,我们可以更高效地学习Java开发,并在实践中不断提升自己的技能水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值