当前位置: 移动技术网 > IT编程>开发语言>Java > 浅析关于java的一些基础问题(上篇)

浅析关于java的一些基础问题(上篇)

2019年03月06日  | 移动技术网IT编程  | 我要评论

       要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象。对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度

来解析一些java中的基础问题,这些问题也是大部分编程人员的软肋或易混淆点。

一  关于string问题

1.string是基本类型(值类型)还是引用类型?

 (1)string是引用类型。通过查看jdk,string是一个类,既然是一个类,那么就是引用类型;

 (2)基本类型包括:int,float,boolean,byte,凡是通过new关键字的,都属于引用类型,如

一般情况,引用类型是通过new关键字,如classa  a=new classa() ,a就是引用类型,引用类型存储在内存堆中,而值类型存储在内存栈中。

堆和栈的区别是,栈存取速度快,固定存储长度;而堆长度根据运行时实际情况分配,速度慢。

2.string str1=“alan”与string str2=new string("alan")区别?

回答该问题,就涉及到java虚拟机常量池问题

(1)在常量池中,不存在两个相同的变量。

string str1="alan_beijing";
string str2="alan_beijing";

system.out.println(str1==str2);//true
system.out.println(str1.equals(str2));//true

说明str1和str2指向同一个对象。

(2)每new一个对象,就新增加一个对象,不管常量池中是否存在相同的变量

string str1="alan_beijing";
string str2=new string("alan_beijing");

system.out.println(str1==str2);//false
system.out.println(str1.equals(str2));//true

3.equals和==区别?

(1)核心区别:equals比较对象值是否相等,==比较是否是同一个对象。

string str1="alan_beijing";
string str2=new string("alan_beijing");

system.out.println(str1==str2);//false
system.out.println(str1.equals(str2));//true

4.为什么stringbuilder相对于string字符串拼接比较快?

知道了1-3答案,这个问题就非常容易解决了,因为每拼接一个字符串,就要new一个对象,占用内存堆,而stringbuilder不需要,故比较快。

string str="a"+"b"+"c"+"d";//要额外增加3个变量,“ab”,"abc",'abcd'

 5.考虑如下问题答案

string str0="alan";
string str1="alan";
string str2="a"+"lan";
string str3=new string("alan1");
string str4="a"+new string("lan");
string str5=str3.intern();


system.out.println(str0==str1);
system.out.println(str1==str2);
system.out.println(str1==str3);
system.out.println(str3==str4);
system.out.println(str1==str5);

二  关于集合问题

1.hashmap,treemap,hashset和hashtable比较

(1)实现接口不一样。hashmap和hashtable实现map接口,而hashset实现set接口

(2)线程安全性不一样。hashmap线程不安全(异步锁),hashtable线程安全(同步锁),hashset线程不安全,因为它的底层

是由hashmap不重复key实现的。

(3)性能从高到底

hashmap>hashset>hashtable

(4)k,v是否为null

hashmap的k,v都可以存放null;

hashtable的k,v不能存放null;

hashset只能v存放nll,k不能存放null

(5)存储内容差异

hashmap<k,v>和hashtable<k,v>存储k,v,而hashset<e>存储对象

(6)hashmap和treemap区别

treemap保存对象排列次序,hashmap不须保存对象排列次序

三 关于io种类划分问题

io从种类上,一般划分为字符流和字节流两大类,其中,字符流是以reader或writer结尾的,如inputstreamreader,

outputstreamwriter;而字节流是以stream结尾的,如inputstream,outputstream。他们的继承关系如下:

 

 

 四  关于异常问题

(1)所有的异常类继承类throwable

(2)异常从种类上来划分,分为非受查异常(派生于所有error或runtimeexception)和受查异常

(3)自定义异常类,只需继承exception类或exception下的任何子类即可

(4)何为异常传递?指异常传递给调用的子类,而不在自己内部实现异常,通过throws向调用的类传递异常。

 

五  值传递和引用传递

值传递传递的是值,引用传递传递的是地址(也可叫做指针)

下面的的代码,最终输出结果为15 0 20,请考虑为什么?

package demo.test;

import org.junit.test;


public class mgenaltest {
    @test
    public void test(){
        first();
    }

    public void first(){
        int i=5;
        value v=new value();
        v.i=25;
        second(v,i);
        system.out.println(v.i);
    }

    public void second(value v,int i){
        i=0;
        v.i=20;
        value val=new value();
        v=val;
        system.out.println(v.i+" "+i);
    }
}

class value{
    public int i=15;
}

六 反射

java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无须再组件之间进行链接,反射允许

在编写与执行时,使程序代码能够接入装载到jvm中的类的内部信息,而不是源代码中选定的类协作的代码。

七  序列化

关于序列化,只需实现接口serializable即可

public interface serializable {
}

八  jvm

关于jvm,重点了解jvm垃圾回收机制,一般情况地,对象在垃圾回收前,会先调用方法finalize(),然后再调用gc()方法。

关于垃圾回收机制问题,有很多回收算法,不同的算法,实现不同的机制。

九 算法

关于算法,递归算法考察比较多,如斐波拉列数列 1,1,2,3,5,8,。。。。

十 版权区

  •    转载博客,必须注明博客出处
  •    博主网址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,欢迎提出,邮箱:2098469527@qq.com
  •   专业.net之家技术qq群:490539956
  •   专业化java之家qq群:924412846
  •   有问必答qq群:2098469527
  •   一对一技术辅导qq:2098469527

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网