黑马程序员——Java学习笔记之④——“JavaAPI”

来源:互联网 发布:qt designer 软件下载 编辑:程序博客网 时间:2024/05/16 10:56


----------- 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培训、期待与您交流! ------------




0 0
原创粉丝点击