Java基础知识(五)

1.      字符串与数组——字符串创建与存储机制

String  s1=newString(“abc”) 和 String  s1=new String(“abc”)语句,存在两个引用对象s1、s2.对象内容都是字符串“abc”,他们在内存中的地址是不同的。

                        

由此可见对象一般都放在堆中,栈中放的是方法或引用变量。?

2.      “==”、“equals”和“hashCode”的区别

1  “==”实际比较的是两个变量对应的内存所存储的数值是否相等。基本数据类型可以直接使用“==”运算符来比较其对应的值是否相等。如果变量指向的是对象,“==”可以用来判断两个变量所对应的内存中数值是否相等(这两个对象是否指向同一块存储空间)但是不能判断对象的内容是否相同。

2   equals是Object类提供的方法之一,每一个对象都具有equals这个方法。它的特殊之处就在于它可以覆盖,所以可以通过覆盖的方法让它不是比较引用而是比较数据内容。

3   hashCode()方法也是用来判断两个对象是否相等。返回的是对象在内存中地址转换成的一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()方法都是不相等的。

equals方法是给用户调用的,需要判断对象是否相等,可以重写equals;hashCode()方法用户一般不调用。在hashMap中,key是不可重复的,指的是equals()和hashCode()只有一个不相等就可以了。equals方法比较是相等则hashCode()就会产生相同的int地址码。

                    

3. String、StringBuffer、StringBuilder和StringTokenizer的区别

   1  String和StringBUffer都是对字符串进行操作的,String是不可变类,所以适合被共享的场合使用;StringBuffer是可变类,即当对象被创建后仍然可以对其值进行修改。在实例化时初始化方式:String s1=new String(“world”)或者String s=”Hello”。但是StringBuffer只能使用构造函数:StringBuffer s=new StringBuffer(”Hello”)。

   2  StringBuilder和StringBuffer类似,都是字符串缓冲区,但是StringBuilder不是线程安全的,单线程的时候效率高一些,但是多线程使用StringBuffer,因为可以对这些访问同步,任意特定实例上的操作是以串行顺序发生的。

   3  StringTokenizer 允许应用程序将字符串分解为标记。不建议使用,但是可以使用类似功能split方法。

  String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);

4.      Instanceof是用来判断数据类型的

      int [] a={1,2};

        int [][]b=newint[2][4];

        String[] s={"a","b"};

        if(ainstanceof int[])

            System.out.println("the type for a is int[]");

        if(binstanceof int[][])

            System.out.println("the tyoe for b is int[][]");

        if(sinstanceof String[])

            System.out.println("the tyoe for s is String[]");

 

由此可知数组也是对象。

5.      length和length()方法的区别

数组提供length属性来会的数组的长度。length()方法是针对字符串的,来计算字符串的长度。size()方法是针对泛型集合而言的,用于查找泛型中元素的个数。

6.      异常处理

try {}里有一个return语句,try后又有finally{}:那么finally是在return前执行的。因为return就意味着结束对当前函数的调用并跳出这个函数体。如果try-finally或者try-catch-finally中都用return,则finally中的return语句会覆盖别处的return语句。

   使用异常处理时注意:

           1 Java异常处理用到了多态的概念,需要先捕获(catch)子类,再捕获基类的异常信息。

           2 尽早的抛出异常,同时对捕获的异常进行处理。

           3 Java中的检查异常(如IOException、SQLException等),Java编译器会强制捕获这类异常,即用到try{存在异常代码块}catch(){处理}。运行时异常(NullPointerException、BufferOverException等),不会强制捕获异常。

7.      Java Socket

网络上的两个程序通过一个双向分通信连接实现数据的交换,这个双向链路的一端成为一个Socket(套接字),可以用来实现不同虚拟机或不同计算机之间的通信。面向连接的Socket通信协议(TCP,Transmission Control Protocol,传输控制协议)。和面向无连接的(UDP,UserDatagram Protocol,用户数据报协议)。任何一个Socket都是由Ip地址和端口号唯一确定的。

           基于TCP通信的过程:1 Server端Listen(监听)指定的某个端口是否有连接请求;2 Client端向Server端发送Connect请求;3 Server端向Client端返回Accept消息。Socket的声明周期:打开Socket、使用Socket收发数据和关闭Socket。

8.      Java序列化

序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存文件\数据库等系统里,并在需要时把该流读取出来重新构造一个相同的对象。

   序列化的特点:1 如果一个类能被序列化,则它的子类也能被序列化

                             2 被static或transient声明的成员数据是不能被序列化的。

    在用接口Serializable实现序列化时,这个类中的所有属性都会被序列化,那么怎样才能实现只序列化部分属性?

  一种方法是实行Externalizable接口,开发人员可以根据实际需求来实现readExternal与writeExternal方法来控制序列化与反序列化所使用的属性,另一种方法是使用关键字transient来控制序列化的属性。

9.      JVM

Java平台是一个纯软件平台,这个平台可以运行在一些基于硬件的平台之上。Java平台包含:JVM和Java API。JVM是一个虚构出来的计算机,用来把Java编译器生成的中间代码(字节码)转换为机器可以识别的编码并运行。它有自己完善的硬件架构:处理器、堆栈、寄存器等。还具有相应的指令系统,它屏蔽了具有操作系统平台相关信息,是java程序只生成JVM上运行的目标代码,就可以在多种平台上运行。.java文件被加载到JVM中生成.class文件,这些文件被动态的加载到内存中,

10.      内存泄露

是指一个不再被程序使用的对象或变量还在内存中占有存储空间。

可能造成内存泄漏的情况:静态结合类;各种连接;监听器;变量不合理的作用域;单例模式等。

11.  堆与栈

栈中存放的是:基本数据类型 变量和引用对象的引用变量,变量出了作用域就会自动释放;每当有函数调用时,都会通过压栈方式创建新的栈帧,每当函数调用结束后都会通过弹栈的方式释放栈帧。

堆中存放的是:引用类型的变量,需要通过new等方式进行创建。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中的这个变量取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

12.  Java的Collection框架

 

13.  什么是迭代器

迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,提供了一种访问容器对象中的各个元素,而又不暴露该对象内部细节的方法。迭代器的使用:

1 使用容器的iterator()方法,返回一个Iterator,然后通过Iterator的next()方法返回第一个元素。

2 使用Iterator的hasNext()方法判断容器中是否还有元素,有的话可以使用next()方法获取下一个元素。

3 可以通过remove()方法删除迭代器返回的元素。

publicclass Test {

    publicstatic void main(String[] args) {

        List<String> ll=newLinkedList<String>();

        ll.add("first");

        ll.add("second");

        ll.add("third");

        ll.add("fourth");

       

        for(Iterator<String> iter=ll.iterator();iter.hasNext();){

            String str=(String) iter.next();

            System.out.println(str);

//          if(str.equals("second"))//在遍历容器的同时又对容器做增加或删除操作会或者多线程操作时导致抛出异常

//              ll.add("five");可以通过把需要删除的对象保存到一个集合中,遍历结束后在调用removeAll()方法来删除,或者使用iter.remove()

        }

    }

}

引申:Iterator只能正向遍历集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向遍历List,同时支持元素的修改。

14.   ArrayList、Vector和LinkedList的区别

三者都为可伸缩数组,可以动态改变长度的数组。

  1 ArrayList和Vector都是基于存储元素的Object[] array来实现的,在连续的空间来存数。但是在插入元素是需要移动容器中的元素,效率低。它们都有一个初始化容量的大小,在需要时可以动态扩充它们的存储空间。

ArrayList和Vector最大的区别是synchronization(同步)的使用,ArrayList没有同步作用的方法。但是Vector的很多方法都是直接或间接同步的,所以它是线性安全的。适合对数据索引或者只在末端增加、删除元素时。

2LinkedList是采用双向列表来实现的,不适合随机访问元素,但是插入元素时不需要移动,也是非线性安全的容器。

15.  HashMap、HashTable、TreeMap和WeakHashMap的区别

1   HashMap是一个常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值。HashMap和HashTable的区别:

 a.  HashMap是HashTable的轻量级实现(非线性安全的实现),主要在于HashMap允许空键值,但是最多允许一条;

 b.  HashMap把HashTable的contains方法去掉,改成containsvalue和containskey,HashTable继承自Dictionary类,HashMap是Map interface的一个实现。

 c.  HashTable的方法是线程安全的,而HashMap不支持线程同步,但是HashMap效率可能高于HashTable。

dHashTable使用Enumeration,而HashMap使用Iterator。

 e. HashTable和HashMap采用的hash算法几乎一样,性能不会有很大差异

f在HashTable中,hash数组默认大小是11,增加的范式是乘以2再加1.在HashMap中hash数组默认大小是16,而且一定是2的指数。

 g. hash值的使用不同,HashTable直接使用对象的hashCode。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值