Java基础

 

  • 在Java中,字符只以一种形式存在,Unicode编码(编号)
  • 所有的I/O基本上可以分为:面向字节的输入/输出流和面向字符的输入/输出流
  • Java有六个包装类:Boolean、Character、Integer、Long、Float、Double
  • 将字符型变量转换为数值型变量:1 将其转换为对应的ASCII码,2使用Character的GetNumericValue(char ch)方法
  • 一个合理的应用程序不应该(没必要)捕捉运行时异常。RuntimeException,是一个子类,当出现严重运行问题时也不会抛出
  • 所有throw的异常都必须从Throwable派生而来,Throwable有两个子类:Error、Exception。Java编译器要求程序必须捕获或声明所有的非运行时异常(如IOException),但对运行时异常(错误)可以不做处理。    throw关键字用于方法体内部,throws关键字用于方法体外部。
  • final、finally、finalize的区别。
  • final成员---常量,可以在共定义处定义,也可以在构造方法中定义。

    final方法:1 不允许从方法所在类中重写该方法,2 直接调用,相当于inline方法

    final类,不能被任何类继承,该类中的所有方法均为final,但变量可以不是。

    finally,异常中的最佳补充。

    finalize:用于释放资源

  • 反射Reflection:反射主要是指程序可以访问、检测和修改其本身的状态或行为的一种能力。通过某种机制来实现对自己行为的描述和监测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。(实现了反射机制的系统都具有开放性,但有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件),反射系统除了满足开放性条件外,还必须满足原因连接。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况。开放性原因连接反射系统的两大基本要素。 Java中的类反射Reflection能直接操作程序的内部属性
  • 在Java中不是没有指针,而是在Java中没有明确的指针定义,实质上,每一个new语句返回的都是一个指针的应用,而Java操作本身是不需要考虑如何操作这个“指针”的。
  • 不管Java参数的类型是什么,一律传递参数的副本。传引用副本的实质是复制指向地址的指针。对于基本类型变量,Java是传值的副本;对于一切对象型变量,Java都是传引用的副本
  • 在任意多个类的实例中,一个静态变量的实例只存在一个。
  • 定义在类里面的变量会被赋予一个默认的值。
  • Java中的IO操作中有面向字节(Byte)和面向字符(Character)两种方式。面向字节的操作以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。面向字符的操作以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Witer的子类。以InputStream/OutputStream为后缀的是字节流,以Reader/Writer为后缀的是字符流
  • Java序列化的实现:序列化一个对象,即让其实现Serializable接口。对象序列化不仅能保存对象的副本,而且还会跟着对象中的reference把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference。
  • for循环可以不使用“{}”,但仅限于执行语句(其中并不包括变量声明语句)。
  • 求素数,筛选法:筛选法是指从小到大筛去一个已知素数的所有倍数。
  • Object基类的方法:
  • clone()方法:创建并返回此对象的一个副本

    equals(Object obj)方法:指示某个其他对象是否与此对象“相等”

    finalize()方法:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法

    getClass()方法:返回一个对象的运行时类

    hashCode()方法:返回该对象的哈希值

    notify()方法:唤醒此对象监视器上等待的单个线程

    notifyAll()方法:唤醒在此对象监视器上等待的所有线程

    toString()方法:返回该对象的字符串显示

    wait()方法:导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll方法。

    wait(long timeout)方法:导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量

    wait(long timeout,int nanos)方法:导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量

     

  • 不通过构造函数也能够创建对象。Java创建对象的方法如下:1.用new语句创建对象,会明确地、显示地调用构造方法;2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例化,会明确地、显示地调用构造方法;3.调用对象的clone()方法,在内存上对已有对象的影印,所以不会调用构造函数;4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法,该方法是从文件中还原类的对象,也不会调用构造函数
  • inner class:Java内部类与C++嵌套类(nested class)最大的不同就在于是否有指向外部的引用上。静态内部类(inner class)意味着,创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对象访问一个外部类对象。
  • 内部类或嵌套类在层级上没有限制,内部类可以是私有类。
  • Java容器类库一共有两种主要类型:Collection和Map。Collection和Map的区别在于容器内每个“槽”所存储的元素个数不同。Collection类型中,每个“槽”只有一个元素;Map类型中,持有key-value关联。所有的Java容器类都可以自动调整自己的尺寸。
  • Collection的子类如下:
  • List,将以特定次序存储元素,所以取出的顺序可能和放入顺序不同。---ArrayList:擅长随机访问元素,但在List中间插入、删除、移动元素较慢;---LinkedList:插入、删除、移动元素方便,随机访问元素差。

    Set:每个值只能保存一个对象,不能含有重复元素。---HashSet:使用散列函数;---TreeSet:使用红黑树;---LinkedHashSet:使用链表结合散列函数

    Queue:先进先出的容器

  • Map的子类:HashMap、HashTable、TreeMap 
  • 容器类的特征:1.List、Set、Map将所有的对象一律视为Object类型;2.Collection、List、Set、Map都是接口,不能实例化。继承自他们的ArrayList、Vector、HashTable、HashMap、stack都是具体class,这些可被实例化。3.Vector容器确切地直到它所持有的对象隶属什么类型。Vector不进行边界检查。
  • 在各种List中,最好的做法是以ArrayList作为默认选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢;在各种Set中,HashSet通常优于HashTree(插入、查找)。只有当需要产生一个经过排序的序列时,采用TreeSet。HashTree的一一是用来维护其内元素的排序状态;在各种Map中,HashMap用于快速查找。当元素个数固定时,最好使用Array,因为Array的效率是最高的。
  • HashMap与HashTable的区别:两者都是属于Map接口类,实现了将唯一键值映射到特定的值上;HashMap类没有分类或者排序,允许一个null键和多个null值;HashTable类似于HashMap,但不允许null键和null值,HashTable比HashMap慢,因为HashTable是同步的;HashMap把HashTable的contains方法去掉了,改成containsValue()和containsKey();HashTable是Synchronize的,是线程安全的。
  • 构造函数可以被重载,但不能被覆盖;构造函数是没有返回值的,构造函数的执行是从它最老的祖先类开始向下执行调用的。
  • 派生类必须通过super调用父类的含有参数的构造方法;派生类可以选择调用父类的构造方法,但不能都不调用(最少调用一个),若不指定,就会调用无参数的构造方法。
  • 函数的重载与函数的返回值无关;静态的方法不能被覆盖;继承结构中,父类的内部细节对于子类是可见的,通过继承的代码复用是一种“白盒式代码复用”;
  • 匿名的内部类是没有名字的内部类,不能extends其他类,但一个内部类可以作为一个接口,由另一个内部类实现。final类不能被继承,final类内的方法添加final提示符,无任何意义。
  • 继承抽象类必须继承抽象方法。
  • 接口中的成员变量和方法都必须是public类型的,确保外部使用者能够访问它们;接口中的方法都是抽象方法;接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态变量;接口中的变量是所有实现类共有的,所以变量是不可变fianl类型的,也就是常量了;接口不能定义变量;接口的方法默认是public abstract;接口中不可以定义变量,只能定义常量,所以接口的属性默认是public static final常量,且必须赋初值。final和abstract不能同时出现。
  • 使用new关键字分配的内存既不在栈中,也不在静态数据区中。
  • 存储结构分为:随机存取、顺序存取、索引存取、散列存储。随机存取可以随意直接存取一个元素,可以通过下标直接存取任何一个元素如数组等;又如内存,可以通过地址直接访问任意一个空间。顺序存取,就是只能从前到后逐个访问,像链表结果,不能够直接通过下标访问,必须从表头开始,向后逐个搜索。索引存取是指为了某个关键字建立索引表,从所有的表中得到地址,再直接访问(多用在数据库管理过程中)。散列存储是建立散列表,相当于一种索引。
  • 在五分钟内找出1千万条有重复的字符串信息中重复出现最多的前10条字符串信息
  • 二叉树遍历原则,前序遍历是跟左右,中序遍历是左根右,后序遍历是左右根。
  • 平衡二叉树具有以下性质,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个字数都是一棵平衡二叉树。
  • 图的深度优先遍历的递归定义:假设给定图G的初态是所有的顶点均未曾访问过。在G中任选一顶点v为初始触发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有的顶点均已被访问为止。
  • 广度优先遍历的递归定义:设图G的初态是所有的顶点均未访问过。在G中任选一顶点v为源点,则广度优先遍历可以定义为:首先访问出发点v,接着依次访问v的所有邻接点w1,w2,…,wt,然后依次访问w1,w2,…,wt邻接的所有未曾访问过的顶点。以此类推,直至图中所有和源点v有路径相通的顶点都已访问到为止。
  • 哈夫曼编码
  • Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不限于字符串),所以常被搜索引擎系统用于文本词频统计。其优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的
  • 排序:;简单排序中直接插入最好快速排序最快当文件为正序时,直接插入排序和冒泡排序均最佳
  • 辗转相除法(欧几里得算法)的时间复杂度是O(logn);
  • "=="判断符号左右两个变量(Object)是否指向同意内存地址;“equals()”判断两个object是否“一样”(值相同)。
  • Constant Pool 常量池:在java编译好的class文件中个,有一个由数组祖晨过的表,用来存储程序中使用的各种常量。
  • Java中的容器:ScollPane、Dialog、A[[let
  • UML代表统一建模语言。

  • 关联是两个或多个特殊类元之间的关系,它描述了这些类元的实例的联系。参与其中的类元在关联内的位置有序。一个关联中的同一个类可以出现在多个位置上,关联的每个实例是引用对象的有序表,关联的外延即这种链接的一个集合。在链接集合中给定的对象可以出现多次,或者在关联的定义允许的情况下可以在同一个链中(在不同的位置)出现多次。关联将一个系统组织在一起,如果没有关联,那只有一个无链接类的集合。关联可以有一个名称,在包含的所有关联和类中,它必须是唯一的。关联不是必须要有一个名称,它的端点的角色名称提供了在同一个类中辨别多个关联的另一种途径。在UML的语义中,位置的关系(类元的关联)称为链。链在系统执行过程中可以被创建和销毁,服从每个关联端点可变性的限制。

  • Singleton设计模式:Singleton设计模式的主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。Singleton模式通常有两种形式。第一种形式:定义一个类,构造函数为private,有一个static的private的该类变量,在类初始化时实例化,通过一个public的getInstance方法获取对对象的引用,继而调用其中的方法。

    public class Test {
    
    	private Test(){
    		
    	}
    	//供内部调用
    	private static Test instance = new Test();
    	//提供一个供外部访问本class的静态方法,可以直接访问
    	public static Test getInstance() {
    		return instance;
    	}
    	
    }
    第二种形式:
    public class Test {
    
    	private static Test instance = null;
    	
    	public static synchronized Test getInstance() {
    		if (instance == null) {
    			instance = new Test();
    		}
    		return instance;
    	}
    	
    }
    

     

  • Struts下的设计模式:MVC(Model/View/Controller)模式是一种使用得较多的设计模式。MVC包括三类对象,Model是应用对象,是应用程序的主体部分;View是屏幕上的表示,是应用程序中用户界面相关的部分;Controller定义用户界面对用户输入的响应方式。MVC模式的出现不仅实现了功能模块和显示模块的分离,同时,还提高了应用系统的可维护行、可扩展性、可移植性和组件的可复用性。不一定所有的JSP应用都采用MVC模式,当对于大型应用来说,最好采用MVC模式,因为MVC模式可以将三个对象进行分离,以提高灵活性和复用性。

  •  只有具备执行权限才允许用户进入一个文件系统的目录。

  • 短作业优先==最短剩余时间作业优先。

  • sleep()和wait()的区别:1.sleep()使线程停止一段时间的方法。在sleep时间间隔期满后,线程不一定立即恢复执行。2.wait()当线程交互时,如果线程对一个同步对象x发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

  • win32环境中,线程有三种基本模式:单线程,单元线程和自由线程。

  • 线程中start()和run()方法的区别:start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独调用run()就跟调用普通方法是一样的,已经失去线程的特性。

  • synchronized和java.util.concurrent.locks.Lock的异同:相同点:Lock能完成synchronized所实现的所有功能。主要不同点是,Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手动释放,并且必须在finally从句中释放。

  • 串行化:对象能记录对象本身状态以便将来再生的能力叫做对象的持续化。对象通过描述自己状态的数值来记录自己,这个过程叫对象串行化(serialization)。串行化的主要任务是写出对象实例变量的数值。串行化的过程是递归的,如果变量是另一对象的引用,则引用的对象也要串行化。在Java中,只有实现了Serialization的类的对象才可以被串行化。串行化只能保存对象的非静态成员变量,不能保存任何成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存期状态的(例如:Thread对象、FileInputStream对象)。对于这些字段,必须使用transient关键字标明,否则编译器将报错。另外对于将对象存放在磁盘上或者网络上的数据,也需要在这些字段前加上transient关键字。

  • 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务的开始与结束由用户显式控制或者由DBMS按默认的规定自动划分事务。事务具有原子性、一致性、独立性及持久性等特点。

  • 执行数据库查询时提高查询效率的方法:1.在数据库设计上:建立索引;分区;尽量使用固定长度的字段;限制字段长度。2.在数据库I/O方面:增加缓冲区;如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度。3.在SQL语句方面:优化SQL语句,减少比较次数;限制返回的条目(MySQL中用limit)。4.在Java方面,如果是反复使用的查询,使用PreparedStatement减少查询次数。

  • XML中的命名空间:使用命名空间可以明确表示出XML文档中的 元素、属性及其他标记,可以避免名称之间冲突所带来的问题。命名空间是W3C推出的用来统一命名XML文档中的元素和属性的机制


摘自《Java程序员面试宝典》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值