------- android培训、java培训、期待与您交流! ----------
String类:
字符串是一个特殊的对象
字符串一旦初始化就不可以被改变
String str = "abc";
String str1 = new String("abc");
有什么区别? //一个是在内存中有一个对象,一个是在内存中有两个对象,new是一个对象""又是一个对象。
String类部分方法:
1,获取。
1.1 字符串中的包含的字符数,也就是字符串的长度。
int length():获取长度。
1.2 根据位置获取位置上某个字符。
char charAt(int index):
1.3 根据字符获取该字符在字符串中位置。
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex) :从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf(int ch) :
2,判断。
2.1 字符串中是否包含某一个子串。
boolean contains(str):
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。
所以,也可以用于对指定判断是否包含。
if(str.indexOf("aa")!=-1)
而且该方法即可以判断,有可以获取出现的位置。
2.2 字符中是否有内容。
boolean isEmpty(): 原理就是判断长度是否为0.
2.3 字符串是否是以指定内容开头。
boolean startsWith(str);
2.4 字符串是否是以指定内容结尾。
boolean endsWith(str);
2.5 判断字符串内容是否相同。复写了Object类中的equals方法。
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3,转换。
3.1 将字符数组转成字符串。
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count)
static String valueOf(char[]):
3.2 将字符串转成字符数组。**
char[] toCharArray():
3.3 将字节数组转成字符串。
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转成字符串。
3.4 将字符串转成字节数组。
byte[] getBytes():
3.5 将基本数据类型转成字符串。
static String valueOf(int)
static String valueOf(double)
//3+"";//String.valueOf(3);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4,替换
String replace(oldchar,newchar);
5,切割
String[] split(regex);
6,子串。获取字符串中的一部分。
String substring(begin);
String substring(begin,end);
7,转换,去除空格,比较。
7.1 将字符串转成大写或则小写。
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去除。
String trim();
7.3 对两个字符串进行自然顺序的比较。
int compareTo(string);
练习:
子串在整串中出现的次数。
两个字符串的最大相同字串
对字符串中字符进行自然顺序排序。
StringBuffer:
字符串的组成原理就是通过该类实现的。
StringBuffer是一个容器。
StringBuffer可以对字符串内容进行增删。
很多方法与String相同
StringBuffer是可变长度的。
StringBuffer特有方法:
1,存储。
StringBuffer append():将指定数据作为参数添加到已有数据结尾处。
StringBuffer insert(index,数据):可以将数据插入到指定index位置。
2,删除。
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。
3,获取。
char charAt(int index)
int indexOf(String str)
int lastIndexOf(String str)
int length()
String substring(int start, int end)
4,修改。
StringBuffer replace(start,end,string);
void setCharAt(int index, char ch) ;
5,反转。
StringBuffer reverse();
6,
将缓冲区中指定数据存储到指定字符数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
JDK1.5 版本之后出现了StringBuilder.
StringBuffer是线程同步。
StringBuilder是线程不同步。
以后开发,建议使用StringBuilder
升级三个因素:
1,提高效率。
2,简化书写。
3,提高安全性。
基本数据类型对象包装类:
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
常用操作之一:用于基本数据类型与字符串之间的转换。
例:Integer的parseInt方法(静态方法,将字符串转换为int类型),intValue方法(非静态方法,将字符串转换为int类型)
基本数据类型对象包装类新特性:
JDK1.5以后,简化了定义方式。
Integer x = new Integer(4);可以直接写成:
Integer x = 4;//自动装箱
x = x + 5; //自动拆箱。通过intValue()方法。
需要注意:
在使用时,Integer x = null;上面的代码就会出现NullPointerException//空指针异常
集合类(集合框架):
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然可以存储对象,但长度是固定的,集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合框架的构成及分类:见图
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同。
这个存储方式称为:数据结构
数据结构:数据在内存中的一个构成情况,存储方式,就称为数据结构。每一个容器,因为数据结构的不同,所以进行了单独的划分,因为他们自身具备的特点不一样。
所以出现了这么多容器。,,,,这就是容器的出现以及体系结构。
集合框架中的常用接口:
Collection接口有两个子接口;
List(列表) Set(集)
List:可以放重复元素,元素存取是有序的。元素可以重复,因为该集合体系有索引。
Set:不可以存放重复元素,元素存取是无序的。(存入和取出的顺序不一定一致)
List接口中常用类:
Vector:线程安全,但速度慢,已被ArrayList替代。
ArrayList:线程不安全,查询速度快。
LinkedList:链表结构,增删速度快。
取出List集合中元素的方式:
get(int index):通过角标获取元素
iterater():通过迭代方法获取迭代器对象。
List集合类中特有的列表迭代器:ListIterator<E> listIterator();
迭代:
迭代是取出集合中元素的一种方式。
因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
用法:
for(Iterator iter = I.iterator();iter.hasNext(); )
{
System.out.println(iter.next());
}
Iterator iter = I.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
迭代器中内部类的设计:
容器内部定义了内部类:取出元素的方式,迭代器,定义的是Iterator的子类对象,通过iterator()方法获取到该子类对象。
子类对象中具体实现了Iterator接口中的方法,可以直接使用操作外部类中的成员,这就是内部类的定义。
容器是一类事物,容器内部还有一类事物,定义成内部类,而且这个内部事务是在直接访问容器中的成员,这就是内部类的设计。而且内部类还实现了一个接口。
Iterator接口,内部事务还对外提供了规则,我们只要面对规则就行了。
迭代注意事项:
迭代器在Collection接口中是通用的,它替代了Vector类中的Enumeration(枚举)
迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException
迭代器的next方法返回值类型是Object,所以要记得类型转换。
思考:为什么next方法的返回类型是Object的呢?因为不确定要存取的元素具体是什么类型的对象。
List集合类中特有的列表迭代器:
ListIterator<E> listIterator();
如果使用迭代器迭代集合中的数据,没有添加删除操作,也不能使用集合中的添加删除操作,会造成并发修改异常,因为在获取迭代器的时候,实际上集合已经把
集合中的引用赋值给了迭代器,所以他们操作的数据是同一个数据。(参见视频14天-05),要么用迭代器的方法,要么用集合的方法,只能使用其中一种。
但是Iterator迭代器中只有remove()删除方法,该方法删除的是元素的引用,元素还在内存当中。。如果别的地方还有引用(还被别的地方使用),那么就还在
内存中。。但是集合中却已经删除了,没有该引用了。
但是Iterator迭代器中只有删除方法,没有添加方法。(判断,取出,删除,只有这三个方法,添加动作做不了,有局限性)
列表迭代器是继承自迭代器的,因为列表迭代器中有角标,有指针,所以方法很多。(添加,判断,取出,删除,修改),这就是为什么要讲列表迭代器。
List集合特有的迭代器。
List接口中常用类:
这三个子类对象的出现是因为底层的数据结构不一样而出现的,单独封装成一个实体的,那么他们的底层到底都是什么样的数据结构呢?
简单说就是他们的底层到底是如何对这些数据进行存储的呢?
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
LinkedList:底层使用的是链表数据结构,增删速度很快,查询稍慢。
Vevtor:底层的数据结构使用的是数组结构。线程同步。被ArrayList替代了。
枚举:
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。
其实枚举和迭代是一样的。
因为枚举的名称以及方法的名称都过长。
所以被迭代器取代了。
枚举郁郁而终了。
之所以会将到是因为IO流中有一个对象,用到了枚举,因为IO流中的对象也是1.0出现的。那时候没有迭代,只有枚举,枚举是1.2版本以后出现的。
List集合判断元素是否相同,依据是元素的equals方法。
Set接口中常用的类:
HashSet:
线程不安全,存取速度快。
它是如何保证元素唯一性的呢?
TreeSet:
线程不安全,可以对Set集合中的元素进行排序。
它的排序是如何进行的呢?
Set集合元素唯一性的原因:
HashSe:
通过HashCode和equals方法方法来保证元素的唯一性。
TreeSet:
通过compareTo或者compare方法来保证元素的唯一性。元素是以二叉树形式存放的。
泛型:
JDK1.5以后出现的机制
泛型出现的原因
泛型出现的好处
泛型的书写格式
自定义泛型类
泛型的特点:
提高了程序的安全性
将运行时期的问题转移到了编译期
省去了类型强转的麻烦
泛型类的出现优化了程序设计
定义一个对象要做的事情越来越多了。
定义hashCode() equals() 实现Compareble接口让对象具备默认的比较性。。还有个toString,这里没写而已
既可以存入HashSet集合中,又可以存入TreeSet集合中。。。。。。
泛型限定:
? extends Person
只操作Person和Person的子类对象。 某一个类型继承Person,,都能操作。 向上限定,上限
? super E:可以接收E类型或者E类型的父类型。向下限定,下限。
例如:
TreeSet<E>:集合
TreeSet(Comparator<? super E> comparator) 集合中,可以接收一个比较器进行比较,
而比较器中既可以定义集合中E的对象比较,又可以定义E的父类型比较,需要注意的是,集合中定义的是E类型父类的比较的话,接收到的是子类的对象,所以只能
使用父类中的方法或成员。
泛型限定是用于泛型扩展用的。
Map集合:
Map与Collection不同
Map集合存储与取出元素的方式。
Map集合的特点
Map集合中常用类
Map与Collection:
Map与Collection在集合框架中属并列存在
Map存储的是键值对。
Map存储元素使用put方法,Collection使用add方法。
Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素。
Map集合中键要保证唯一性
Map集合常用类:
Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
HashMap:线程不安全,速度快,允许存放null键,null值。
TreeMap:对键进行排序,排序原理与TreeSet相同。
练习:
自定义一个可以同时存放三元素的Map集合
集合框架中的工具类:
Collections:
对集合进行查找。
取出集合中的最大值,最小值。
对List集合进行排序。
。。。。。。
Arrays:
将数组转成List集合。
对数组进行排序。
对数组进行二分查找。
为什么要将数组变集合呢?连增删操作都不可以用?有什么好处呢?
其实是:用集合的思想来操作数组,可以有很多方法,比如:contains,indexOf.......
新增for语句:
Collection在JDK1.5后出现的父接口
Iterable就是提供了这个for语句
格式:
for(数据类型 变量名:数组或Collection集合)
{
执行语句;
}
简化了对数组,集合的遍历。
函数的另一种表现形式:
返回值类型 函数名(参数类型... 形式参数)
{
执行语句;
}
其实接收的是一个数组,可以指定实际参数个数。
System类,描述的是系统的环境。系统环境在虚拟机启动的时候,会加载一些默认的系统属性信息,我们现在可以查阅一下到底虚拟机启动时都加载了什么信息呢?
getProperties();