正文之前
今天又是迷醉的一天,嘿嘿,看小说到现在!!还是得看看书的,今天貌似到了容器,泛型这一节了。好好看会。
正文
第一点:Java内置容器
这是Java的内置的容器--序列列表。观察了一阵子之后大概的了解到,估计是定义了一种Object类型的数组,然后给了一些内置的方法可以调用,之后封装一波就是常用的容器了。当然那,肯定会有优化,但是内核应当如此!?
import java.util.ArrayList;
class Item_of_Array{
private int i;
Item_of_Array(int s){
this.i=s;
}
public void getI(){
System.out.println(i);
}
public String toString(){
// System.out.println("this.getClass().getSimpleName()");
return this.getClass().getSimpleName();
}
}
class Item_of_Other{
private String a;
Item_of_Other(String s){
this.a=s;
}
public void getI(){
System.out.println(a);
}
public String toString(){
// System.out.println("this.getClass().getSimpleName()");
return this.getClass().getSimpleName();
}
}
public class MainClass
{
@SuppressWarnings("unchecked")
public static void main(String args[]) throws Exception
{
ArrayList items=new ArrayList();
items.add(new Item_of_Array(10));
items.add(new Item_of_Other("Other"));
for(int i=0;i<items.size();++i){
// System.out.println(items.getClass().getSimpleName());
System.out.println(items.get(i).toString());
}
}
}
在使用的时候随便你传入的参数是啥,反正都是Object的子类,而我记得Object含有一个toString()的方法,所以如果重写一下的话,那么就有了共性了!!所以我的才不会报错~~ 6不?
The Result :
Item_of_Array
Item_of_Other
[Finished in 1.4s]
当然也是因为我用了这个,编译期间是不会报错的,但是如果没有toString的话,在运行期间还是会报错,完全是因为我重写了toString(),不然还是会报错的:
注: /Users/zhangzhaobo/program/java/MainClass.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
Item_of_Array
Item_of_Other
[Finished in 1.5s]
当然,根据我们C++的经验的话,ArrayList只是个模板,妥的,所以是可以传入参数类型从而限定我们add()的实参类型的,这样前面的代码其实就成了一个编译期的错误,会无法编译!!所以我们要稍稍变通,比如?多态!:
public class MainClass
{
@SuppressWarnings("unchecked")
public static void main(String args[]) throws Exception
{
ArrayList<Base> items=new ArrayList<Base>();
items.add(new Item_of_Array(10));
items.add(new Item_of_Other("Other"));
for(int i=0;i<items.size();++i){
// System.out.println(items.getClass().getSimpleName());
System.out.println(items.get(i).toString());
}
}
}
可以看到我限定的是Base类型,所以传入的实参必须是Base或者是其子类,这个时候我们只要这样,那样就👌OK了!!
ava.util.ArrayList;
class Base{
}
class Item_of_Array extends Base{
private int i;
Item_of_Array(int s){
this.i=s;
}
public void getI(){
System.out.println(i);
}
public String toString(){
// System.out.println("this.getClass().getSimpleName()");
return this.getClass().getSimpleName();
}
}
class Item_of_Other extends Base{
private String a;
Item_of_Other(String s){
this.a=s;
}
public void getI(){
System.out.println(a);
}
public String toString(){
// System.out.println("this.getClass().getSimpleName()");
return this.getClass().getSimpleName();
}
}
不费吹灰之力啊!!
第二点:Collection和Map:
请注意,Collection是个接口,需要填充类型,也就是泛型的含义所在了
第三点:迭代器:
不是吧?Java的迭代器居然只能单向移动??这不是在C++中单向链表的限制吗?这样的话,它的优越性呢?好吧,我承认它用起来好像确实挺方便。而且很安全。但是感觉还是少了那么点味道啊?
注意了注意了!!千万不要!千万不要把java文件命名为Iterator,不然你的代码写的再对都不行啊。系统默认的迭代器类就叫这个名字,你这等于重写,不是使用了。报错如下:
HustWolf:java zhangzhaobo$ javac Iterat.java
Iterat.java:19: 错误: 类型Iterator不带有参数
for(Iterator<String> it=list.iterator();it.hasNext();)
^
1 个错误
后来改了才回过头来对了。
import java.util.*;
class Item{
Item(int s){
this.i=s;
}
int i;
public int get(){
return i;
}
}
public class Iterat{
public static void main(String[] args)
{
ArrayList<Item> list=new ArrayList<Item>();
for(int i=0;i<10;++i)
list.add(new Item(i));
Iterator<Item> it=list.iterator();
while(it.hasNext()){
Item s=it.next();
System.out.println(s.get()+" haha");
}
}
}
The Result:
0 haha
1 haha
2 haha
3 haha
4 haha
5 haha
6 haha
7 haha
8 haha
9 haha
[Finished in 1.7s]
在网上意外找到一段迭代器的实现代码,借鉴下,很棒的!!
深入理解Java中的迭代器 - Mr·Dragon - 博客园
第四点:Set这个好东西,跟C++的差不多了
set这个好东西啊,跟C++有点差别,但是还是大同小异的!! 代码先走:
import java.util.*;
public class TestSet{
public static void main(String[] args) {
Random rand=new Random(47);
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<10;++i){
set.add(rand.nextInt(100));
}
System.out.println(set);
}
}
The Result:
[0, 68, 22, 55, 7, 58, 93, 61, 29]
[Finished in 1.4s]
第五点: 神器Map:
废话真的没啥用,直接代码多爽快?
import java.util.*;
public class TestMap{
public static String ShowLength(int i){
String X=new String();
X+='[';
for(int s=0;s<i;++s){
X+='*';
}
X+="->]";
return X;
}
public static void ShowMap(Map<Integer,Integer> map,int r){
for(int i=0;i<r;++i){
if(map.get(i)!=null){
System.out.println("Number:"+i+" \tFreq:"+ShowLength(map.get(i)));
}
else{
System.out.println("Number:"+i+", Freq: Null");
}
}
}
public static void main(String[] args) {
Random rand=new Random();
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<1000;++i){
int r=rand.nextInt(100);
Integer freq=map.get(r);
map.put(r,freq==null?1:freq+1);
}
ShowMap(map,100);
}
}
Number:0 Freq:[******->]
Number:1 Freq:[******->]
Number:2 Freq:[******->]
Number:3 Freq:[*****->]
Number:4 Freq:[***********->]
Number:5 Freq:[*****->]
Number:6 Freq:[**************->]
Number:7 Freq:[********->]
Number:8 Freq:[***********->]
Number:9 Freq:[**************->]
Number:10 Freq:[******************->]
Number:11 Freq:[************->]
Number:12 Freq:[*************->]
Number:13 Freq:[**************->]
Number:14 Freq:[*********->]
Number:15 Freq:[**************->]
Number:16 Freq:[*****->]
Number:17 Freq:[**************->]
Number:18 Freq:[********->]
Number:19 Freq:[****->]
Number:20 Freq:[*********->]
Number:21 Freq:[*****->]
Number:22 Freq:[*********->]
Number:23 Freq:[*******->]
Number:24 Freq:[*********->]
Number:25 Freq:[***********->]
Number:26 Freq:[**************->]
Number:27 Freq:[********->]
Number:28 Freq:[**********->]
Number:29 Freq:[*******->]
Number:30 Freq:[*********->]
Number:31 Freq:[*************->]
Number:32 Freq:[***************->]
Number:33 Freq:[*********->]
Number:34 Freq:[********->]
Number:35 Freq:[*******->]
Number:36 Freq:[*****************->]
Number:37 Freq:[*************->]
Number:38 Freq:[******->]
Number:39 Freq:[********->]
Number:40 Freq:[**************->]
Number:41 Freq:[******->]
Number:42 Freq:[*******->]
Number:43 Freq:[************->]
Number:44 Freq:[***********->]
Number:45 Freq:[*************->]
Number:46 Freq:[**************->]
Number:47 Freq:[************->]
Number:48 Freq:[***************->]
Number:49 Freq:[*****->]
Number:50 Freq:[********->]
Number:51 Freq:[*******->]
Number:52 Freq:[*************->]
Number:53 Freq:[**********->]
Number:54 Freq:[****->]
Number:55 Freq:[****************->]
Number:56 Freq:[******->]
Number:57 Freq:[******************->]
Number:58 Freq:[*********->]
Number:59 Freq:[******->]
Number:60 Freq:[*********->]
Number:61 Freq:[*************->]
Number:62 Freq:[***************->]
Number:63 Freq:[********->]
Number:64 Freq:[*********->]
Number:65 Freq:[**->]
Number:66 Freq:[**************->]
Number:67 Freq:[*************->]
Number:68 Freq:[*****->]
Number:69 Freq:[**************->]
Number:70 Freq:[*********->]
Number:71 Freq:[*******->]
Number:72 Freq:[*********->]
Number:73 Freq:[*******->]
Number:74 Freq:[**********->]
Number:75 Freq:[********->]
Number:76 Freq:[********->]
Number:77 Freq:[**********->]
Number:78 Freq:[**********->]
Number:79 Freq:[*********->]
Number:80 Freq:[**************->]
Number:81 Freq:[*************->]
Number:82 Freq:[*********************->]
Number:83 Freq:[***********->]
Number:84 Freq:[*****->]
Number:85 Freq:[*****->]
Number:86 Freq:[************->]
Number:87 Freq:[************->]
Number:88 Freq:[******->]
Number:89 Freq:[*******->]
Number:90 Freq:[***********->]
Number:91 Freq:[******************->]
Number:92 Freq:[**********->]
Number:93 Freq:[*****->]
Number:94 Freq:[*************->]
Number:95 Freq:[************->]
Number:96 Freq:[***********->]
Number:97 Freq:[*********->]
Number:98 Freq:[************->]
Number:99 Freq:[*******->]
[Finished in 1.5s]
正文之后
差不多了。溜了溜了。内容其实很多的,但是没办法,有些我觉得现阶段没啥用的,到时候要用直接看文档好了。现在基本了解就OK了,明天开始看算法和机器学习!!不能继续被《一世之尊》牵着走了!!!