----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
API就是java对外提供的应用程序接口
一、字符串(String):
字符串是一个特殊的对象,一旦初始化就不可以被改变。String被final修饰
String s1="abc";
String s2=new String("abc");
String s3="abc";
区别:s1在内存中有一个对象;s2在内存中有两个对象
s1==s2? --- false
s1.wquals(s2)? ----true
String类覆写了Object类中equals的方法,将此字符串与指定的对象比较。比较字符串是否相同
s1==s3? ----true
因为内存中已经有这样的字符串了,便不再开辟新的空间,直接指向abc了。(方法区中有静态区,也存有常量值,字符串就存在常量值中。)
1、获取
字符串长度:int length();注:数组的长度是属性,没有括号。字符串的长度有括号,是方法。
获取某位上的字符:char charAt(int index);
根据字符获取位置:int indexOf(String str)注:返回str在字符串中首次出现的位置,没有返回-1;
2、判断
字符串中是否包含某子串:boolean contains(CharSequence a);CharSequence是一个接口,String是其子类。
特殊之处:indexOf(str)可以索引str第一次出现的位置,所以也可以用于对指定字符串判断是否包含。而且,该方法既可以判断,又可以获取出现的位置。
字符串中是否有内容:boolean isEmpty();原理就是判断长度是否为0。注意:1.6版本JDK才开始(“”是一个对象,null是空)
字符串是否以指定内容开头或结尾:
boolean startsWith(String prefix); boolean endsWith(String suffix);boolean endsWith(String prefix,int index) //index为开始位置
判断两字符串内容是否相同:
boolean equals(str); boolean equalsIgnoreCase(str); 后面这个忽略大小写
3、转换
字符数组转成字符串:
String(char[] value);分配一个新的String,使其表示字符数组参数中当前包含的字符序列
String(char[] value,int offset,int count)分配一个新的String,包含取自字符数组参数一个子数组的字符 (部分转成字符串。offset为起始位,count为个数。)
将字符串转成字符数组:char[] toCharArray()将此字符串转换为一个新的字符数组
将字节数组转成字符串:String(byte[] value);String(byte[] value,int offset,int count);
将字符串装成字节数组: byte[] getBytes();
将基本数据类型转成字符串:String valueOf(int/double);注:3+"";和String.valueOf(3)一样;
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。(做编码操作要转换为字节数组才行)
4、替换
String replace(char oldChar,char newChar) ;//替换的字符不存在的话,返回原字符串
String replace(CharSequence target,CharSequence replacement)
//使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
eg:String s1=s.replace("java","world");
String replaceAll(String regex,String replacement)
//替换此字符串所有匹配给定的正则表达式的子字符串
5、切割
String[] split(regex); 将字符串以regex为分割点进行切割。例:
String s="zhangsan,lisi,wangwu";
String[] arr=s.split(",")
for(int x=0;x<arr.length;x++)
{
System.out.print(arr[x]+“ ”);
}
输出结果为zhangsan lisi wangwu
6、子串,获取字符串中的一部分
String substring(int beginIndex); //从指定位置开始到结尾
String substring(int beginIndex,int endIndex); //包含头,不包含尾。若角标不存在,则会出现角标越界异常
7、转换、去除空格、比较
将字符串转成大写或小写 String toUpperCase(); String toLowerCase();
将字符串两端多个空格去除 String trim(); //比如登录邮箱需要使用
对两个字符串进行自然顺序的比较 int compareTo(string);
小于返回负数,大于返回整数,等于返回0;非0时返回的是ASCII码相差的数字
二、StringBuffer
字符串的组成原理就是通过该类实现的。StringBuffer可以对字符串内容进行增删。StringBuffer是一个容器,很多方法与String相同。
缓冲区的三个特点:
1、StringBuffer是可变长度的
2、可以操作多个数据类型
3、最终会通过toString方法变成字符串。
存储:
StringBuffer append();将指定数据作为参数添加到已有数据结尾处
StringBuffer insert(index,数据);可以将数据插入到指定index位置
删除:
StringBuffer delete(start,end)包含start不包含end
StringBuffer deleteCharAt(index)删除指定位置字符
sb.delete(0,sb.length());清空缓冲区
获取:
char charAt(int index);获取指定位置的元素
int indexOf(String str);字符串str首次出现的位置
int lastIndexOf(String str);字符串str从后向前首次出现的位置
int length();获取长度
String substring(int start,int end);截取字符串,包含start位,不包含end位
修改:
StringBuffer replace(int start,int end,String str);从start到end(含头不含尾)替换成str字符串
void setCharAt(int index,char ch);index位置的字符换成ch
反转:StringBuffer reverse();
三、集合框架
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的
Collection有两个常见的接口:
List和Set
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同。这个存储方式称为:数据结构。
(1)ArrayList
ArrayList al=new ArrayList();
1、add方法的参数类型是Object,以便于接收任意类型对象。
2、集合中存储的都是对象的引用(地址)al1.retainAll(al2); //取交集
3、删除元素 :al.remove(“java02”);删除java02. al.clear(); 清空 al1.removeAll(al2); //去掉相同元素
4、判断元素 :al.contains("java03"); 是否存在java03 al.isEmpty(); 是否为空
(2)Iterator
什么是迭代器呢?
其实就是集合的取出元素的方式。
把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素。那么取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样,但都有共性内容判断和取出。则将这些共性抽取。这些内部类都符合一个规则,Iterator
如何获取集合的取出对象呢?
通过一个对外提供的方法
Iterator it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next()); //获取迭代器,用于取出集合中的元素
}
(3)HashSet
底层数据结构是哈希表,先判断哈希值(就是地址),若相同再判断对象,对象也相同返回false,对象不同地址顺延。
HashSet是如何保证元素唯一性的呢?
通过hashCode和equals来完成(ArrayList只依赖元素的值)
HashSet判断和删除的依据: contains();remove()
(4)TreeSet
Set:无序,不可以重复元素。
--HashSet:数据结构是哈希表。线程是非同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同。若相同,则会继续判断元素的equals方法,是否为true;
--TreeSet:可以对Set集合中的元素按自然顺序进行排序。
TreeSet:可以对Set集合中的元素进行排序。 底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0
reeSet排序的第一种方式:
让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或叫做默认顺序。
TreeSet排序的第二种排序方式:
当元素自身不具备比较性时,或具备的比较性不是所需要的,这时需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
(5)Map
Map<K,V>
K-此映射所维护的键的类型
V-映射值的类型
Map集合特点:该集合存储键值对,一对一对网里存,而且要保证键的唯一性。
Collection:单列集合
Map集合:双列集合
1、添加
put(K key,V value);键和值成对存放
putAll(Map<? extends K,? extends V> m);将集合m中的元素全部添加
2、删除
clear(); 清空
remove(Object key); 单独删除键为key的一对
3、判断
containsKey(); 判断是否包含某键
containsValue(); 判断是否包含某值
equals();判断是否相等
isEmpty();判断是否为空
4、获取
get(Objetc key);通过键获取对应的值
size();获取大小(和长度类似)
Values();将所有的值单独取出组成一个列表
entrySet();将成对的关系取出成为一个新的对象
KeySet();将所有键单独取出成为一个列表
创建方式:Map<String,String> map=new HashMap<String,Stirng>();
map.get("04");
可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。
(空值也算存在)
Collection<String> coll=map.values();
获取map集合中所有的值(返回的是集合,不按存储顺序输出)
map集合的两种取出方式:
a、keySet
将map中所有的键存入到Set集合,因为set具备迭代器,可以通过迭代方式取出所有键,再根据get方法,获取每一个键的对应值。
Map<String,String> map=new HashMap<String,String>;
map.put("","");
...
Set<String> keySet=map.keySet()
//Set<键的类型>
Iterator<String> it=keySet.iterator();
while(it.hasNext())
{
String key=it.next();
String value=map.get(key);
System.out.println("key:"+key+",value:"+value);
}
b、entrySet
Map集合的取出原理,将其转成Set集合,再通过迭代器取出。
Set<Map.Entry<k,v>>entrySet
将Map集合中的映射关系存入到了Set集合中。而这个关系的数据类型就是Map.Entry
将Map集合中的映射关系取出,存入到Set集合中:
Set<map.Entry<String,String>> entrySet=map.entrySet();
Iterator <map.Entry<String,String>>it=entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String> me=it.next();
String key=me.getKey();
String value=me.getValue();
System.out.println(...);
}
Map.Entry :其实Entry也是一个接口,它是Map接口中的一个内部接口。
interface Map
{
public static interface Entry
//内部接口,没有Map则没有关系,所以在Map内部。
{
public abstract Object getKey();
public abstract Object vetValue();
}
}
class HashMap implements Map
{
class Has implements Map.Entry
{
public Object getKey(){}
public Object vetValue(){}
}
}
(6)工具类
1、Collections
Collections:用于对集合进行操作的工具类,方法都是静态的
Collections.sort(List); 使List可以排序;
String max=Collections.max(list); 获取最大的元素
int index=Collections.binarySearch(list,"aaa");
返回正数则是角标位置,若负数,比如-2,则若有序插入的话,应放在下标为2的位置
Collections.fill(list,"pp");
fill方法可以将list集合中所有元素替换成指定元素。
Collections.reverse(list); 反转
Collections.reverseOrder();可以强制反转现有比较器
static void shuffle(List<?> list)
使用默认随机源对指定列表进行置换
2、Arrays
Arrays:用于操作数组的工具类,里面都是静态方法
Arrays.toString(arr);将数组转换成字符串;
Arrays.asList(arr);将数组变成list集合;
好处:可以使用集合中的思想和方法来操作数组中的元素
注意:将数组变成集合后,不能使用集合的增删方法,因为数组的长度是固定的。否则会发生不支持操作异常UnsupportedOperationException
int[] nums={2,4,5};
List<int[]> li=Arrays.asList(nums);
才能打印数组,否则打印哈希值
如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素;
如果数组中的元素都是基本数据类型,则会将该数组作为集合中的元素存在。
ArrayList<String> al=new ArrayList<String>(); 集合转成数组(为了限定对元素的操作,不需要进行增删了。)
四、其他
1、增强for循环
格式:for(数据类型 变量名:被遍历的集合(Collection)或数组)
for(String s:al)
{
s只能取出,不能修改。
System.out.println(s);
}
对集合进行遍历,只能获取元素,不能对集合进行操作。
迭代器除了遍历,还可以进行remove集合中元素的动作。
若是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作
传统for和高级for区别:
高级for有一个局限性,必须有被遍历的目标
建议在遍历数组的时候,还是希望使用传统for。因为传统for可以定义角标。
2、可变参数
public static void show(int... arr)
{
System.out.println(arr);
}
可变参数:其实就是数组参数的简写形式,不用每次都手动建立数组对象,只要将要操作的元素作为参数传递即可,隐式地将这些参数封装成了数组。
方法的可变参数,在使用时注意:
可变参数一定要定义在参数列表的最右边
3、静态导入
import static java.util.Arrays.*;
导入的是Arrays这个类中的所有静态成员,若方法不重名,可省去前面的Arrays.直接引用。
Arrays.toString();不能省略,与Object中的toString()重名。
类名重名,需要指定具体包名
方法重名,需要指定具备所属对象或者类
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
-