创建一个字符串对象
String字符串
String是一个类,属于引用类型。在Java程序中一切使用""引起来的内容,都是这个类的实例,称为字符串对象。
注意:字符串定义后是一个常量,值不可更改。字符串实际是一个字符数组。
String srt="hello java";//这里是创建一个字符串,将地址保存到srt中
srt="123";//这里并不是srt的值改变了,而是srt又指向了新创建的"123"字符串地址,将其保存。
在创建字符串对象时可以直接使用""赋值创建,也可以通过构造方法来创建。
String str="hello你好";//使用""赋值创建
String str1=new String("ab");//通过构造方法来创建
注意:在使用字符串时,如果要比较其值是否相同,不要使用等号判断,因为等号判断的是内存地址。所以在比较字符串是否相同时,要使用String重写的equals方法进行判断。String中equals方法判断的原理,大致为:将两个字符串保存到字符数组中,再对每个字符逐一比较,如果全部一致则返回。在使用equals方法时,通常要将已知的非空字符串作为调用者。
重点:记住字符串常用的方法(下表为字符串重点记住的几个常用方法)。
方法名 | 返回值 | 作用 |
---|---|---|
length() | int | 获取字符串的长度 |
trim() | String | 去除字符串首尾的所有空格 |
getBytes() | byte[] | 按默认编码格式将字符串转换为字节数组 |
toCharArray() | char[] | 将字符串转换为字符数组 |
equals(String str) | boolean | 判断字符串是否相同 |
charAt(int index) | char | 获取index位置上的字符串 |
indexOf(String str) | int | 获取str第一次出现的位置,如果没有返回-1 |
contains(字符序列) | boolean | 判断指定的字符序列(字符串)是否存在于原字符串中 |
concat(String str) | String | 将str拼接到原字符串末尾 |
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 | 将一个参数转换为字符串,参数可以是原始类型,也可以是任意对象。 |
可变字符串
因为String字符串是不可变的,在需要改变较多时,非常不方便。在此价绍StringBuilder类和StringBuffer类。
StringBuilder类:用于表示可变字符串的一个类,是非线程安全的,建议在单线程环境下使用,效率略高于StringBuffer。
StringBuffer类:用于表示可变字符串的一个类,是线程安全的,建议在多线程环境下使用,效率略低于StringBuilder。
可变字符串与不可变字符串之间的转换
有些方法如indexOf()、charAt()等,在String和StringBuilder中都存在,可以不用转换。但有些方法如getBytes()、contains()等,只能通过String调用,这时就需要进行转换。
不可变字符串转换为可变字符串:通过创建一个可变字符串对象,将不可变字符串作为参数实现转换
可变字符串转换为不可变字符串:通过调用可变字符串的toString()方法实现转换
包装类
Java是纯面向对象语言,宗旨是将一切事物视为对象处理。但原始类型不属于对象,不满足面向对象的思想,但原始类型使用时无需创建对象,保存在栈中,效率更改。为了让原始类型也有对象的类类型,达到"万物皆对象"的思想,所以就有了包装类的概念。包装类就是原始类型对应的类类型。包装类通常用于将字符串转换为对应的原始类型。在web应用中,从浏览器中获取到后台的数据,全是String类型,一定要使用转换的方法。
特点
- 八个原始类型中,除了int和char之外,其余类型的包装类,都是将首字母改为大写。int为Integer,char为Character。
- 除了Character类之外,其余类都有至少两个构造方法:参数为原始类型或字符串的构造方法。Character的构造方法只有一个,参数为char变量。
- 除了Character类之外,其余类都有静态方法parse原始类型(String str),用于将字符串转换为相应的原始类型
- 数值型的包装类的parseXXX()方法,如果不是一个真正的对应类型的数,转换时会抛出NumberFormatException异常。如"123abc"、"123.456"都不能使用Integer.parseInt()转换
- Boolean类型中的parseBoolean()方法,参数如果是"true"这个单词,无论大小写,都能转换为真正的boolean值的true,只要不是"true"这个单词,转换结果都为false
- 除了Boolean类之外,其余类都有MAX_VALUE和MIN_VALUE这两个静态属性,用于获取对应原始类型支持的最大最小范围
- 所有包装类中都有一个**compareTo(参数1,参数2)**方法,用于比较两个参数
- 如果是数值型,参数1>参数2返回1,参数1<参数2返回-1,相同返回0
- 如果是Boolean型,两个参数相同返回0,不同时,如果参数1为true返回1,否则返回-1
- 如果是Character型,返回参数1-参数2的值。
- 所有包装类中都有toString()方法,用于将包装类对象转换为String字符串对象
装箱和拆箱
-
所有包装类都有一个静态方法valueOf(原始类型),将某个原始类型的数据转换为相应的包装类对象,这个过程称为装箱。
-
所有包装类都有一个原始类型Value()方法,用于将包装类对象转换为原始类型,这个过程称为拆箱
-
自动装箱拆箱。在jdk1.5之后,加入了自动装箱拆箱的特性,可以直接在原始类型和对应的包装类中互相赋值
-
自动装箱池
-
如果通过调用构造方法创建的包装类对象,属于不同地址,使用==比较的结果为false
-
自动装箱的形式,赋值范围在-128~127之间,将这个范围内的数保存到了"自动装箱池"中,所以两个包装类对象保存的数在这个范围内时,使用同一个地址
-
自动装箱的形式,赋值范围超出-128~127之间,自动创建新的包装类对象,所以是不同的地址
-
这个题目说明,引用类型之间比较,一定不要使用==,要使用重写的equals方法。
-
Date类
构造方法
常用构造方法 | 说明 |
---|---|
Date() | 创建当前瞬间的日期对象 |
Date(long l) | 创建指定毫秒数对应的日期对象。(从1970.1.1起经过了的毫秒数) |
Date(int year,int month,int date) | 该构造方法已过时。创建指定年月日的日期对象。(年从1900年起经过的年数,月用0-11表示1-12月) |
常用方法
常用方法 | |
---|---|
getTime() | 得到对应Date对象指定的毫秒数。 |
setTime(long l) | 设置毫秒数 |
after(Date when) | 判断调用日期对象是否在when之后 |
before(Date when) | 判断调用日期对象是否在when之前 |
异常
异常的产生:异常在程序中以对象的形式存在。当代码执行时出现异常,虚拟机会自动创建一个相应的异常对象,如果没有对该异常进行处理,就会导致程序中断。
异常的分类:异常在程序中以对象的形式存在,所以异常有对应的类。
自定义异常:可以自定义异常,在满足某种条件下,手动通过throw关键字抛出异常,人为中断程序。
自定义异常步骤:
-
定义一个类,继承某个异常类。
如果继承的是RuntimeException,表示自定义的异常类属于运行时异常,该异常对象可以不用处理。
如果继承的是非RuntimeException,表示自定义的异常类属于非运行时异常,该异常对象必须要处理。
-
[可选操作]定义一个无参数的构造方法,调用父类中无参的构造方法,定义一个带字符串参数的构造方法,调用父类带字符串参数的构造方法。
数组与集合
数组的特点
-
数组中保存的元素都是有序的,可以通过下标快速访问
-
数组中保存的数据都是同一种类型
-
数组的长度在定义后,无法改变
-
数组无法获取其中保存的实际元素数量
集合的特点
- 能保存一组数据,可以有序也可以无序
- 集合的容量可变
- 集合中可以保存不同类型的数据
- 可以获取集合中实际的元素数量
ArrayList实现类(重点)
- 采用数组实现的集合
- 可以通过索引访问元素、可以改变集合大小。如果要在其中插入或删除元素时,会影响其余元素。该集合查询效率高、增删中间元素效率低。
- 该集合对象中保存的元素,都是引用类型(对象的内存地址)。即使保存了123,其实不是保存的int类型的123,而是Integer类型的123.
构造方法
常用构造方法 | 说明 |
---|---|
ArrayList() | 创建一个无参的ArrayList对象。实际是创建了一个空的Object数组。在调用添加元素方法时,才会初始化该数组大小为10。 |
ArrayList(int capacity) | 创建一个指定容量的ArrayList对象,实际是创建一个指定大小的Object数组,如果参数为负,会抛出IllegalArgumentException异常 |
LinkedList实现类
-
采用双向链表实现的集合
-
集合中保存的每个元素也称为节点,除首尾节点外,每个节点即保存了自己的数据,也保存了其前一个和后一个节点的地址
-
如果在其中进行插入和删除的操作时,不影响其他元素的位置,只需要重新定义新节点的前后节点位置即可。
-
如果要查询某个节点的索引,需要从头结点或尾结点开始一步步得到目标节点位置
-
所以中间进行插入和删除的效率高,随机读取的效率低
ArrayList和LinkedList的区别
- 两者都是List接口的实现类,保存的元素有序可重复,允许保存null,拥有一些公共的方法,如size(),isEmpty(),subList(int from,int to)等
- ArrayList采用数组实现,对于随机读取效率更高,通常用于查询;LinkedList采用双向链表实现,插入删除不影响其他元素位置,通常用于中间插入删除。
File文件
Java中可以将本地硬盘中的文件(文件和目录)以对象的形式表示。就能通过Java代码对本地文件进行读取或操作。
构造方法
常用构造方法 | 说明 |
---|---|
File(String pathName) | 根据文件的完整路径创建对象 |
File(String parent,String name) | 根据文件所在的父目录路径和自身文件名创建对象 |
File(File parent,String name) | 根据文件所在父目录文件对象和自身文件夹创建对象 |
流
在Java中,流用于表示计算机硬盘与内存之间传输数据的通道。
将内存中的数据存入到硬盘中,称为写write,也称为输出
将硬盘中的数据存入到内存中,称为读read,也称为输入
流的分类
按方向分类
输入流:InputStream、Reader
作用:将硬盘中的数据读取到内存中
输出流:OutputStream、Wrtiter
作用:将内存中的数据写入到硬盘中
按类型分
字节流:InputStream、OutputStream
作用:适用于非文本类型,如图片、文件等的读写
字符流:Reader、Writer
作用:适用于文本类型,尤值txt格式文件的读写