----------- android培训、java培训、期待与您交流! ------------
Java API(Java Application Programming Interface):应用程序编程接口。
1、字符串最大的特点:一旦初始化就不可以被改变,当然这里说的是String对象,String类型的引用也可以指向其他String对象,只是String引用指向的上一个String对象还是会存在于对内存中,成为垃圾。String类适用于描述字符串事物,它就提供了多个方法对字符串进行操作。
2、String类提供的对字符串操作的常见方法:
①获取:
int length(); 获取字符串长度
char charAt(int index); 获取字符串某位置上的字符
int indexOf(int ch); 获取某字符ch在字符串中第一次出现的位置(形参为int型,是因为传入了要查找字符的ASCII码)
int lastIndexOf(int ch); 获取某字符ch在字符串中最后一次出现的位置
int indexOf(int ch, int fromIndex); 从指定位置fromIndex开始,获取某字符ch出现的位置
int indexOf(String str); 获取某子字符串str在字符串中第一次出现的位置(if(str.indexof("aa") != -1)它既可判断,又可获取出现位置。)
int indexOf(String str, int fromIndex); 从指定位置fromIndex开始,获取某子字符串str出现的位置
②判断
boolean contains(String str); 字符串中是否包含某一个字串str( indexOf(String str);:可以索引str第一次出现的位置,如果返回-1,则表示str不存在与字符串中。所以也可用于判断指定字符串是否包含。)
boolean isEmpty();(jdk1.6以上) 判断字符串是否为空,(判断字符串长度是否为0)
boolean startsWith(String str); 字符串是否以指定内容str开头
boolean endsWith(String str); 字符串是否以指定内容str结尾
boolean equals(String str); 判断字符串的内容是否相同(注意“==”用来判断两边的对象是否是同一个对象,即判断内存中地址是否相同)
boolean equalsIgnoreCase(String str); 判断内容是否相同,并忽略大小写
③转换
构造函数:String(char[]); 将字符数组转成字符串:(字符串在初始化的时候会默认转换为字符数组)
String(char[],offset,count); 将字符数组中的一部分转换为字符串(“包头不包尾”)
char[] toCharArray(); 将字符串转成字符数组
byte[] getBytes(); 将字符串转成字节数组
static String valueOf(char[]);……static String valueOf(int);……static String valueOf(double); 将基本数据类型转换为字符串(例:3+""; 相当于String.valueOf(3);)
注:字符串和字节数组在转换过程中,是可以指定编码表的。
④替换
String replace(oldchar,newchar); //如果要替换的older字符(或字符串)不存在,则返回原字符串
⑤切割
String split(regex);以regex为标记切割字符串为若干个字串 //regex可以是正则表达式,也可以是一个分割符,切割后,分割符会消失。
String subString(int beginIndex); 获取字符串中从指定位置到结尾的一部分(如果角标越界,则会发生异常)
String subString(int beginIndex, int endIndex); 获取字符串中指定位置之间的一部分
⑥转换,去除空格,比较
String toUpperCase(); 将字符串转成大写
String toLowerCase(); 将字符串转成小写
String trim(); 将字符串两端的多个空格去除(例:当用户注册时,可用其去除输入信息两边多余空格。)
int compareTo(String str); 对两个字符串进行自然顺序的比较
3、初始化字符串操作的两种情况:
String s2 = "abc"; s2在内存中有一个对象。
String s3 = new String("abc"); s3在内存中有两个对象。
4、字符串的比较:“==” 与 “equals”
“==” 判断对象在内存中的地址是否相同。
"equals"判断对象内容是否相同。
5、StringBuffer是字符缓冲区,是一个容器。它有以下特点:
①动态的,长度可变;
②可以操作多个数据类型;
③最终会通过toString()方法变成字符串。
6、StringBuffer的常见操作方法:增删改查:C(create)U(update)R(read)D(delete)
①存储
StringBuffer append(Object obj);将指定数据作为参数添加到缓冲区末尾。
StringBuffer insert(index,data):可以将数据插入到指定index位置。
②删除
StringBuffer delete(int start, int end):包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。
③获取
char charAt(int index):获取指定位置的一个元素
int indexOf(String str):获取从头开始,str第一次出现的位置
int lastIndexOf(String str):获取从尾开始,str第一次出现的位置
int length():获取长度
String substring(int start, int end):获取字串
④修改
replace(int start, int end, String str):将start到end-1位置上的字串替换为str。
void setCharAt(int index, char ch):将index索引位置上的字符替换为ch。
⑤反转
StringBuffer reverse():反转缓存区数据。
⑥转存
void getChars(int srcBegin, int srcEnd, char[] sdt, int dstBegin); //将StringBuffer sb中的索引srtBegin到(srcEnd-1)位置("包头不包尾")上的元素,存入到sdt[]数组中去,并从下标dstBegin开始存。
7、StringBuffer 与 StringBuilder
StringBuffer(在jdk1.5以后出现)是线程同步的。(应用于多线程)
StringBuilder是线程不同步的。(应用于单线程),一般推荐在单线程中应用StringBuilder,因为它效率比较高。
8、jdk升级的三个因素:提高效率,简化书写,调高安全性。
9、集合:
集合中add方法的参数类型是Object。以便接收任意类型对象。
集合中存储的都是对象的引用(地址)。
迭代器:是集合取出元素的方式。
10、集合的常见操作:
add(); 添加元素
size(); 返回集合的大小
remove(); 删除集合中某个元素
contains();判断集合中是否存在某个元素
clear(); 情况集合,即删除集合中所有的元素
a.retainAll(b);获取两个集合的交集,并将结果存储在集合a中。
a.removeAll(b);获取两个集合的差集,并将结果存储在集合a中。
a.addAll(b);获取两个集合的合集,并将结果存储在集合a中(重复的元素不再存储)。
11、运用迭代器依次取出集合中所有元素的两种方法:
方法1:
方法2:
12、Collection体系概览(常用集合汇总)
13、List集合常用方法:
①增:
add(index,element);
add(index,Collection);
②删:
remove(index);
③改:
set(index,element);
④查:
get(index);
subList(form,to); //获取一段内容
14、ArrayList集合的特有迭代器:ListIterator
如果使用Interator迭代器,在迭代时,只能用Interator迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出和删除的操作,可能会发生异常。如果想要其他操作,如添加、修改等,就需要使用其子接口:ListIterator.
ListIterator是Iterator的子接口。只有ListIterator才能实现迭代过程中的增删改查。该接口只能通过List集合的listIterator方法获取。
15、枚举是Vector特有的取出方式。其实枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。
16、LinkedList(相当于链表)的特有方法:(可用作模拟堆栈和队列原理)
addFirst(); 在链表头部加入元素(JDK1.6之后)----->offerFirst();用来替代addFirst();
addLast(); 在链表尾部加入元素 (JDK1.6之后)----->offerLast(); 用来替代addLast();
getFirst(); 得到链表头部的第一个元素(如果集合为空,则返回NoSuchElementException异常) (JDK1.6之后)----->peekFirst();(如果集合为空,返回null)
getLast(); 得到链表尾部的最后一个元素(如果集合为空,则返回NoSuchElementException异常) (JDK1.6之后)----->peekLast();(如果集合为空,返回null)
removeFirst(); 删除头部元素,并返回头部元素(如果集合为空,则返回NoSuchElementException异常) (JDK1.6之后)----->pollFirst();(如果集合为空,返回null)
removeLast(); 删除尾部元素,并返回尾部元素(如果集合为空,则返回NoSuchElementException异常) (JDK1.6之后)----->pollLast();(如果集合为空,返回null)
17、在HashSet集合中,存储元素顺序主要取决于实现的hashCode()方法,判断元素相同与否的条件主要取决于实现的equals(Object obj)方法(注意,复写equals方法的参数类型必须是Object),equals方法还有一个作用是,让将要存入HashSet集合中的一些元素具备比较性。
在将元素存储到HashSet集合的过程中,会首先按照指定的元素属性的hash值来确定存储位置,如果发现要存的一个对象和hashSet中的一个对象Hash值相同时,就调用equals来判断它们两是不是同一个对象。如果是同一个对象,则只存一个,如果不是同一个对象,则将两个对象都存在同一个Hash地址上,顺延存储。
18、TreeSet:可以对Set集合中的元素进行排序(按字母的ASCII顺序)。它底层的数据结构是二叉树。它保证元素唯一性的原理:根据compareTo方法的返回值确定比较对象的大小关系,从而进行排序。
19、TreeSet的两种元素比较方式:
方式1:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或默认顺序。
方式2:定义一个类,实现Comparator接口,覆盖compare方法。当元素自身不具备比较性时,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就具备比较方式。
注意:当两种比较方式都存在时,以比较器的比较方式为主。
20、泛型:Jdk1.5以后出现的新特性。用于解决安全问题,是一种安全机制。
使用泛型的好处:
①将运行时期出现的问题ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时期的问题减少,也就是说让程序变得安全了。
②避免了强制转换的麻烦。
泛型的使用通常在集合框架中很常见,只要见到<>就要定义泛型。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
21、为什么要使用泛型?
当类中要操作的引用数据类型不确定的时候,早期是通过定义Object来完成扩展的,现在定义泛型类完成扩展。
22、泛型的定义:
泛型格式:通过<>来定义要操作的引用数据类型。
泛型类定义的泛型,在整个类中有效,当泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让类中不同的方法可以操作不同的类型,而且类型还不确定,那么可以将泛型定义在方法上。(注意:泛型的定义要放在方法返回值的前边,修饰符的后边。不能放错位置。)另外,静态方法不可以访问类上定义的泛型。所以,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
23、泛型中的通配符:?
可以理解为占位符,一般用于泛型的限定:
? extends E: 可以接收E类型或者E的子类型,定义通配符上限。
? super E: 可以接收E类型或者E的父类型,定义通配符下限。
24、Map集合:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。它们的常用子集体系如下:
25、Map集合与Collection集合的关系:
Collection的子集Set集合底层就是使用了Map集合。
Map集合为双列集合(因为存储的是键值对),Collection集合是单列集合。
26、Map集合的常用操作方法:
①添加:
V put(K key, V value);// 添加元素。如果添加时,遇到相同的键,那么后添加的键所对应的值会覆盖以前的值,而且put方法会返回被覆盖了的值。
putAll(Map<? extends K, ? extends V> m); //从指定映射中将所有映射关系复制到此映射中
②删除:
clear(); //清空集合
remove(Object key); //删除某个键所对应的键值对
③判断:
containsValue(Object value); //判断集合中是否存在某个值
containsKey(Object key); //判断集合中是否存在某个键
isEmpty(); //判断集合是否为空
④读取:
get(Object key); //获取某个键所对应的值
int size(); //获取映射关系数
collection values();//获取此映射中所包含值的Collection视图
entrySet(); //获取此映射中包含的映射关系的Set视图
keySet() //获取此映射中包含的键的Set视图
27、Map集合中元素的两种取出方式:
方式1:keySet():将map中所有的键存入到set集合,因为set具备迭代器。然后根据迭代的方式,利用get方法,获取每一个键对应的值。
方式2:Set<Map.entry<k,v>>entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry。然后可以通过Map.Entry中的getKey方法获取键,用getValue方法获取键对应的值。
28、Collections:是专门操作集合的工具类,由很多静态方法组成。
Collections.sort(List, Comparator);//对集合进行排序,也可以自定义一个比较器,作为参数传给sort函数。
Collections.binarySearch(List, value);//在集合中二分查找值为value的元素的位置。(注意:要使用二分查找前,必须保证List集合中元素师有序的)
Collections.fill(List,Object obj);//将集合中所有元素替换为obj
Collections.replaceAll(List,Object obj1,Object obj2);//将集合中所有元素obj1替换为obj2
Collections.reverse(List);//将集合中所有元素反转
Collections.reverseOrder(Comparator);//强行将Comparator的正常比较顺序转换为逆向比较顺序
Collections.shuffle(List);//将list集合中的元素随机排列
29、Arrays:用于操作数组的工具类。里边都是静态方法。
CopyOf(char[] chs, int length)//复制指定的数组,并用0填充,是指具有与原数组相同的长度。
CopyOfRange(char[] chs, int from, int to)//复制一个数组,从索引from到索引to的部分(不包括 to)。
equals(char[] a, char[] b)//比较两个数组对应索引位置上的值,如果都相同,则返回true
fill(char[] chs,[int from, int to,] char c)//用指定的内容c,替换数组中(从索引from到索引to的)所有元素。
sort(char[] chs [,int from, int to])//将数组(从form到to区间)中的元素按升序排序。
toString(char[] chs)//返回数组chs的字符串形式。
asList://将数组变为List集合
30、把数组变成集合:使用asList() 方法
好处:可以用集合的思想和方法来操作数组中的元素。(注:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。如果进行了增删操作,则会发生UnsupportedOperationException. 不过像 contains() get() indexOf() subList()这些操作还是可以的)
如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转换成集合中的元素。
如果数组中的元素都是基本数据类型,那么就将该数组作为集合中的元素储存。(如果不想这样存储,可以将数组的元素类型封装为Integer对象类型即可)
31、toArray();方法详解:用来将集合转换为数组(toArray(T[] t):转为指定类型的数组,避免了强转。)
好处:为了限定对元素的操作。(不需要进行增删了)
指定类型的数组要定义的长度:创建一个刚刚好的数组最优。原因如下:
当指定类型的数组长度小于集合的size(),那么该方法内部就会创建一个新的数组,长度为集合的size()。
当指定类型的数组长度大于集合的size(),就不会新创建数组,而是用传递进来的数组。
32、高级For循环:
Arraylist取出元素的方法有两种:for循环、迭代器。
Set集合取出元素的方法只有一种:迭代器。
高级for循环的格式:
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
{ 要进行的操作 }
33、高级for循环与迭代器的关系:
高级for循环对集合进行遍历,只能获取元素,但不能对集合进行操作。与一般for循环相比,高级for循环必须有被遍历的目标,且不可以自定义遍历次数。
迭代器Itertator除了遍历,只能对集合中元素进行判断,取出和删除的操作。如果是用ListIterator,还可以在遍历过程中对集合进行增加和修改操作。
在遍历数组时,使用传统for,因为传统for可以定义角标,从而控制遍历次数。
34、可变参数是jdk1.5以后出现的新特性。其实就是数组参数的简写形式,这样不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可。底层实际上是隐式的将这些参数封装成了数组。注意:使用方法的可变参数新特性时,可变参数一定要定义在参数列表的最后。形式为:int... arr
35、静态导入:导入某个类中的所有静态成员。当类名重名时,要指定具体的包名。当方法重名时,要指定具备所属的对象或类。
----------- android培训、java培训、期待与您交流! ------------