发表于: 2018-04-25 19:39:56

2 602


今日完成:

1,学习了String[]跟List<String>的区别.

 个人理解:String[]代表String类型的数组,固定长度不可扩展.

          List<String>代表List集合,里面装的是String类型的对象,可扩展.

 百度后:

      string[]数组里面是存放string型的值,List<string>是存放string类型的对象

      数组的容量是固定的,您只能一次获取或设置一个元素的值,而List<T>的容量可根据需要自动扩充、修改、删除或插入数据。
      数组可以具有多个维度,而 List< T> 始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于List的性能。 这是因为 List的元素属于 Object 类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List< T> 的性能与同类型的数组十分相近。

       string[]是 数组,定长,不可变

      List<string> 是泛型 ,非定长,可变

      作用是一样的,但灵活性不同。string[]是定长的,不容易实现容量增长、中间插入一个字符串这样的操作,List<string>则可以方便实现。如果你能确定字符串数组长度,而且可以逐项填充的话,建议用string[]。如果不能确定数组长度,或者在计算值时需要不断向中间插入一个字符串,可以使用List<string>,生成完成后再用ToArray()方法转换为string[],string[]也可以通过List的AddRange方法添加到List<string>。

这两者的区别实际上是数组跟集合的区别:

数组Array和集合的区别:
 
(1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
 

(2)JAVA集合可以存储和操作数目不固定的一组数据。 


(3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。

 
联系:使用相应的toArray()和Arrays.asList()方法可以回想转换。
 
一.集合的体系结构:
 
List、Set、Map是这个集合体系中最主要的三个接口。 List和Set继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。
 
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set 只能通过游标来取值,并且值是不能重复的。
 

List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。

 ArrayList 不同步是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的

什么是线程不安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取

完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是

脏数据。 如图,List接口下面有两个实现,一个是ArrayList,另外一个是vector。 从源码的角度来看,因为Vector的方法前加了,synchronized 关键字,也

就是同步的意思,sun公司希望Vector是线程安全的,而希望arraylist是高效的,缺点就是另外的优点。 说下原理(百度的,很好理解): 一个 ArrayList ,

在添加一个元素的时候,它可能会有两步来完成: 

1. 在 Items[Size] 的位置存放此元素; 
2. 增大 Size 的值。 
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1; 
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。

线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),

所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。 
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。  

(每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,

   其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,)

Map 是键值对集合。其中key列就是一个集合,key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是Map的三个主要的实现类。 

HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 

 
二.List和ArrayList的区别
 
  1.List是接口,List特性就是有序,会确保以一定的顺序保存元素.
 
  ArrayList是它的实现类,是一个用数组实现的List.
 
  Map是接口,Map特性就是根据一个对象查找对象.
 
  HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
 
  2.一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
 
  比如:List list = new ArrayList();
 
  这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
 
  List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
 
  这样,就不需要修改其它代码,这就是接口编程的优雅之处.
 
  另外的例子就是,在类的方法中,如下声明:
 
  private void doMyAction(List list){}
 
  这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
 
  3.如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.


2,学习了valueOf()和intValue()方法.

这两个方法,是数据类型转化的方法。
intValue()
如Integer类型,就有intValue()方法,integer.intValue()意思是说,把Integer类型转化为Int类型。其他类似,都是一个意思

valueOf()
如String就有valueOf()方法,String.valueOf()意识是说,要把参数中给的值,转化为String类型,Integer的valueOf()就是把参数给的值,转化为Integer类型。其他类似如Long.valueOf(),都是一个意思。


3,完成了拦截器的使用,并将用户必须登录才能访问的url增加前缀 /u/。



4,犯了个很弱智的错误,在SpringMVC.xml的配置文件里配置拦截器时忘记给添加的中文注释加注释符号,导致出现bug.


5,简单学习了的正则表达式.

     \b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w

假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b

这里,.是另一个元字符,匹配除了换行符以外的任意字符*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词

换行符就是'\n',ASCII编码为10(十六进制0x0A)的字符。

如果同时使用其它元字符,我们就能构造出功能更强大的正则表达式。比如下面这个例子:

0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形)。

这里的\d是个新的元字符,匹配一位数字(0,或1,或2,或……)-不是元字符,只匹配它本身——连字符(或者减号,或者中横线,或者随你怎么称呼它)。

为了避免那么多烦人的重复,我们也可以这样写这个表达式:0\d{2}-\d{8}。这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)


详见:http://www.jb51.net/tools/zhengze.html


6,学习了SpringMVC的参数校验.

 1>导入依赖jar包.


2>在SringMVC.xml下配置参数校验器.并将校验器注入到处理器适配器中

3>在POJO中添加校验.

4>在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示.



明日计划:

1,学一下JWT.

2,提交任务5.


收获:

1,学习了SpringMVC的参数校验.

2,学习了数组跟集合的区别.



返回列表 返回列表
评论

    分享到