Loading

Java学习笔记(1)

1.String StringBuffer StringBuilder的区别

(1).
String 是字符串常量,String是不可变的,只能进行一次赋值.看下面这段代码。

String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1

看上述代码你可能会觉得我们改变了String s的值,为什么没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了。
(2).
StringBuffer和StringBuilder都是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了。
StringBuilder:线程非安全的。
StringBuffer:线程安全的。
当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,是因为速度的原因。
(3).
对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
(http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html)
(http://blog.csdn.net/yyyyxcy/article/details/78080122)

2.
“==”和equals的区别。
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

3.
Arrays.copyOf()。
int []tmp=Arrays.copyof(arr,arr.length)
这里tmp没有申请空间,但是不会报错。因为在copyOf方法中,已经申请了arr.length大小类型为arr数组类型(int)的空间,所以即便tmp没有申请空间也不会报错。

4.
Foreach:
Foreach循环也叫增强型的for循环,它简化了集合的遍历。
语法如下:

   for(type element: array)
  {
     System.out.println(element);
  }

Foreach循环的缺点:丢掉了索引信息。
当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息。
Foreach虽然能遍历数组或者集合,但是只能用来遍历,无法在遍历的过程中对数组或者集合进行修改,而for循环可以在遍历的过程中对源数组或者集合进行修改。
5.
deepequals:
有如下代码

import java.util.Arrays;

public class DeepEquals {
    public static void main(String[] args) {
        String[][]name1={{"G","a","o"},{"H","u","a","n"},{"j","i","e"}};
        String[][]name2={{"G","a","o"},{"H","u","a","n"},{"j","i","e"}};
        System.out.println(Arrays.equals(name1[0], name2[0]));
        System.out.println(Arrays.equals(name1, name2));
        System.out.println(Arrays.deepEquals(name1, name2));
    }

}

结果为:
true
false
true
可以看出deepEquals用于判定两个指定数组彼此是否深层相等,此方法适用于任意深度的嵌套数组。
在比较的两个数组均为一维数组的前提下,equals和deepEquals的比较结果没有差别

posted @ 2017-09-29 11:01  Xianhao  阅读(36)  评论(0编辑  收藏  举报