------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
目录:一、常用对象 二、集合类
一、 常用对象
String
String类的特点:
字符串对象一旦被初始化就不会被改变。
String类的构造函数
构造函数:String(bytes[] bytes)
String类部分方法
1、 获取
获取字符串中字符的个数(长度)
int length();
根据位置获取字符
char charAt(int index);
根据字符获取在字符串中的位置
int indexOf(int ch);
indexO方法参数f类型为int是为了既可以支持字符,也可以支持字符在ASCII码中对应的数字。
从指定位置开始查找ch第一次出现的位置。
int indexOf(int ch,int fromIndex);
int indexOf(String str);
int indexOf(String str,int fromIndex);
根据字符串获取在字符串中第一次出现的位置。
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
P.S.
可以根据-1,来判断该字符或者字符串是否存在。
获取字符串中的一部分字符串,也叫子串。
String substring(int beginIndex,int endIndex);
String substring(int beginIndex);
2、转换
将字符串变成字符串数组(字符串的切割)
String[] split(String regex);涉及到正则表达式。
P.S.
点在正则表达式中是特殊符号,需要转义。
将字符串变成字符数组
char[] toCharArray();
将字符串变成字节数组
char[] getBytes();
将字符串中的字母转成大小写
String toUpperCase();大写
String toLowerCase();小写
将字符串中的内容进行替换
String replace(char oldCh,char newCh);
String replace(String s1,String s2);
P.S.
replace方法如果没有找到要替换的内容,则返回的还是原字符串。
去除字符串两端空格
String trim();
将字符串进行连接
String concat(String str);
P.S.
concat效果与"+"连接符效果一致,但是效果更高一些。
将其他类型数据转换成字符串
3、判断
两个字符串内容是否相同呢?
boolean equals(Object obj);
boolean equalsIgnoreCase(String str);忽略大小写比较字符串内容。
字符串中是否包含指定字符串
boolean contains(String str);
字符串是否以指定字符串开头,是否以指定字符串结尾
boolean startsWith(String str);
boolean endsWith(String str);
4、比较
int compareTo(Stringstr); 如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。
P.S.
"abc"和"aqz"两个字符串比较,'a'和'a'相等,'b' - 'q' = -15,'c'和'z'也就没有必要比较。
5、返回字符串对象的规范化表示形式
String intern();
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。
StringBuffer
StringBuffer:就是字符串缓冲区,用于存储数据的容器。
特点:
1. 长度是可变的。
2. 可以存储不同类型数据。
3. 最终要转成字符串进行使用。
P.S.
StringBuffer的字符串缓冲区初始容量为16个字符,其实质还是数组。
StringBuffer既然是一个容器对象,应该具备什么功能呢?
1、添加
StringBuffer append(data);
StringBuffer insert(index,data);
P.S.
insert方法也可以对字符串进行修改。
2、删除
StringBuffer delete(intstart,int end);包含头,不包含尾。
StringBuffer deleteCharAt(int index):删除指定位置的元素。
3、查找
char charAt(int index);
int indexO(String str);
int lastIndexOf(String str);
4、修改
StringBuffer replace(int start,int end,String str);
void setCharAt(int index,char ch);
5、其他方法
void setLength(intnewLength);设置字符序列的长度
public StringBufferreverse();将字符序列用其反转形式取代
P.S.
1、使用setLength设置StringBuffer中字符序列的长度。
如果小于已有字符序列的长度,相当于清除缓冲区中的一部分内容。
如果大于已有字符序列的长度,相当于扩充缓冲区,扩充部门内容用空格字符填充。
2、当创建的StringBuffer内容长度大于16,将会新创建一个新数组,长度比旧数组要长。然后把就数组的内容拷贝到新的数组,超出旧数组长度范围的内容将会放在新数组现在内容的后面,也可以通过StringBuffer(int capacity);构造函数自己设置StringBuffer缓冲区长度。
StringBuilder
jdk1.5以后出现了功能和StringBuffer一模一样的对象,就是StringBuilder。
不同的是:
StringBuffer是线程同步的,通常用于多线程。
StringBuilder是线程不同步的,通常用于单线程,它的出现能够提高程序效率。
故StringBuilder多用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。
P.S.
JDK一般升级目的:
1、简化书写。
2、提高效率。
3、增加安全性。
基本数据类型对象包装类
为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。
用于描述该对象的类就称为基本数据类型对象包装类。
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
该包装对象主要用于基本类型和字符串之间的转换
基本类型-->字符串
1. 基本类型数值+""
2. 用String类中的静态方法valueOf(基本类型数值);
字符串-->基本类型
1. 使用包装类中的静态方法xxxparseXxx("xxx");
int parseInt(String str);
long parseLong(String str);
boolean parseBoolean(String str);
只有Character没有parse方法。
2. 如果字符串被Integer进行对象的封装,可使用另一个非静态的方法,intValue。
将一个Integer对象转成基本数据类型值。
3. 用Integer的静态方法valueOf(String s);
整数具备不同的进制体现。
十进制-->其他进制方法:
String toBinaryString(int i);
String toOctalString(int i);
String toHexString(int i);
String toString(int i,int radix);
其他进制-->十进制方法:
int parseInt(String s,int radix);
二、 集合类
集合类的由来:
对象用于封装特有数据,对象多了需要存储;如果对象的个数不确定,就使用集合容器进行存储。
集合特点:
1. 用于存储对象的容器。
2. 集合的长度是可变的。
3. 集合中不可以存储基本数据类型值。
集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。
P.S.
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合框架的构成及分类:
Collection接口
框架的顶层Collection接口:
Collection的常见方法:
1、添加:
boolean add(Object obj);
boolean addAll(Collection coll);
2、删除:
boolean remove(Object obj);
boolean removeAll(Collection coll);
void clear();
3、判断:
boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty();判断集合中是否有元素。
4、获取:
int size();
Iterator iterator();
取出元素的方式:迭代器。
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同,所以该迭代器对象是在容器中进行内部实现的,也就是iterator方法在每个容器中的实现方式是不同的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
5、其他:
boolean retainAll(Collection coll);取交集
Object toArray();将集合转成数组
List、Set
Collection
|--List:有序(存入和取出的顺序一致),元素都有索引(角标),允许重复元素。
|--Set:元素不能重复,无序。
List:特有的常见方法。
有一个共性特点就是都可以操作角标。
1、添加
void add(index,element);
void addAll(index,collection);
2、删除
Object remove(index);
3、修改
Object set(index,element);
4、获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from,to);
List集合可以完成对元素的增删改查。
在迭代器过程中,不要使用集合操作元素,容易出现异常:java.util.ConcurrentModificationException。
可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。
Vector、ArrayList、LinkedList
List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢。
|--ArrayList:内部是数组数据结构,是不同步的,替代了Vector。替代了Vector,查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
LinkedList方法:
addFirst();
addLast();
jdk1.6版本后新方法:
offerFirst();与addFirst方法没有区别。
offerLast();与addLast方法没有区别。
---------------------------------------------------------
getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementException。
getLast();
jdk1.6版本后新方法:
peekFirst();//获取但不移除,如果链表为空,返回null。
peekLast();
--------------------------------------------------------
removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementException。
removeLast();
jdk1.6版本后新方法:
pollFirst();//获取并移除,如果链表为空,返回null;
pollLast();
请使用LinkedList来模拟一个堆栈或者队列数据结构。
堆栈:先进后出 First In LastOut FILO
队列:先进先出 First In First OutFIFO
我们应该描述这样一个容器,给使用者提供一个容器对象完成这两种结构中的一种。
Set:元素不可以重复,是无序。
Set接口中的方法和Collection一致。
|--HashSet:内部数据结构是哈希表,是不同步的。
|--TreeSet:可以对Set集合中的元素进行排序,是不同步的。
哈希表确定元素是否相同
1. 判断的是两个元素的哈希值是否相同。
如果相同,再判断两个对象的内容是否相同。
2. 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。
P.S.
如果哈希值不同,不需要判断equals。
往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素。
TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法。
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
P.S.
如果自定义类实现了Comparable接口,并且TreeSet的构造函数中也传入了比较器,那么将以比较器的比较规则为准。
TreeSet集合的底层是二叉树进行排序的。
Map、HashMap、TreeMap
Map:一次添加一对元素,Collection一次添加一个元素。
Map也称为双列集合,Collection集合称为单列集合。
其实Map集合中存储的就是键值对。
map集合中必须保证键的唯一性。
常用方法:
1、添加
value put(key,value):返回前一个和key关联的值,如果没有返回null。
2、删除
void clear():清空map集合。
value remove(Object key):根据指定的key删除这个键值对。
3、判断
boolean containsKey(key);
boolean containsValue(value);
boolean isEmpty();
4、获取
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回null,来判断是否包含指定键。
int size():获取键值对个数。
Map常用的子类:
|--Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap:内部结构式哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap:内部结构式二叉树,不是同步的。可以对Map结合中的键进行排序。
hashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。
Map、HashMap、TreeMap
使用LinkedHashMap则是跟原来存入的顺序是一致的。
Map在有映射关系时,可以优先考虑,在查表法中的应用较为多见。
Collections工具类
Collections:是集合框架的工具类,里面的方法都是静态的。
Arrays工具类
Arrays:集合框架的工具类,里面的方法都是静态的。
重点:List asList(数组)将数组转成集合。
好处:可以使用集合的方法操作数组。
P.S.
数组的长度是固定的,所以对于结合的增删方法是不可以使用的,否则,会发生UnsupportedOperationException。
数组转集合,用asList方法。
如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储。
集合转数组
使用的就是Collection接口中的toArray方法。
集合转成数组,可以对集合中的元素操作的方法进行限定,不允许对其进行增删。
toArray方法需要传入一个指定类型的数组。
长度该如何定义呢?
如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
所以建议,最后长度就指定为,集合的size。