JAVA知识点总结

一、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 = sakuacompareTo(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抽象类(读取、读者)

  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值