浅析关于java的一些基础问题(上篇)
要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象。对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度
来解析一些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);
Tip:如下为String.equals()方法jdk源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
源码很清楚,有三个逻辑
(1)自身与自身比较,则返回true;
(2)当与其他对象比较,比较的是字符串序列,字符序列相同,返回true,否则返回false;
(3)当不满足(1)(2),则直接返回false
二 关于集合问题
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
浅析关于java的一些基础问题(上篇)的更多相关文章
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- Java开发的基础条件:
------------Java开发的基础条件:Java相关的基础+对编程的自己的理解+调试代码+自己的坚持 一定要谦逊,不人云亦云,不去妄言某一门语言或技术好或坏!不是哪门技术有问题,而是(不会用才 ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
随机推荐
- 利用PowerUpSQL攻击SQL Server实例
这篇博客简述如何快速识别被第三方应用使用的SQL Server实例,该第三方软件用PowerUpSQL配置默认用户/密码配置.虽然我曾经多次提到过这一话题,但是我认为值得为这一主题写一篇简短的博客,帮 ...
- mysql5.7连接不上可能的问题(针对新安装的mysql5.7可能出现的问题)
"ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)" 今天刚刚安装好的mysql5. ...
- common-pool2连接池详解与使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- 阿里云大数据计算服务 - MaxCompute (原名 ODPS)
MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工作,这些工作背后的原因是什么?大数据市场进入 ...
- 『Zap Möbius反演』
Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为F ...
- [译]PEP 380--子生成器的语法
导语: PEP(Python增强提案)几乎是 Python 社区中最重要的文档,它们提供了公告信息.指导流程.新功能的设计及使用说明等内容.对于学习者来说,PEP 是非常值得一读的第一手材料,学习中遇 ...
- 实用抓包工具:whistle
无论是前端开发还是客户端,实际开发过程中,抓包都经常被用到.工欲善其事必先利其器,一款好用的抓包工具也是必须的. 说到抓包,Windows系统上不少人都用过Fiddler,Mac或Linux上用Cha ...
- DSAPI DS密法
DS密法是DYLIKE本人研发的一种针对文本字符串的高强度加密方法,本加密方法的优点是同源不同密,同一个源文本每次加密的结果都不同,长度也不同.密钥最大可达String类型的字符最大长度.缺点是解密时 ...
- 工程文件csproj使用编译条件指定属性
csproj工程文件中有很多xml格式的属性,比如PropertyGroup.ItemGroup,某些属性操作默认是全部的或者是当前编译条件的而已,当我们想指定某些属性只在某个编译条件下发生时就可以通 ...
- ArcGIS API For Javascript_4.8-渲染器SimpleRenderer
SimpleRenderer require(["esri/renderers/SimpleRenderer"], function(SimpleRenderer) { /* co ...