Android编程基础.docx_第1页
Android编程基础.docx_第2页
Android编程基础.docx_第3页
Android编程基础.docx_第4页
Android编程基础.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、Android编程基础Java核心API:1. Android中正则表达式使用举例 :在项目中我们总会遇到一些字符匹配的时候,最典型的就是验证用户输入的邮箱或者手机号是否符合格式规范。那我们在做这些匹配的时候,可以有两种方式。 1、 这是一种笨办法。就是自己根据项目的要求来写一个匹配的类,通过一个字符一个字符来匹配,从而得到自己想要的结果。 2、 还有一种就是使用正则表达式。这是普遍都回通用的方法。Android中使用正则,只要3句话: Pattern pattern = Ppile(reg),reg表示的是正则表达式 Matcher matcher = pattern.matcher(string),string表示的是需要匹配的字符 matcher.matcher(),这边就是直接返回一个boolean值,来表示正确与否 正则表达式用起来挺容易的,但是,正则表达式的书写很是头痛。基本的语法就不讲了,太琐碎了,网上相关的资源也比较多。还有就是正则表达式中的转义字符,我在2011年的12.28号那篇日记中写过了,也就不重复了。 这边就贴点平时常用的一些正则表达式 w-+(.w-+)*w-+(.w-+)+$/email地址 a-zA-z+:/(w+(-w+)*)(.(w+(-w+)*)*(?S*)?$/url (d2|d4)-(0(1-91)|(11|2)-(0-2(1-91)|(30|1)$/年-月-日 (0(1-91)|(11|2)/(0-2(1-91)|(30|1)/(d2|d4)$ /月/日/年 (w-.+)(0-91,3.0-91,3.0-91,3.)|(w-+.)+)(a-zA-Z2,4|0-91,3)(?)$ /Emil (+?0-92,4-0-93,4-)|(0-93,4-)?(0-97,8)(-0-9+)?$ /电话号码 (d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5)$ /IP地址 (s*)|(s*$) / 首尾空格 a-zA-Za-zA-Z0-9_4,15$ / 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线) 1-9*1-90-9*$ / 腾讯QQ号2. Android反射机制实现与原理举例:一、反射的概念及在Java中的类反射反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在计算机科学领域,反射是一类应用,它们能够自描述和自控制。这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了)。它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在执行的过程中,利用ReflectionAPIs取得任何已知名称的类的内部信息,包括:package、typeparameters、superclass、implementedinterfaces、innerclasses、outerclasses、fields、constructors、methods、modifiers等,并可以在执行的过程中,动态生成Instances、变更fields内容或唤起methods。好,了解这些,那我们就知道了,我们可以利用反射机制在Java程序中,动态的去调用一些protected甚至是private的方法或类,这样可以很大程度上满足我们的一些比较特殊需求。你当然会问,反射机制在Android平台下有何用处呢?我们在进行Android程序的开发时,为了方便调试程序,并快速定位程序的错误点,会从网上下载到对应版本的AndroidSDK的源码(这里给大家提供一个2.3.3版本的下载链接)。你会发现很多类或方法中经常加上了“hide”注释标记,它的作用是使这个方法或类在生成SDK时不可见,那么我们的程序可能无法编译通过,而且在最终发布的时候,就可能存在一些问题。那么,对于这个问题,第一种方法就是自己去掉Android源码中的hide标记,然后重新编译生成一个SDK。另一种方法就是使用Java反射机制了,可以利用这种反射机制访问存在访问权限的方法或修改其域。废话半天,该入正题了,在进入正题之前,先给上一个反射测试类的代码,该代码中定义了我们需要进行反射的类,该类并没有实际的用途,仅供做为测试类。提示:本文提供的代码,并不是Android平台下的代码,而是一个普通的Java程序,仅仅是对Java反射机制的Demo程序,所以大家不要放在Android下编译啊,否则出现问题,别追究我的责任啦!ReflectionTest.javapackage crazypebble.reflectiontest;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.Serializable;public class ReflectionTest extends Object implements ActionListener,Serializable / 成员变量 private int bInt; public Integer bInteger = new Integer(4); public String strB = crazypebble; private String strA; / 构造函数 public ReflectionTest() protected ReflectionTest(int id, String name) / 成员方法 public int abc(int id, String name) System.out.println(crazypebble - + id + - + name); return 0; protected static void edf() Override public void actionPerformed(ActionEvent e) / TODO Auto-generated method stub 二、反射机制中需要使用到的类我把需要使用的类列在下表中,其中对我们特别有用的类,通过着重标记显示出来,并将在后面的使用中逐步解释:3. JAVA-API 集合框架举例: 集合的特点:集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。因每个容器对数据的存储方式不同,所以分类出很多的容器。这个存储方式称为:数据结构。importjava.util.*;/注意使用前把包导入。举例:/使用Collection接口的子类ArrayList类创建一个集合容器。ArrayLista1=newArrayList();/添加元素a1.add(java01);/字符串也是对象a1.add(java02);a1.add(java03);a1.add(java04);/获取个数(集合长度)Syntem.out.println(a1.size();/打印集合Syntem.out.println(a1);/java01,java02,java03,java04/Collection接口的方法:add();添加元素1.add方法的参数类型是Object。以便于接收任意类型对象。2.集合中存储的都是对象的引用(内存地址)。addAll()将指定collection中的所有元素都添加到此collection中remove();删除指定元素removeAll()移除此collection中那些也包含在指定collection中的所有元素clear()清空集合contains()判断集合中是否包含指定的元素ContainsALL()如果此collection包含指定collection中的所有元素,则返回trueisEmpty()判断集合是否为空retainAll()取交集,仅保留调用此方法的collection中与指定collection的相同元素iterator()迭代器1.返回iterator接口子类对象,返回在此collection的元素上进行迭代的迭代器2.子类对象的相关方法hasNext()如果仍有元素可以迭代,则返回truenext()返回迭代的下一个元素remove()从迭代器指向的collection中移除迭代器返回的最后一个元素举例:Iteratorit=a1.iterator();/获取迭代器,用于取出集合中的元素while(it.hasNext()Syntem.out.println(it.next();把各自的取出方式定义在各自的集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类,而每一个容器的数据结构不同,所以取出的方式细节也不一样,但是都有共性内容:判断和取出,所以将共性抽取形成规则Iterator对外提供。集合内定义的这些内部类都符合这个规则,所以通过iterator()方法来取出集合内的元素(对象)。Collection下的一些常见子接口:1.List接口特点:元素是有序的,元素可以重复。因为此集合体系有索引。特有方法。凡是可以操作角标的方法都是该体系的方法。注意:List、子类等中的contains()/remove()等方法是在底层调用的equals()方法,所以如果自己定义的类对象存入集合中后进行集合操作用到这些方法时需要在自定义类中对equals方法重写形成自己的比较方法。增加:add(index,element);在列表的指定位置插入指定元素。addAll(index,Collection);添加指定collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。删除:remove(index);移除列表中指定位置的元素。修改:set(index,element);用指定元素替换列表中指定位置的元素。查找:get(index);返回列表中指定位置的元素。subList(from,to);返回fromIndex(包括)和toIndex(不包括)之间的部分。列表迭代器(List特有):listIterator();返回此列表元素的列表迭代器。listIterator(index);返回从指定位置开始列表中元素的列表迭代器。注:在操作时集合对象方法与迭代器不能同时操作元素,因为会发生异常,所以,在使用迭代器时只能使用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断、取出、删除的操作;如果想在迭代器时进行添加、修改等操作时就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。如:ArrayLista1=newArrayList();ListIteratorli=a1.listIterator();li.add().listIterator的一些方法:add();插入hasNext();判断next();返回列表中的下一个元素。nextIndex()返回对next的后续调用所返回元素的索引previous()返回列表中的前一个元素previousIndex()返回对previous的后续调用所返回元素的索引remove()删除:从列表中移除由next或previous返回的最后一个元素set()修改:用指定元素替换next或previous返回的最后一个元素List下常见的子类:ArrayList:底层的数据结构使用的是数组结构。特点:查找比较快,增删稍慢。线程不同步。LinkedList:底层的数据结构使用的是链表数据结构。特点:增删比较快,查找稍慢。线程不同步。LinkedList特有方法:addFirst()将指定元素插入此列表的开头。addLast()将指定元素添加到此列表的结尾。getFirst()返回此列表的第一个元素。getLast()返回此列表的最后一个元素。removeFirst()移除并返回此列表的第一个元素。removeLast()移除并返回此列表的最后一个元素。注意:以上方法如果集合中没有元素时会出现NoSuchElementException异常。所以在JDK1.6版本以后出现了以后新的方法。offerFirst()在此列表的开头插入指定的元素。返回类型booleanofferLast()在此列表末尾插入指定的元素。返回类型booleanpeekFirst()获取但不移除此列表的第一个元素;如果此列表为空,则返回null。peekLast()获取但不移除此列表的最后一个元素;如果此列表为空,则返回null。pollFirst()获取并移除此列表的第一个元素;如果此列表为空,则返回null。pollLast()获取并移除此列表的最后一个元素;如果此列表为空,则返回null。扩展:堆栈数据结构:先进后出;队列数据结构:先进先出;Vector:底层的数据结构使用的是数组结构。特点:查找增删都慢。线程同步。被ArrayList替代。2.Set接口特点:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。集合体系没有索引。Set集合的功能方法和Collection是一致的。Set接口常见的子类:1.HashSet类:底层数据结构是哈希表。HashSet元素唯一性的原因,是通过元素的两个方法hashCode和equals来完成,如果元素的HashCode值相同,才会通过equals方法判断是否为true;如果元素的HashCode值不同则不会调用equals方法进行判断。注意:对于元素的判断和删除等操作都是调用的hashCaode和equals方法,所以在自己定义对象类时通常需要重写hashCode和equals方法。2.TreeSet类:底层数据结构是二叉树,可以对集合中的元素进行排序。TreeSet元素唯一性和排序(为主)的原因,是通过compareTo()方法对元素进行比较,是TreeSet集合对元素排序的依据,此方法的返回值是正数,负数,零,这个方法是Comparable接口中的。注意:第一种排序方式:自定义类,然后向TreeSet集合中存入自定义类的对象时,需要在自定义类中实现(implements)Comparable接口并在类中重写compareTo()方法形成自己的比较方法,另外需要注意的是在重写compareTo方法(排序)当主要条件相同时,一定要判断一下次条件(否则会视为重复元素,不会存入集合中)。第二种排序方式:当元素(自定义类中的compareTo方法)自身不具备比较性时,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就具备比较方式,所以需定义比较器(定义类实现Comparator接口,在类中重写compare(Objecto1,Objecto2)方法描述比较代码)传递(比较器的对象)给TreeSet集合的构造函数。注:两种比较方式同时出现时,以比较器为先。3.泛型JDK1.5版本以后出现的新特性,用于解决安全问题是一个安全机制。格式:集合类变量=new集合类();例子:ArrayListal=newArrayList();好处1.将运行时期出现的问题ClassCastException,转移到了编译时期,方便于程序员解决问题。2.避免了强制转换的麻烦。泛型类:当类中要操作的引用数据类型不确定时需要定义泛型类。举例:classUtilsprivateQQq;publicvoidsetObject(QQq)this.q=q;publicQQgetObject()returnq;泛型同样也可以定义在接口上:interfaceInter.泛型方法:泛型类定义的泛型在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型都将会固定。为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。举例:classDemopublicvoidshow(Tt)/这个T只在此方法中有效System.out.println(show:+t);publicvoidprint(Tt)/这个T与上方法中的T无关,只在本方法中有效System.out.println(print:+t);publicstaticvoidout(Ww);/注意:静态方法是不能访问类上定义的泛型,所以静态方法只能在自己的方法上定义使用泛型。System.out.println(print:+w);泛型限定:?通配符,也可以理解为占位符。上限:(可以接收E类型或者E的子类型)下限:(可以接收E类型或者E的父类型)Map集合,接口:基本特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。共性方法:添加:put(Kkey,Vvalue)将指定的值与此映射中的指定键关联(可选操作)。注意:put方法添加时如果键相同那么后添加的值会覆盖原值,并返回原值。putAll(Mapm)从指定映射中将所有映射关系复制到此映射中(可选操作)。删除:clear()从此映射中移除所有映射关系remove(Objectkey)如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。判断:containsKey(Objectkey)如果此映射包含指定键的映射关系,则返回true。containsValue(Objectvalue)如果此映射将一个或多个键映射到指定值,则返回true。equals(Objecto)比较指定的对象与此映射是否相等。isEmpty()如果此映射未包含键-值映射关系,则返回true。获取:get(Objectkey)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null。hashCode()返回此映射的哈希码值。size()返回此映射中的键-值映射关系数。values()返回此映射中包含的值的Collection视图。SetMap.EntryentrySet()返回此映射中包含的映射关系的Set视图。entrySet方法是将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是Map.Entry;Map.Entry也是一个对象,用它的一些方法就可以取出关系中的键和值。Map.Entry的相关方法如下:getKey()返回与此项对应的键。getValue()返回与此项对应的值。hashCode()返回此映射项的哈希码值。setValue(Vvalue)用指定的值替换与此项对应的值。SetkeySet()返回此映射中包含的键的Set视图。keySet方法将Map集合中所有的键存入到set集合,因为set集合具备迭代器,所以可以迭代方式取出所有的键,在根据get方法获取每个键对应的值。Map下常见的类:1.Hashtable类底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。2.HashMap类底层是哈希表数据结构,可以存入null键null值。该集合是线程不同步的。3.TreeMap类底层是二叉树数据结构,线程不同步,可以给map集合中的键进行排序。工具类:Utilities1.Collections集合框架静态工具类,里面都是静态方法。2.Arrays用于操作数组的工具类,里面都是静态方法。注意:Arrays其中的asList()方法:将数组转成List集合。转成集合后不可以使用List集合的增加和删除方法,其它方法均可使用。另外:如果数组中的元素都是对象,用asList方法转成集合时数组中的元素就直接转成集合中的元素;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论