(一)对象数组
(1) 存储对象的一个数组
Student[] student = new Student[5] ;
Arrays:针对数组操作的工具类 (提供了一些针对数组排序和二分搜索法)
public static String toString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...])
public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序
public static int binarySearch(int[] a,int key):二分搜索法: 在int类型的数组中查找key元素的索引
(2)注意:
在实际开发中,只要有引用类型,在对引用类型数据进行操作的时候,对引用类型的对象进行非空判断,防止空指针异常(NullPointerException)。
**(二) Calendar类**
(1)Calendar类:日历类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,
并为操作日历字段(例如获得下星期的日期)提供了一些方法
是一个抽象类,如何实例化?
public static Calendar getInstance() :通过一个静态功能来创建日历了对象
*ate类:(重点)
(2) alendar中的两个常用方法:
public abstract void add(int field,int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量 (这个方法常用)
public final void set(int year, int month,int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
(三)System类
System 类包含一些有用的类字段和方法。它不能被实例化。
常用的方法:
public static void gc()运行垃圾回收器。
public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码; 一般情况,需要终止
Jvm,那么参数0
public static long currentTimeMillis()返回以毫秒为单位的当前时间
public static void arraycopy(Object src,int srcPos, Object dest,int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
src:原数组
dest:目标数组
srcPos :从原数组的哪个位置开始
destPos:到目标数组的哪个位置结束
length:长度
(四)Date类
(1)java.util.Date:
类 Date 表示特定的瞬间,精确到毫秒
(2) 构造方法:
public Date()表示分配它的时间(精确到毫秒)。
public Date(long date):创建一个日期对象,指定毫秒值 (需要将long 时间毫秒值转换成Date对象)
public void setTime(long time):设置毫秒值
public long getTime()
将Date类型的数据转换为long的毫秒值
重点:Date的日期格式和日期的文本格式:String类型 之间进行转换
(3)Date类型与String类型转换
Date---->String(格式化)
String-->Date(解析)
中间的转换:使用中一个中间类:DateFormat,并且DateFormat是一个抽象类,抽象意味着不能实例化,所以应该考虑用它的子类:
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
SimpelDateFormat的构造方法:
public SimpleDateFormat(String pattern) :构造一个SimpleDateFormat对象,根据pattern(模式:规则)
SimpleDateFormat sdf = new SimpleDateFormat("xxx年xx月xx日") ;
日期和时间模式
年: yyyy
月: MM
日: dd
时: hh
分: mm
秒: ss
实际开发中:牵扯时间的东西,经常Date--String String--Date
(五)Math类
(1)Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
(2)常用的方法:
public static int abs(int a):绝对值
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
public static int max(int a,int b):求最大值
public static int min(int a,int b):求最小值
public static double pow(double a,double b):a的b次幂
public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0
public static int round(float a):四射五入
public static double sqrt(double a):一个数的正平方根
JDK5的特性:静态导入(导入方法的级别)
**(六)Random类**
(1) Random:是一个可以获取随机数的类
(2)构造方法
public Random():无参构造方法public Random(long seed) :指定long类型的数据进行构造随机数类对象
*public int nextInt():获取随机数,它的范围是在int类型范围之内
*public int nextInt(int n):获取随机数,它的范围是在[0,n)之间
(七)正则表达式
(1)正则表达式的语法:
字符
x ---------------------> x字符
\ --------------------- > 反斜线字符
\t --------------------->制表符
\n ---------------------> 换行符
\r ---------------------> 回车符
字符类:
[abc] ---------------------> a、b 或 c(简单类)
[^abc] ---------------------> 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] --------------------->a 到 z 或 A 到 Z,两头的字母包括在内(范围)
预定义字符类:
. ---------------------> 任何字符 如果本身就是. . qq.com 写正则表达式(\.)
\d --------------------->数字:[0-9] 写正则表达式 :\d
\w ---------------------> 单词字符:[a-zA-Z_0-9]:字母大小写,数字字符 \w
边界匹配器:
^ --------------------->行的开头
$ ---------------------> 行的结尾
\b --------------------->单词边界 尾 (helloword?haha:world)
Greedy 数量词(重点)
X? ---------------------> X,一次或一次也没有
X* ---------------------> X,零次或多次
X+ ---------------------> X,一次或多次
X{n} ---------------------> X字符恰好出现n次
X{n,} ---------------------> X字符至少出现n次
X{n,m} ---------------------> X字符至少出现n次,但不超过m次
例:
import java.util.Scanner;
自己校验:手机号码
定义规则:
136....
13689257284
13688886666
....
public class RegexDemo3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//接收数据
System.out.println("请输入一个手机号码:");
String phone = sc.nextLine() ;
//定义正则规则
String regex = "1[36]\\d{9}" ;
boolean flag = phone.matches(regex) ;
System.out.println(flag);
}
}
(2)方法:
public String[] split(String regex) :字符串的分割功能
按照指定的格式进行分割,分割后返回的是一个字符串数组
public String replaceAll(String regex,String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
(八)集合
(1)集合的由来?
学生的面向对象语言,面向对象语言对事物的描述是通过对象体现的,那么需求需要来存储多个对象.
要存储多个对象,不能使用基本类型的变量,需要使用容器类型的变量? 学习过哪些容器变量?
数组 ,字符串缓冲区(StringBuffer)
对于字符串缓冲区来说,在内存中始终存储的是字符串,不能满足要求;数组呢,数组的长度是固定的,不符合长度编号的要求,所有Java提供了一个
(2)Collection 集合;
集合:Collection:子接口有两个,两个子接口分别对应多个子实现类,多个集合数据结构不同,但是他们有共性内容,将共性内容
抽取出来,就可以集合继承体系图!
数据结构:数据的存储方式
Collection:
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口,更具体的实现类
(3) 基本功能:
添加功能:
boolean add(Object e)
删除功能:
void clear() :删除集合中所有元素(暴力删除)
boolean remove(Object o):删除集合中的指定元素
判断功能:
boolean contains(Object o):集合中是否包含指定的元素
获取功能:
int size() :获取集合中的元素数
转换功能:
Object[] toArray() :将集合转换成数组
(4)Colleciton的集合的高级功能:
boolean addAll(Collection c) :添加一个集合中的所有元素
boolean removeAll(Collection c):删除的高级功能(思考:删除一个算是删除还是删除所有算是删除?)
删除一个算删除
boolean containsAll(Collection c):包含所有元素算是包含,还是包含一个算是包含
boolean retainAll(Collection c) :交集功能: A集合对B集合取交集元素 :思考
boolean 表达的是什么意思,交集的元素是去A集合还是去B集合中
A集合对B集合取交集,交集的元素要去A集合中,boolean返回值表达的A集合的元素是否发生变化,如果发生变化,则返回true,否则,返回false
(5)迭代器
1) Iterator iterator() :集合的迭代器方法(获取集合的迭代器)
集合的专有遍历方式:迭代器遍历
2)Iterator :接口中有以下的方法:
boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false
Object next()返回迭代的下一个元素。
存储String类型的元素
3) 注意:
it.next(),只使用一次即可,使用多次,会出现问题(it.next(),每次使用的时候都是返回一个对象)
遍历的时候使用的while循环,可不可以使用for循环呢?
可以,不过很少用。
(6)List集合
1)interface extends Collection{
就可以使用Collection集合的功能
}
Collection有两个子接口:List Set
2)List
List集合的特有功能:
添加功能
void add(int index,Object element):在指定位置处添加指定元素
获取功能
Object get(int index)返回列表中指定位置的元素。
ListIterator listIterator():列表迭代器
删除功能:
Object remove(int index):删除指定位置处的元素
修改功能
Object set(int index, Object element):用指定element元素替换掉指定位置处的元素
3)方法
ListIterator listIterator():列表迭代器 (List集合的专有迭代遍历:列表迭代器)
ListIterator接口中:
boolean hasNext() :判断是否有下一个可以迭代的元素(正向遍历)
Object next():获取下一个元素
boolean hasPrevious():判断是否有上一个可以迭代 元素(逆向遍历)
Object previous():返回上一个元素
逆向迭代(遍历),单独使用没意义,前提,要先正向遍历
4)两种遍历方式
存储自定义对象并遍历,两种方式
方式1:Iterator iterator();
方式2:size()和get()方法相结合
5) ist集合有三个子实现类:
ArrayList
底层数据结构式数组结构,查询块,增删慢
从内存角度考虑:线程不安全的,不同步的,执行效率高
多线程:synchronized :同步的意思 解决线程安全问题
sychronized(锁对象){ 同步代码
共享数据;
}
解决线程安全问题,通过同步可以解决,但是效率低了...
LinkedList
:底层数据结构式链表结构,查询慢,增删块
从内存角度考虑:线程不安全,不同步,执行效率高
Vector:
这是一个线程安全的类,
底层数据结构是数组:查询快,增删慢
线程安全的,同步,执行效率低!
(7)例
需求:
我有一个集合,如下List,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现
假设:List集合 的元素:"hello","world","java"
@author Administrator
按照正常的思路:完成了需求,发现出现异常:
java.util.ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
产生的原因:按照正常的需求,给集合添加元素,遍历,遍历同时,判断集合中是否有需要的元素,有就添加新元素,
遍历的时候,使用迭代器遍历,但是添加元素,使用集合添加元素.
集合添加了一个新的元素,迭代器不知道...
使用迭代器遍历元素,不能使用集合添加元素!
解决方案:
方式1:要么使用迭代器遍历,使用迭代器添加元素!
方式2:要么使用集合遍历,使用集合添加元素!
并发
并行
*/
public class ListTest {
public static void main(String[] args) {
//创建一个集合对象
List list = new ArrayList() ;
//添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;
//方式1:使用迭代器遍历,迭代器添加元素解决并发修改异常
//Iterator接口没有添加功能呢
//ListIterator:列表迭代器中有add(object e):方法
/ListIterator it = list.listIterator() ;
while(it.hasNext()) {
String s = (String)it.next() ;
if("world".equals(s)) {
//迭代器添加
it.add("javaee"); //指定元素后面插入元素
}
}/
//方式2:使用集合遍历,使用集合添加元素(普通for循环)
for(int x =0 ;x < list.size() ; x ++) {
String s = (String)list.get(x) ;
//判断
if("world".equals(s)) {
list.add("javaee") ;
}
}
System.out.println("list:"+list);
/*int a = 10 ;
System.out.println(a/0);*/
}
}