一、Java SE
1、继承时候属性和方法的访问规则.
1) 属性是静态绑定到变量类型的
Foo f = new Foo();
System.out.println(f.a);
class Foo{
int a;
}
2) 方法是动态绑定到对象的.
2. String 字符串
String 字符串 = char[] + 操作(toUpperCase(), concat())
类: 数据+相关的操作
char数组只是数据, 没有操作
一串字符就是字符串: char[] , String, StringBuilder
1 字符串"字面量(直接量)"都是String类型实例
"字符串常量"
public static final String TYPE = "car";
/ 常量 字面量/直接量
Stirng 内部就是一个char[].
2 String API 有一个实现原则: 对象内容永远不变
也就是说: String对象永远不变.
3 String 字面量(直接量), 如果相同, 会替换为同
一个String对象的引用, 常量连接的结果也被优化
为一个字符串.
String s = new String("abc");
4 String 的比较, equals, hashCode()
5 String API (字符串的常用方法)
这些方法如果返回String 一般是一个新String对象
toString() 除外.
字符串中的字符有序号, 从0开始.
API 方法:
charAt()
length()
trim()
indexOf()
lastIndexOf()
endsWith()
startsWith()
substring(int start, int end)
substring(int start)
String str = new String(new char[]{'1','2','3'});
char[] chs = str.toCharArray();
3 正则表达式: 负责的字符串匹配处理规则, 应用广泛.
学习建议: 1 要能够读懂"正则表达式"
2 能够写出简单的"正则表达式"
3 复杂的正则表达式 能够找到
可以应用于: java grep vi
1 字符集: [1234] 表示 1,2,3,4 之一
[^12] 表示除了 1,2
[1-5] 表示 1,2,3,4,5
[a-f] 表示 a-f 之间的
[0-9a-fA-F] 表示:一个16进制字符
0[xX][0-9a-fA-F]{1,8}
[\w]{8,15}
预定义字符集:
\d : [0-9]
. : 任意字符
\w: 单词字符 [0-9a-zA-Z_]
\s: 匹配空白: \t \n \r \b \p
2 {m,n} 数词
{n} :n个
{m,n}:从m到n个
{5,} :5个及5个以上
? : 0或1个
+ : 1个及一个以上
* : 0及0个以上
3 ^ 开头
$ 结尾
^\w,?\w$ xx x,x
^\w,{0,1}\w$ xx x,x
^\w,+\w$ x,x x,,x x,,,,x
^\w,*\w$ xx x,x x,,,x
邮政编码: ^[0-9][0-9][0-9][0-9][0-9][0-9]$
^[0-9]{6}$
^\d{6}$
用户名规则: ^\w{8,10}$
电话号: +86 13912345678
^(\+86|0086)?\s?\d{11}$
身份证号码: ^\d{15}(\d{2}[\dxX])?$
一个点的坐标: ^\d+(,\s*|\s+)\d+$ 67,67 67 67
^\d+[,\s]\s*\d+$
答案规则:^\s*[a-dA-D]?((\s+|,\s*)[a-dA-D]){0,3}\s*$
日期: 2011-01-30
^\d{4}-\d{2}-\d{2}$
^\d{4}(-\d{2}){2}$
IP 地址: 192.168.0.2
^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
^\d{1,3}(\.\d{1,3}){3}$
^(\d{1,3}\.){3}\d{1,3}$
String 对正则表达式的支持
.matches() 匹配正则表达式
.split("[,\s\|]") 切分字符串为字符串数组
.replaceAll()
Integer.parseInt() 转换到字符串到整数: 如: "23"-> 23
二、StringBuilder
1 StringBuilder 和 StringBuffer
String = char[] + 操作(不会改变char[] 内容)
StringBuilder=char[] + 对char[]操作(处理当前数组内容)
char[] String StringBuilder 都是字符串
差别:
a) char[] 只有字符数据, 没有计算方法(算法), 自己写算法
b) String 内部数据采用char[] 存储, 还带有计算方法(算法) ,算法不会改变char[] 内容, 经常利用复制操作生成新对象
c) StringBuilder 内部采用char[] 缓冲, 还带有计算方法, 这些方法的功能, 是通过改变char[] 缓冲内容来实现, 在修改的时候, 如果缓冲容量不够, 会自动扩容
简单的说: String 静态字符串, StringBuilder动态字符串
StringBuilder 内部的char[]数组内容可变, 如果长度不够, 利用变长算法维护, 自动扩容长度.
1) StringBuilder 是变长字符序列
2) StringBuilder 方法:append,insert ... 都返回当前 StringBuilder 对象本身的引用。
3) 如果软件需要大量字符串处理时候建议使用StringBuilder
"A" + "B"
4) String s = s1+s2; Java实际上才是如下代码运行:
String s=new StringBuilder(s1).append(s2).toString();
String s = s1+s2+s3+s4; 被优化为
String s = new StringBuilder(s1)
.append(s2).append(s3).append(s4).toString();
s+="a";//会产生至少两个新对象(StringBuilder, String)
StringBuilder buf=new StringBuilder();
buf.append("a");
buf.append("a");
5) StringBuffer 和 StringBuilder API几乎一样!
StringBuffer 是java早期提供的,速度稍慢,线程安全
StringBuilder 是Java5 以后提供的,速度快,非线程安全
char[] Stirng StringBuilder(1.5) ==? StringBuffer(1.0)
非线程安全 非同步 线程安全 同步
6) String 和 StringBuilder的相互转换
String -> StringBuilder
String str = "abc";
StringBuilder s = new StringBuilder(str);
String s1 = s.toString();
三、线性表(列表List)
(1)概念:
(Ⅰ)是位于内存的一种存储结构,用来存储对象;
(Ⅱ)特点:在逻辑上有先后次序,并通过下标来表明。
(2)有两种结构:
(Ⅰ)数组列表ArrayList
(Ⅱ)链表LinkedList
(3)线性表在内存中的存储结构(图片参考文档《线性表的内存结构.doc》)
(4)数组列表的随机访问原理(图片参考文档《数组元素的随机访问.doc》)
(5)数组列表的常用API(参考相应的程序案例)
(6)LinkedList和ArrayList的区别:
(Ⅰ)底层实现不同,ArrayList是数组列表,其特点是依次顺序排列;而LinkedList是双向链表;
(Ⅱ)在随机访问列表元素时,ArrayList性能优于LinkedList;但在插入和删除列表元素时,LinkedList性能优于ArrayList。因为ArrayList是数组结构,在插入和删除元素时,会造成其它元素的位移;而LinkedList只需要修改相应的链接,而不需要元素的位移。但由于LinkedList的元素散乱的位于内存中,因此不能根据下标快速寻址定位。
(Ⅲ)由于LinkedList和ArrayList都实现List接口,因此它们有一些相同的方法,比如add,remove,indexOf等方法,同时,LinkedList也拥有一些自己独特的方法,比如:public void addFirst(E e);
public E removeLast();
(7)案例《贪吃蛇》(参考文档《贪吃蛇文档1.docx》和《贪吃蛇文档2.txt》)
四、散列表(HashMap)【用于存储键值对】
(1)哈希Map的原理及特点(参考图片《HashMap原理.doc》)
(2)散列表概念:
1) 容量 散列表中散列数组大小
2) 散列运算 key->散列值(散列数组下标)的算法,如: "mm".hashCode()%10->8
3) 散列桶 散列值相同的元素的“线性集合”
4) 加载因子 是散列数组加载率, 一般小于75%性能比较理想
加载因子:(元素数量/散列数组大小), 如: 7/10=70%
5) 散列查找 根据Key计算散列值,根据散列值(下标)找到
6) 散列桶 在散列桶中顺序比较Key, 如果一样, 就返回value
散列表中Key不同, Value可以重复
五、集合框架
(一)集合框架(Collection 和Map)
集合框架包括集合与映射(Collection and Map), 以及它们的子类(容器类)
(1)Collection接口(定义了一些通用的方法,比如: add,clear,size,isEmpty等方法,还提供了创建迭代器iterator的方法)
①List接口
元素有先后次序的集合,元素有index位置,元素可以重复,继承自Collection接口,
实现类: ArrayList, Vector, LinkedList
②Set接口,是数学意义上的集合, 继承自Collection 接口
实现类: HashSet,外在表现是无重复列表,底层的实现是以元素的HashCode作为key的HashMap
(2)Map 描述了(key: value)成对放置的集合,key不重复,Value可以重复(key重复算一个),Map适合快速检索(查找);
实现类: HashMap(散列表算法实现)
TreeMap(二叉排序树实现,利用Key排序)
(二)迭代器对象,实际上是集合元素的指示器变量(也被称作游标)
(1)它的创建不是通过new操作符,而是通过接口方法;
(2)当它被创建时,指向第一个元素之前;
(3)当第一次执行it.next()后,游标指向第一个元素;
(4)配合while循环的模式化使用:
(三)集合的工具类(Collections)
Collections与Collection的区别:
(1)Collections是类,而Collection是接口;
(2)在Collections类中封装了许多处理Collection对象(主要是List对象)的方法,比如排序和查找方法。
(四)Comparable和Comparator
(1)Comparable接口,常用于默认比较规则,比如String类和Character类都实现了该接口。
实现这个接口表示:这个类的实例可以比较大小,可以进行自然排序
compareTo() :比较两单词的首字母ASKII编码的差值;返回正数表示大, 返回负数表示小, 返回0表示相等
例:int a = “sakua”compareTo(“tomoyo”);
等价于 int a=’s’-‘t’;
Comparable的实现必须与equals() 的结果一致,就是相等的对象时候, 比较结果一定是0!
(2)Comparator接口,常用于创用于创建比较器对象(临时定义的比较规则,而不是默认规则);
例:Collections.sort(new Comparator(){
Public int compare(String str1,String str2){
Return str1-str2;
//小或者0则按照升序排列,反之则按照降序排列
}
});
(五)匿名类(anonymous)的定义特点:
1.匿名类的定义形式为:在定义匿名类主体时,同时创建匿名类对象,即类的封装与对象的创建合二为一。
有两种情况:
(1) new 父类构造器{……}
(2) new 接口名称(){…… }
【理解匿名类定义形式】
- 由于匿名类没有名称,匿名类对象只能借助于父类的构造方法来声明自己的类型,或者把匿名类所实现的接口当作自己的父类,然后以调用父类无参构造器的形式来声明自己的类型)。
- 构造方法的后面紧跟一对大括号,是匿名类的主体定义。匿名类定义的详细内容包括数据成员和成员方法,它们都可以定义在大括号里面。
2.匿名类的使用特点:
(1)匿名类没有名称,常常借助于父类或接口来表明自己的对象类型。
(2)匿名类总是有父类的,因为任何class至少继承于Object。
(3)匿名类是内部类,常常用于成员方法或者是主方法中。
(4)匿名类对象常常作为GUI组件(JFrame、JTextField等)的侦听器对象。
(六)异常概念(Exception)
① 异常定义了程序执行中遇到的非致命的错误即意外情况,而不是编译时的语法错误。如:程序要打开一个不存在的文件;网络连接中断、数组下标越界、装载一个不存在的类等。
- 发生异常后,此前为程序分配的所有资源(比如文件流和数据库的开启)都将处在持续保留的状态,这将导致资源泄漏。
③ 分为被检查异常即checked异常和运行时异常即Runtime异常
(七)异常处理机制
(1)由五个关键字 try、catch、throw、throws 和 finally 处理;
(2)Java 中可用于处理异常的两种方式:
① 自行处理:可能引发异常的语句封入在 try 块内,而处理异常的相应语句则封入在 catch 块内;
② 回避异常:在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,应该由调用者处理;
六、Data日期对象
(一)创建日期对象:
(1)两种创建方式的比较;
1Calendar c=Calendar.getInstance();
c.setTime(new Date())
(2)通过日历对象获得日期对象的时间分量,直接通过日期对象获得时间分量的方法大部分已被废弃,不建议使用。
(二)日历的运算:
c.add();设置日期
c.get();取得日期
(三)数字格式
1.DecimalFormat df=new DecimalFormat(“00”);//显示连个位数的数字
2.SimpleDateFromat sdf=new SompleDateFroamt(“yyyy年MM月dd日 hh:mm:ss”);
(四)字符串解析
Double d=Double.parseDouble(str);
Double d=df.parse(str).doubleVlaue();//会有误差
(五)集合的复制(浅复制):
(1)同构复制
ArrayList ary=new ArrayList();
ArrayList ary2=new ArrayList(ary);
(2)异构复制
ArrayList ary=new ArrayList();
LinkedList ls=new LinkedList(ary);
(六)集合与数组的转换:
(1)数组对象转换为List;
LinkedList ls=new LinkedList(Arrays.asList(str));
(2)List对象转换为数组;
String[] ary=(String[])ls.toArray(new String[]{});
(七)File类
File类是对操作系统中文件系统的一种抽象,具体的文件和目录都是File类的具体对象。但File类只涉及到文件系统的定位和属性而不涉及到具体文件内容的读写。
(八)流
(1)涉及到文件内容的读写,需要用到流;
(2)流是对象,包含一组字节序列和读写方法。流是是对底层操作系统读写文件机制的封装。
(3)流的分类:
①方向:输入流和输出流
InputStream抽象类(input输入)
-FileInputStream
OutputStream抽象类(output输出)
-FileOutputStream
②处理单位:字节流、字符流、对象流;
Reader抽象类(读取、读者)