黑马程序员_day17_基本数据类型包装类和集合框架collection和iterator

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

一、基本数据类型对象包装类

byte Byte

short    Short

int    Integer

long Long

float    Float

double    Double

char Character

boolean Boolean

对象包装类的好处:可以将基本数据和字符串之间进行互相转换。

 基本类型数据--->字符串。

1,基本数据类型对象包装类中的方法 static String  toString(基本类型);

2,String类中的方法 static String valueOf(基本类型); 

3,基本类型数据+"" 

重点要掌握的就是:

字符串--->基本类型数据。

Xxx  parseXxx(XxxString);//NumberFormatException

long parseLong(longString);

boolean parseBoolean(booleanstring);

System.out.println(Integer.parseInt("33")+1);//34

在八个基本类型对象包装类中只有一个对象没有parse方法。就是Character

Integer进制转换问题

十进制-->其他进制。

二进制:static String toBinaryString(int);

十六进制 static String  toHexString(int);

八进制 static String toOctalString(int);

十进制转成任意进制

System.out.println(Integer.toString(6,2));//6转成二进制。结果110

其他进制-->十进制。

int parseInt(intString,radix);radix进制的字符串

System.out.println(Integer.parseInt("110",2));是说110是二进制字符串。结果为6.不加2的话就默认是十进制字符串,结果110

基本数据类型值和基本类型数据对象之间的转换

基本数据类型值---->基本类型数据对象。两种方法:

1、使用构造函数。即可以接收基本数值,也可以接收基本数值的字符串形式。

2、可以使用基本类型对象中的方法。 static Integer  valueOf(int)

基本类型的对象--->基本数据类型数值。 int intValue();

Integer i = new Integer("34");        int num = i.intValue();

System.out.println(num+1);

Integer 知识点的练习

Integer x = new Integer(34);

Integer y = new Integer("34");

System.out.println(x==y);//false

System.out.println(x.equals(y));//true 因为Integer覆盖类Object中的equals方法,建立Integer自己的比较相同的方式,只要对象中的整数相等即为对象相同。

Integer a = new Integer(3);

Integer b = new Integer(5);

System.out.println(a.compareTo(b))//结果为-1.a<b

compareTo方法

对象想要进行比较,必须通过方法来完成,这个方法就是compareTo

而很多对象都可以进行比较。所以这个方法定义在Comparable接口中。想要对象具备比较功能,只要实现Comparable接口。

二、基本数据类型对象包装类jdk1.5后的新特性

Integer i = 5;//i = new Integer(5);自动装箱。自动完成了对象创建的动作。Integer.valueOf(5);

i  = i/*.intValue()*/ + 5;//=右边的i会先转成基本数据值(自动拆箱),然后再和5进行加法运算。 

//=右边运算完的结果,再次被自动装箱变成Integer对象赋给i

一旦简化就有弊端:多具备一个值null。记住要使用自动装箱拆箱时,建议进行null的健壮性判断。

Integer x = null;

x = x.intValue() + 4;这里会抛出空指针异常。

一个特殊点

Integer a = new Integer(127);

Integer b = new Integer(127);

System.out.println(a==b);//false

Integer m = 127;

Integer n = Integer.valueOf(127);

System.out.println(m==n);//true。这里把127改为128就会为false

这是因为在jdk1.5后的新特性自动装箱中,

如果数值在byte类型范围内。如果该对象数值重复出现,多个引用其实指向的同一个Integer对象,在常量池中被static final修饰。但是如果超出byte范围,都会生成新的Integer对象,即new 一个Integer对象。

自动装箱和拆箱的动作。

装箱:Integer.valueOf(int); Xxx.valueOf(xxx);

拆箱:intValue()           xxxValue():

三、必须懂的综合练习:

 "34 9 -7 12 67 25"要求对这个字符串中的数值进行从小到大的排序,

然后生成一个数值有序的字符串。

思路:

1,看到排序,就想到了数组

2,获取数组中的元素

3,先从字符串中获取到这些具体的数值。

4,发现这个字符串居然有规律。数值之间都是由空格隔开的。可以对字符串进行切割。

5,将获取的数据存储到数组中并排序,在将数组转成字符就可以了。

步骤:

1,将字符串切割成字符串数组。split

 2,定义一个int数组将字符串数组中的元素转成整数存储到int数组中。

3,对int数组排序。

4,将int数组排序后转成一个字符串。

String str = "34 9 -7 12 67 25";

str = sortStringNumber(str);

System.out.println(str);

public static String sortStringNumber(String str) {

//1,将字符串中的数值通过指定的规则进行切割获取字符串数组。

String[] str_nums = toStringArray(str);

//2,将字符串数组转成int数组。 

int[] nums = toIntArray(str_nums);

//3,对int数组排序;

sortIntArray(nums);

//4,将int数组变成字符串。 

return arrayToString(nums);

}

//将字符串转成字符串数组。 

private static String[] toStringArray(String str) {

return str.split(SPACE);

}

//将字符串数组转成int数组。 

private static int[] toIntArray(String[] str_nums) {

 1,先定义一个int数组。 

int[] arr = new int[str_nums.length];

 2,对字符串数组进行遍历。

for (int i = 0; i < str_nums.length; i++) {

 3将数组格式的字符串转成整数。存储到arr数组中。 

arr[i] = Integer.parseInt(str_nums[i]);

}

return arr;

}

int数组排序。 

private static void sortIntArray(int[] nums) {

Arrays.sort(nums);

}

int数组变成字符串。 

private static String arrayToString(int[] nums) {

    //1,创建字符串缓冲区。

   StringBuilder sb = new StringBuilder();

for (int i = 0; i < nums.length; i++) {

if(i!=nums.length-1)

sb.append(nums[i]+SPACE);

else

sb.append(nums[i]);

}

return sb.toString();

}

四、集合和数组的区别

集合:

1,用于存储对象的容器。

2,该容器的长度是可变的。

集合和数组的区别?

1,集合长度是可变的。

   数组长度是固定的。

 2,集合中只能存储对象。 

 数组中即可以存储对象,又可以存储基本类型数值。

3,集合中存储的对象可以是任意类型的。

数组中只能存储同一类型的对象

集合框架的由来:

容器很多,因为每个容器中的数据结构是不同的。

数据结构:就是数据在容器中存储方式

容器虽然因为结构有不同,但是都具备着共性,可以不断地向上抽取。

就形成集合框架,该框架的顶层之一就是Collection接口。

该接口中定义了集合框架中最共性的功能。

最终使用的时候,其实使用的该框架最子类的对象。

 五、必须熟练掌握Collection中的方法

1,添加方法。 

boolean add(object e):一次添加一个元素。

   boolean addAll(Collection):将一个参数容器中的元素添加到当前容器中。

 2,删除方法。

boolean remove(object):删除一个指定对象。 

boolean removeAll(Collection):删除指定collection中和本   Collection中相同的元素。 

void clear():直接将集合中的元素清空。

3,判断方法:

boolean contains(object):是否包含指定元素。

boolean containsAll(Collection):是否包含指定容器中的元素。 

boolean isEmpty():是否有元素。没有元素返回true

4,获取元素个数:

int size():获取元素有几个。

 5,取交集。

boolean retainAll(collection):保留和指定collection集合中相同的元素,不相同的元素会被删除。

 6,将集合转成数组。

Object[] toArray():

7,取出元素的方法:

Iterator iterator():

代码操作中特殊的一点:

c1中与c2中相同的元素保留,将不同的删除。

boolean b = c1.retainAll(c2);//只要c1集合中的元素发生变化,就为true。 不变化就为false

六、迭代器

迭代器:取出集合中元素的方式的一个对象。该对象本身就内置在容器中。

如何获取到集合的迭代器呢?

可以通过iterator()方法来完成。该方法返回一个Iterator类型对象。

//创建集合。 

Collection coll = new ArrayList();

//添加元素。

coll.add("abc1");

coll.add("abc2");

coll.add("abc3");

/获取该集合的迭代器对象。

Iterator it = coll.iterator();注意这里不需要创建Iterator接口的对象。因为通过iterator()方法返回了一个Iterator类型对象。

//使用迭代器对象中的方法完成元素的获取。 

while(it.hasNext()){

System.out.println(it.next());

}

//while改成for结构。开发的时候建议写for。循环完毕后迭代器对象自动释放。

for(Iterator it = coll.iterator(); it.hasNext(); ){

System.out.println(it.next());

}

迭代器接口出现:将每一个容器中的取出方式进行了封装。并对外暴露。

这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,都可以通过该接口取出这些容器中的元素。

它的出现,将容器的取出方式和容器的数据结构相分离,降低了耦合性。 

而取出方式因为直接在访问容器中的元素,并依赖具体的数据结构,所以被定义在了容器中。通过内部类来实现Iterator接口。每一种取出方式都是内部类

只要是Collection集合中的容器,迭代器是通用取出方式。 

七、集合一些小细节。

创建一个集合容器。其实也是一个对象。

这个对象中存储着特定结构,可以对对象进行存储。

Collection coll = new ArrayList();

1,存储时,add可以接收任意类型的对象因为参数类型是Object

所以对象元素存入时都被提升为了Object

2,其实在集合中真正存储都是对象的引用。

用迭代器取出时,其实取出的也是引用。

coll.add(5);//可以。jdk1.5后,有了自动装箱机制。等同于coll.add(Integer.valueOf(5));

集合中存储自定义对象的一些问题

一般开发时,最常见的就是往集合存储自定义对象。

1,对自定义对象进行描述。  

* 存储时,都被提升为了Object

* 取出时如果要使用自定义对象的特有方法,一定要进行向下转型。

注意事项:在迭代时,循环中只要有一个next()即可

Collection coll = new ArrayList();

coll.add(new Person("lisi1",21));//添加的时候都被提升为了Object

//取出元素。

Iterator it = coll.iterator();

while(it.hasNext()){

Person p = (Person)it.next();

System.out.println(p.getName()+":"+p.getAge());

     }

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值