当前位置: 首页 > news >正文

有打赏功能的网站模板企业快速建站

有打赏功能的网站,模板企业快速建站,局网站建设方案,百度学术论文查重免费Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象#xff08;Java最重要的特性#xff0c;让程序耦合度更低#xff0c;内聚性更高#xff09; 3、与平台无关性#xff08;JVM是Java跨平台使用的根本#xff09; 4、可靠安全 5、支持多线程 2、…Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象Java最重要的特性让程序耦合度更低内聚性更高 3、与平台无关性JVM是Java跨平台使用的根本 4、可靠安全 5、支持多线程 2、八种基本类型 byte short int long float double boolean char 3、面向对象和面向过程的区别 面向过程是分析解决问题的步骤然后用函数把这些步骤一步一步地实现然后在使用的时候一一调用则可。性能较高所以单片机、嵌入式开发等一般采用面向过程开发 面向对象是把构成问题的事务分解成各个对象而建立对象的目的也不是为了完成一个个步骤而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说比面向过程要 低。 4、标识符的命名规则 标识符的含义 是指在程序中我们自己定义的内容譬如类的名字方法名称以及变量名称等等都是标识符。 命名规则硬性要求 标识符可以包含英文字母0-9的数字$以及_ 标识符不能以数字开头 标识符不是关键字 命名规范非硬性要求 类名规范首字符大写后面每个单词首字母大写大驼峰式。 变量名规范首字母小写后面每个单词首字母大写小驼峰式。 方法名规范同变量名。 5、instanceof 关键字的作用 instanceof 严格来说是Java中的一个双目运算符用来测试一个对象是否为一个类的实例用法 为 boolean result obj instanceof Class int i 0; System.out.println(i instanceof Integer);//编译不通过 i必须是引用类型不能是基本类型 System.out.println(i instanceof Object);//编译不通过 Integer integer new Integer(1); System.out.println(integer instanceof Integer);//true //false ,在 JavaSE规范 中对 instanceof 运算符的规定就是如果 obj 为 null那么将返回 false。 System.out.println(null instanceof Object);其中 obj 为一个对象Class 表示一个类或者一个接口当 obj 为 Class 的对象或者是其直接 或间接子类或者是其接口的实现类结果result 都返回 true否则返回false。 注意编译器会检查 obj 是否能转换成右边的class类型如果不能转换则直接报错如果不能 确定类型则通过编译具体看运行时定。 6、Java自动装箱与拆箱 装箱就是自动将基本数据类型转换为包装器类型int–Integer调用方法Integer的 valueOf(int) 方法 拆箱就是自动将包装器类型转换为基本数据类型Integer–int。调用方法Integer的 intValue方法 7、重载和重写的区别 重写(Override) 从字面上看重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子 类继承了父类原有的方法但有时子类并不想原封不动的继承父类中的某个方法所以在方法名 参数列表返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下 对 方法体进行修改或重写这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。 public class Father {public static void main(String[] args) {// TODO Auto-generated method stubSon s new Son();s.sayHello();}public void sayHello() {System.out.println(Hello);} } class Son extends Father{Overridepublic void sayHello() {// TODO Auto-generated method stubSystem.out.println(hello by );} }重写 总结 1.发生在父类与子类之间 2.方法名参数列表返回类型除过子类中方法的返回类型 是父类中返回类型的子类必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符 publicprotecteddefaultprivate) 4.重写方法一定不能抛出新的检查异常或者比被重写方法申 明更加宽泛的检查型异常 重载Overload 在一个类中同名的方法如果有不同的参数列表参数类型不同、参数个数不同甚至是参数顺序不 同则视为重载。同时重载对返回类型没有要求可以相同也可以不同但不能通过返回类型是 否相同来判断重载。 public class Father {public static void main(String[] args) {// TODO Auto-generated method stubFather s new Father();s.sayHello();s.sayHello(wintershii);}public void sayHello() {System.out.println(Hello);}public void sayHello(String name) {System.out.println(Hello name);} }重载 总结 1.重载Overload是一个类中多态性的一种表现 2.重载要求同名方法的参数列表不同(参 数类型参数个数甚至是参数顺序) 3.重载的时候返回值类型可以相同也可以不相同。无法以返回 型别作为重载函数的区分标准 8、 equals与的区别 比较的是变量(栈)内存中存放的对象的(堆)内存地址用来判断两个对象的地址是否相同即是 否是指相同一个对象。比较的是真正意义上的指针操作。 1、比较的是操作符两端的操作数是否是同一个对象。 2、两边的操作数必须是同一类型的可以是 父子类之间才能编译通过。 3、比较的是地址如果是具体的阿拉伯数字的比较值相等则为 true如 int a10 与 long b10L 与 double c10.0都是相同的为true因为他们都指向地 址为10的堆。 equals equals用来比较的是两个对象的内容是否相等由于所有的类都是继承自java.lang.Object类的所 以适用于所有对象如果没有对该方法进行覆盖的话调用的仍然是Object类中的方法而Object 中的equals方法返回的却是的判断。 总结 所有比较是否相等时都是用equals 并且在对常量相比较时把常量写在前面因为使用object的 equals object可能为null 则空指针 在阿里的代码规范中只使用equals 阿里插件默认会识别并可以快速修改推荐安装阿里插件来 排查老代码使用“”替换成equals 9、 Hashcode的作用 java的集合有两类一类是List还有一类是Set。前者有序可重复后者无序不重复。当我们在set 中插入的时候怎么判断是否已经存在该元素呢可以通过equals方法。但是如果元素太多用这样 的方法就会比较满。 于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域每 个对象可以计算出一个哈希码可以将哈希码分组每组分别对应某个存储区域根据一个对象的 哈希码就可以确定该对象应该存储的那个区域。 hashCode方法可以这样理解它返回的就是根据对象的内存地址换算出的一个值。这样一来当 集合要添加新的元素时先调用这个元素的hashCode方法就一下子能定位到它应该放置的物理 位置上。如果这个位置上没有元素它就可以直接存储在这个位置上不用再进行任何比较了如 果这个位置上已经有元素了就调用它的equals方法与新元素进行比较相同的话就不存了不相 同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了几乎只需要一两次。 10、String、String StringBuffer 和 StringBuilder 的区别是什 么? String是只读字符串它并不是基本数据类型而是一个对象。从底层源码来看是一个final类型的 字符数组所引用的字符串不能被改变一经定义无法再增删改。每次对String的操作都会生成 新的String对象 private final char value[];每次操作 隐式在堆上new了一个跟原字符串相同的StringBuilder对象再调用append方法 拼 接后面的字符。 StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类从 AbstractStringBuilder抽象类中我们可以看到 /** * The value is used for character storage. */ char[] value;他们的底层都是可变的字符数组所以在进行频繁的字符串操作时建议使用StringBuffer和 StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁所 以是线程安全的。StringBuilder 并没有对方法进行加同步锁所以是非线程安全的。 11、ArrayList和linkedList的区别 Array数组是基于索引(index)的数据结构它使用索引在数组中搜索和读取数据是很快的。 Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大因为这需要重排数组中的所有 数据, (因为删除数据以后, 需要把后面所有的数据前移) 缺点: 数组初始化必须指定初始化的长度, 否则报错 例如: int[] a new int[4];//推介使用int[] 这种方式初始化 int c[] {23,43,56,78};//长度4索引范围[0,3]List—是一个有序的集合可以包含重复的元素提供了按索引访问的方式它继承Collection。 List有两个重要的实现类ArrayList和LinkedList ArrayList: 可以看作是能够自动增长容量的数组 ArrayList的toArray方法返回一个数组 ArrayList的asList方法返回一个列表 ArrayList底层的实现是Array, 数组扩容实现 LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于 ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。 12、 HashMap和HashTable的区别 1、两者父类不同 HashMap是继承自AbstractMap类而Hashtable是继承自Dictionary类。不过它们都实现了同时 实现了map、Cloneable可复制、Serializable可序列化这三个接口。 2、对外提供的接口不同 Hashtable比HashMap多提供了elments() 和contains() 两个方法。 elments() 方法继承自 Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。 contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实 上contansValue() 就只是调用了一下contains() 方法。 3、对null的支持不同 Hashtablekey和value都不能为null。 HashMapkey可以为null但是这样的key只能有一个因为必须保证key的唯一性可以有多个 key值对应的value为null。 4、安全性不同 HashMap是线程不安全的在多线程并发的环境下可能会产生死锁等问题因此需要开发人员自 己处理多线程的安全问题。 Hashtable是线程安全的它的每个方法上都有synchronized 关键字因此可直接用于多线程中。 虽然HashMap是线程不安全的但是它的效率远远高于Hashtable这样设计是合理的因为大部 分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。 ConcurrentHashMap虽然也是线程安全的但是它的效率比Hashtable要高好多倍。因为 ConcurrentHashMap使用了分段锁并不对整个数据进行锁定。 5、初始容量大小和每次扩充容量大小不同 6、计算hash值的方法不同 13、 Collection包结构与Collections的区别 Collection是集合类的上级接口子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、 Set Collections是集合类的一个帮助类 它包含有各种有关集合操作的静态多态方法用于实现对各种 集合的搜索、排序、线程安全化等操作。此类不能实例化就像一个工具类服务于Java的 Collection框架。 14、 Java的四种引用强弱软虚 强引用 强引用是平常中使用最多的引用强引用在程序内存不足OOM的时候也不会被回收使用 方式 String str new String(str); System.out.println(str);软引用 软引用在程序内存不足时会被回收使用方式 // 注意wrf这个引用也是强引用它是指向SoftReference这个对象的 // 这里的软引用指的是指向new String(str)的引用也就是SoftReference类中T SoftReferenceString wrf new SoftReferenceString(new String(str));可用场景 创建缓存的时候创建的对象放进缓存中当内存不足时JVM就会回收早先创建 的对象。 弱引用 弱引用就是只要JVM垃圾回收器发现了它就会将之回收使用方式 WeakReferenceString wrf new WeakReferenceString(str);可用场景 Java源码中的 java.util.WeakHashMap 中的 key 就是使用弱引用我的理解就是 一旦我不需要某个引用JVM会自动帮我处理它这样我就不需要做其它操作。 虚引用 虚引用的回收机制跟弱引用差不多但是它被回收之前会被放入 ReferenceQueue 中。注意 哦其它引用是被JVM回收后才被传入 ReferenceQueue 中的。由于这个机制所以虚引用大多 被用于引用销毁前的处理工作。还有就是虚引用创建的时候必须带有 ReferenceQueue 使用例子 PhantomReferenceString prf new PhantomReferenceString(new String(str), new ReferenceQueue());可用场景 对象销毁前的一些操作比如说资源释放等。 Object.finalize() 虽然也可以做这 类动作但是这个方式即不安全又低效 15、 泛型常用特点 “泛型” 意味着编写的代码可以被不同类型的对象所重用。 泛型”顾名思义“泛指的类型”。我们提供了泛指的概念但具体执行的时候却可以有具体的规则 来约束比如我们用的非常多的ArrayList就是个泛型类ArrayList作为集合可以存放各种元素如 Integer, String自定义的各种类型等但在我们使用的时候通过具体的规则来约束如我们可以约 束集合中只存放Integer类型的元素如 ListInteger iniData new ArrayList()使用泛型的好处 以集合来举例使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合如整 型集合类浮点型集合类字符串集合类我们可以定义一个集合来存放整型、浮点型字符串型 数据而这并不是最重要的因为我们只要把底层存储设置了Object即可添加的数据全部都可向 上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。 16、Java创建对象有几种方式 java中提供了以下四种创建对象的方式: new创建新对象通过反射机制采用clone机制通过序列化机制 17、有没有可能两个不相等的对象有相同的hashcode 有可能.在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.当hash冲突产生时,一般 有以下几种方式来处理:拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链 表被分配到同一个索引上的多个节点可以用这个单向链表进行存储. 开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总 能找到,并将记录存入再哈希:又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个….等哈希函数 计算地址,直到无冲突. 18、深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指 向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍. 19、final有哪些用法? final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了: 被final修饰的类不可以被继承被final修饰的方法不可以被重写被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被final修饰的方法,JVM会尝试将其内联,以提高运行效率被final修饰的常量,在编译阶段会存入常量池中. 除此之外,编译器对final域要遵守的两个重排序规则更好: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作 之间不能重排序 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不 能重排序. 20、static都有哪些用法? 所有的人都知道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/ 方法都属于类的静态资源,类实例所共享. 除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作: public calss PreCache{static{//执行相关操作} }此外static也多用于修饰内部类,此时称之为静态内部类. 最后一种用法就是静态导包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用 来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名,比如: import static java.lang.Math.*; public class Test{public static void main(String[] args){//System.out.println(Math.sin(20));传统做法System.out.println(sin(20));} }21、3*0.1 0.3返回值是什么 false,因为有些浮点数不能完全精确的表示出来. 22、aab与ab有什么区别吗? 操作符会进行隐式自动类型转换,此处ab隐式的将加操作的结果类型强制转换为持有结果的类 型,而aab则不会自动进行类型转换.如 byte a 127; byte b 127; b a b; // 报编译错误:cannot convert from int to byte b a;以下代码是否有错,有的话怎么改 short s1 1; s1 s1 1;有错误.short类型在进行运算时会自动提升为int类型,也就是说 s11 的运算结果是int类型,而s1是 short类型,此时编译器会报错. 正确写法 short s1 1; s1 1;操作符会对右边的表达式结果强转匹配左边的数据类型,所以没错. 23、try catch finallytry里有returnfinally还执行么 执行并且finally的执行早于try里面的return 结论 不管有木有出现异常finally块中代码都会执行当try和catch中有return时finally仍然会执行finally是在return后面的表达式运算后执行的此时并没有返回运算后的值而是先把要返回的 值保存起来管finally中的代码怎么样返回的值都不会改变任然是之前保存的值所以函数 返回值是在finally执行前确定的finally中最好不要包含return否则程序会提前退出返回值不是try或catch中保存的返回值。 24、 Excption与Error包结构 Java可抛出(Throwable)的结构分为三种类型被检查的异常(CheckedException)运行时异常 (RuntimeException)错误(Error)。 1、运行时异常 定义:RuntimeException及其子类都被称为运行时异常。 特点:Java编译器不会检查它。也就是说当程序中可能出现这类异常时倘若既没有通过throws 声明抛出它也没有用try-catch语句捕获它还是会编译通过。例如除数为零时产生的 ArithmeticException异常数组越界时产生的IndexOutOfBoundsException异常fail-fast机制产 生的ConcurrentModificationException异常java.util包下面的所有的集合类都是快速失败 的“快速失败”也就是fail-fast它是Java集合的一种错误检测机制。当多个线程对集合进行结构上 的改变的操作时有可能会产生fail-fast机制。记住是有可能而不是一定。例如假设存在两个线 程线程1、线程2线程1通过Iterator在遍历集合A中的元素在某个时候线程2修改了集合A的 结构是结构上面的修改而不是简单的修改集合元素的内容那么这个时候程序就会抛出 ConcurrentModificationException 异常从而产生fail-fast机制这个错叫并发修改异常。Failsafejava.util.concurrent包下面的所有的类都是安全失败的在遍历过程中如果已经遍历的数 组上的内容变化了迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组 上的内容发生了变化则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的 表现。ConcurrentHashMap的弱一致性主要是为了提升效率是一致性与效率之间的一种权衡。 要成为强一致性就得到处使用锁甚至是全局锁这就与Hashtable和同步的HashMap一样 了。等都属于运行时异常。 常见的五种运行时异常 ClassCastException类转换异常 IndexOutOfBoundsException数组越界 NullPointerException空指针异常 ArrayStoreException数据存储异常操作数组是类型不一致 阿里内部资料 BufferOverflowException 2、被检查异常 定义:Exception类本身以及Exception的子类中除了运行时异常之外的其它子类都属于被检查异 常。 特点 : Java编译器会检查它。 此类异常要么通过throws进行声明抛出要么通过try-catch进行捕 获处理否则不能通过编译。例如CloneNotSupportedException就属于被检查异常。当通过 clone()接口去克隆一个对象而该对象对应的类没有实现Cloneable接口就会抛出 CloneNotSupportedException异常。被检查异常通常都是可以恢复的。 如 IOException FileNotFoundException SQLException 被检查的异常适用于那些不是因程序引起的错误情况比如读取文件时文件不存在引发的 FileNotFoundException 。然而不被检查的异常通常都是由于糟糕的编程引起的比如在对象 引用时没有确保对象非空而引起的NullPointerException 3、错误 定义 : Error类及其子类。 特点 : 和运行时异常一样编译器也不会对错误进行检查。 当资源不足、约束失败、或是其它程序无法继续运行的条件发生时就产生错误。程序本身无法修 复这些错误的。例如VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。 OutOfMemoryError、ThreadDeath。 Java虚拟机规范规定JVM的内存分为了好几块比如堆栈程序计数器方法区等 25、OOM你遇到过哪些情况SOF你遇到过哪些情况 OOM 1OutOfMemoryError异常 除了程序计数器外虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的 可能。 Java Heap 溢出 一般的异常信息java.lang.OutOfMemoryError:Java heap spacess。 java堆用于存储对象实例我们只要不断的创建对象并且保证GC Roots到对象之间有可达路径来 避免垃圾回收机制清除这些对象就会在对象数量达到最大堆容量限制后产生内存溢出异常。 出现这种异常一般手段是先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump出来的 堆转存快照进行分析重点是确认内存中的对象是否是必要的先分清是因为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。 如果是内存泄漏可进一步通过工具查看泄漏对象到GCRoots的引用链。于是就能找到泄漏对象是 通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。 如果不存在泄漏那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。 2虚拟机栈和本地方法栈溢出 如果线程请求的栈深度大于虚拟机所允许的最大深度将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError异常 这里需要注意当栈的大小越大可分配的线程数就越少。 3运行时常量池溢出 异常信息java.lang.OutOfMemoryError:PermGenspace 如果要向运行时常量池中添加内容最简单的做法就是使用String.intern()这个Native方法。该方法 的作用是如果池中已经包含一个等于此String的字符串则返回代表池中这个字符串的String对 象否则将此String对象包含的字符串添加到常量池中并且返回此String对象的引用。由于常量 池分配在方法区内我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小从而间接 限制其中常量池的容量。 4方法区溢出 方法区用于存放Class的相关信息如类名、访问修饰符、常量池、字段描述、方法描述等。也有可 能是方法区中保存的class对象没有被及时回收掉或者class信息占用的内存超过了我们配置。 异常信息java.lang.OutOfMemoryError:PermGenspace 方法区溢出也是一种常见的内存溢出异常一个类如果要被垃圾收集器回收判定条件是很苛刻 的。在经常动态生成大量Class的应用中要特别注意这点。 SOF堆栈溢出StackOverflow StackOverflowError 的定义当应用程序递归太深而发生堆栈溢出时抛出该错误。 因为栈一般默认为1-2m一旦出现死循环或者是大量的递归调用在不断的压栈过程中造成栈容 量超过1m而导致溢出。 栈溢出的原因递归调用大量循环或死循环全局变量是否过多数组、List、map数据过大。 26、 简述线程、程序、进程的基本概念。以及他们之间关系是什么? 线程 与进程相似但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个 线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源所以系统在产生一个 线程或是在各个线程之间作切换工作时负担要比进程小得多也正因为如此线程也被称为轻 量级进程。 程序 是含有指令和数据的文件被存储在磁盘或其他的数据存储设备中也就是说程序是静态的代 码。 进程 是程序的一次执行过程是系统运行程序的基本单位因此进程是动态的。系统运行一个程序 即是一个进程从创建运行到消亡的过程。简单来说一个进程就是一个执行中的程序它在计算 机中一个指令接着一个指令地执行着同时每个进程还占有某些系统资源如 CPU 时间内存空 间文件输入输出设备的使用权等等。换句话说当程序在执行时将会被操作系统载入内存 中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的而 各线程则不一定因为同一进程中的线程极有可能会相互影响。从另一角度来说进程属于操作系 统的范畴主要是同一段时间内可以同时执行一个以上的程序而线程则是在同一程序内几乎同 时执行一个以上的程序段。 27、Java 序列化中如果有些字段不想进行序列化怎么办 对于不想进行序列化的变量使用 transient 关键字修饰。 transient 关键字的作用是阻止实例中那些用此关键字修饰的的变量序列化当对象被反序列化 时被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量不能修饰类和方 法。 28、说说Java 中 IO 流 Java 中 IO 流分为几种? 按照流的流向分可以分为输入流和输出流按照操作单元划分可以划分为字节流和字符流按照流的角色划分为节点流和处理流。 Java Io 流共涉及 40 多个类这些类看上去很杂乱但实际上很有规则而且彼此之间存在非常紧 密的联系 Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。 InputStream/Reader: 所有的输入流的基类前者是字节输入流后者是字符输入流。 OutputStream/Writer: 所有输出流的基类前者是字节输出流后者是字符输出流。 29、 Java IO与 NIO的区别 NIO即New IO这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的但实现方式不同 NIO主要用到的是块所以NIO的效率要比IO高很多。在Java API中提供了两套NIO一套是针对标 准输入输出NIO另一套就是网络编程NIO。 30、java反射的作用于原理 1、定义 反射机制是在运行时对于任意一个类都能够知道这个类的所有属性和方法对于任意个对象 都能够调用它的任意一个方法。在java中只要给定类的名字就可以通过反射机制来获得类的所 有信息。 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 2、哪里会用到反射机制 jdbc就是典型的反射 Class.forName(com.mysql.jdbc.Driver.class);//加载MySQL的驱动类这就是反射。如hibernatestruts等框架使用反射实现的。 3、反射的实现方式 第一步获取Class对象有4中方法 1Class.forName(“类的路径”) 2类名.class 3对象 名.getClass() 4基本类型的包装类可以调用包装类的Type属性来获得该包装类的Class对象 4、实现Java反射的类 1Class表示正在运行的Java应用程序中的类和接口 注意 所有获取对象的信息都需要Class类 来实现。 2Field提供有关类和接口的属性信息以及对它的动态访问权限。 3Constructor 提供关于类的单个构造方法的信息以及它的访问权限 4Method提供类或接口中某个方法的信息 5、反射机制的优缺点 优点 1能够运行时动态获取类的实例提高灵活性 2与动态编译结合 缺点 1使用反射 性能较低需要解析字节码将内存中的对象进行解析。 解决方案 1、通过setAccessible(true) 关闭JDK的安全检查来提升反射速度 2、多次创建一个类的实例时有缓存会快很多 3、 ReflectASM工具类通过字节码生成的方式加快反射速度 2相对不安全破坏了封装性因为通 过反射可以获得私有方法和属性 31、说说List,Set,Map三者的区别 List(对付顺序的好帮手) List接口存储一组不唯一可以有多个元素引用相同的对象有序 的对象Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引 用相同的对象但Key不能重复典型的Key是String类型但也可以是任何对象。 32 、Object 有哪些常用方法大致说一下每个方法的含义 下面是对应方法的含义。 clone 方法 保护方法实现对象的浅复制只有实现了 Cloneable 接口才可以调用该方法否则抛出 CloneNotSupportedException 异常深拷贝也需要实现 Cloneable同时其成员变量为引用类型的也需要实现 Cloneable然后重写 clone 方法。 finalize 方法 该方法和垃圾收集器有关系判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。 equals 方法 该方法使用频率非常高。一般 equals 和 是不一样的但是在 Object 中两者是一样的。子类一般都要重写这个方法。 hashCode 方法 该方法用于哈希查找重写了 equals 方法一般都要重写 hashCode 方法这个方法在一些具有哈希功能的 Collection 中用到。 wait 方法 配合 synchronized 使用wait 方法就是使当前线程等待该对象的锁当前线程必须是该对象的拥有者也就是具有该对象的锁。wait() 方法一直等待直到获得锁或者被中断。wait(long timeout)设定一个超时间隔如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态直到以下事件发生。 其他线程调用了该对象的 notify 方法其他线程调用了该对象的 notifyAll 方法其他线程调用了 interrupt 中断该线程时间间隔到了。 此时该线程就可以被调度了如果是被中断的话就抛出一个 InterruptedException 异常。 notify 方法 配合 synchronized 使用该方法唤醒在该对象上等待队列中的某个线程同步队列中的线程是给抢占 CPU 的线程等待队列中的线程指的是等待唤醒的线程。 notifyAll 方法 配合 synchronized 使用该方法唤醒在该对象上等待队列中的所有线程。 总结 只要把上面几个方法熟悉就可以了toString 和 getClass 方法可以不用去讨论它们。该题目考察的是对 Object 的熟悉程度平时用的很多方法并没看其定义但是也在用比如说wait() 方法 equals() 方法等。 33、Java 创建对象有几种方式 这题目看似简单要好好回答起来还是有点小复杂的我们来看看到底有哪些方式可以创建对象 使用 new 关键字这也是我们平时使用的最多的创建对象的方式示例 User usernew User();使用反射方式创建对象使用 newInstance()但是得处理两个异常 InstantiationException、IllegalAccessException User userUser.class.newInstance(); Object object(Object)Class.forName(java.lang.Object).newInstance()使用 clone 方法前面题目中 clone 是 Object 的方法所以所有对象都有这个方法。 使用反序列化创建对象调用 ObjectInputStream 类的 readObject() 方法。 我们反序列化一个对象JVM 会给我们创建一个单独的对象。JVM 创建对象并不会调用任何构造函数。一个对象实现了 Serializable 接口就可以把对象写入到文件中并通过读取文件来创建对 象。 总结 创建对象的方式关键字new、反射、clone 拷贝、反序列化。 34、获取一个类Class对象的方式有哪些 搞清楚类对象和实例对象但都是对象。 第一种通过类对象的 getClass() 方法获取细心点的都知道这个 getClass 是 Object 类里面的方法。 UserusernewUser(); //clazz就是一个User的类对象 Class?clazzuser.getClass();第二种通过类的静态成员表示每个类都有隐含的静态成员 class。 //clazz就是一个User的类对象Class?clazzUser.class;第三种通过 Class 类的静态方法 forName() 方法获取。 Class?clazzClass.forName(com.tian.User);35、ArrayList 和 LinkedList 的区别有哪些 ArrayList 优点ArrayList 是实现了基于动态数组的数据结构因为地址连续一旦数据存储好了查询操作效率会比较高在内存里是连着放的。 缺点因为地址连续ArrayList 要移动数据所以插入和删除操作效率比较低。 LinkedList 优点LinkedList 基于链表的数据结构地址是任意的所以在开辟内存空间的时候不需要等一个连续的地址。对于新增和删除操作LinkedList 比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。 缺点因为 LinkedList 要移动指针所以查询操作性能比较低。 适用场景分析 当需要对数据进行对随机访问的时候选用 ArrayList。 当需要对数据进行多次增加删除修改时采用 LinkedList。 36、用过 ArrayList 吗说一下它有什么特点 Java 集合框架中的一种存放相同类型的元素数据是一种变长的集合类基于定长数组实现当加入数据达到一定程度后会实行自动扩容即扩大数组大小。 底层是使用数组实现添加元素。 如果 add(o)添加到的是数组的尾部如果要增加的数据量很大应该使用 ensureCapacity()方法该方法的作用是预先设置 ArrayList 的大小这样可以大大提高初始化速度。 如果使用 add(int,o)添加到某个位置那么可能会挪动大量的数组元素并且可能会触发扩容机制。 高并发的情况下线程不安全。多个线程同时操作 ArrayList会引发不可预知的异常或错误。 ArrayList 实现了 Cloneable 接口标识着它可以被复制。注意ArrayList 里面的 clone() 复制其实是浅复制。 37、有数组了为什么还要搞个 ArrayList 呢 通常我们在使用的时候如果在不明确要插入多少数据的情况下普通数组就很尴尬了因为你不知道需要初始化数组大小为多少而 ArrayList 可以使用默认的大小当元素个数到达一定程度 后会自动扩容。 可以这么来理解我们常说的数组是定死的数组ArrayList 却是动态数组。 38、说说什么是 fail-fast fail-fast 机制是 Java 集合Collection中的一种错误机制。当多个线程对同一个集合的内容进行操作时就可能会产生 fail-fast 事件。 例如当某一个线程 A 通过 iterator 去遍历某集合的过程中若该集合的内容被其他线程所改变 了那么线程 A 访问集合时就会抛出 ConcurrentModificationException 异常产生 fail-fast 事件。这里的操作主要是指 add、remove 和 clear对集合元素个数进行修改。 可以这么理解在遍历之前把 modCount 记下来 expectModCount后面 expectModCount 去和 modCount 进行比较如果不相等了证明已并发了被修改了于是抛出 ConcurrentModificationException 异常。 39、说说Hashtable 与 HashMap 的区别 Hashtable 是线程安全推荐使用 HashMap 代替 Hashtable如果需要线程安全高并发的话推荐使用 ConcurrentHashMap 代替 Hashtable。 这个回答完了面试官可能会继续问HashMap 是线程不安全的那么在需要线程安全的情况下还要考虑性能有什么解决方式 这里最好的选择就是 ConcurrentHashMap 了但面试官肯定会叫你继续说一下 ConcurrentHashMap 数据结构以及底层原理等。 40、HashMap 中的 key 我们可以使用任何类作为 key 吗 如果类重写了 equals 方法它也应该重写 hashCode 方法。 类的所有实例需要遵循与 equals 和 hashCode 相关的规则。 如果一个类没有使用 equals你不应该在 hashCode 中使用它。 咱们自定义 key 类的最佳实践是使之为不可变的这样hashCode 值可以被缓存起来拥有更好的性能。不可变的类也可以确保 hashCode 和 equals 在未来不会改变这样就会解决与可变相关的问题了。 41、HashMap 的长度为什么是 2 的 N 次方呢 为了能让 HashMap 存数据和取数据的效率高尽可能地减少 hash 值的碰撞也就是说尽量把数据能均匀的分配每个链表或者红黑树长度尽量相等。 取余%操作中如果除数是 2 的幂次则等价于与其除数减一的与操作也就是说hash % length hash (length - 1)的前提是 length 是 2 的 n 次方。并且采用二进制位操作相对于%能够提高运算效率。 这就是为什么 HashMap 的长度需要 2 的 N 次方了。 42、HashMap 与 ConcurrentHashMap 的异同 都是 key-value 形式的存储数据HashMap 是线程不安全的ConcurrentHashMap 是 JUC 下的线程安全的HashMap 底层数据结构是数组 链表JDK 1.8 之前。JDK 1.8 之后是数组 链表 红黑树。当链表中元素个数达到 8 的时候链表的查询速度不如红黑树快链表会转为红黑树红 黑树查询速度快HashMap 初始数组大小为 16默认当出现扩容的时候以 0.75 * 数组大小的方式进行扩容ConcurrentHashMap 在 JDK 1.8 之前是采用分段锁来现实的 Segment HashEntrySegment 数组大小默认是 162 的 n 次方JDK 1.8 之后采用 Node CAS Synchronized 来保证并发安全进行实现。 43、红黑树有哪几个特征 每个节点是黑色或者红色根节点是黑色每个叶子节点都是黑色指向空的叶子节点如果一个叶子节点是红色那么其子节点必须都是黑色的从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 44、说说你平时是怎么处理 Java 异常的 try-catch-finally try 块负责监控可能出现异常的代码catch 块负责捕获可能出现的异常并进行处理finally 块负责清理各种资源不管是否出现异常都会执行其中 try 块是必须的catch 和 finally 至少存在一个标准异常处理流程 45、说一下 atomic 的原理 Atomic包中的类基本的特性就是在多线程环境下当有多个线程同时对单个包括基本类型及引用类型变量进行操作时具有排他性即当多个线程同时对该变量的值进行更新时仅有一个线程能成功而未成功的线程可以向自旋锁一样继续尝试一直等到执行成功。 46、synchronized 和 ReentrantLock 区别是什么 synchronized是和if、else、for、while一样的关键字ReentrantLock是类这是二者的本质区别。 ReentrantLock可以对获取锁的等待时间进行设置这样就避免了死锁ReentrantLock可以获取各种锁的信息ReentrantLock可以灵活地实现多路通知 另外二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁synchronized操作的应该是对象头中mark word。 47、在 Queue 中 poll()和 remove()有什么区别 poll() 和 remove() 都是从队列中取出一个元素但是 poll() 在获取元素失败的时候会返回空但是 remove() 失败的时候会抛出异常。 48、如何实现数组和 List 之间的转换 List转换成为数组调用ArrayList的toArray方法。 数组转换成为List调用Arrays的asList方法。 49、 如何决定使用 HashMap 还是 TreeMap 对于在Map中插入、删除和定位元素这类操作HashMap是最好的选择。然而假如你需要对一个有序的key集合进行遍历TreeMap是更好的选择。基于你的collection的大小也许向HashMap中添加元素会更快将map换为TreeMap进行有序key的遍历。 50、BIO、NIO、AIO 有什么区别 BIOBlock IO 同步阻塞式 IO就是我们平常使用的传统 IO它的特点是模式简单使用方便并发处理能力低。 NIONew IO 同步非阻塞 IO是传统 IO 的升级客户端和服务器端通过 Channel通道通讯实现了多路复用。 AIOAsynchronous IO 是 NIO 的升级也叫 NIO2实现了异步非堵塞 IO 异步 IO 的操作基于事件和回调机制。 51、接口和抽象类有什么区别 实现抽象类的子类使用 extends 来继承接口必须使用 implements 来实现接口。构造函数抽象类可以有构造函数接口不能有。main 方法抽象类可以有 main 方法并且我们能运行它接口不能有 main 方法。实现数量类可以实现很多个接口但是只能继承一个抽象类。访问修饰符接口中的方法默认使用 public 修饰抽象类中的方法可以是任意访问修饰符。 52、抽象类必须要有抽象方法吗 不需要抽象类不一定非要有抽象方法。 普通类不能包含抽象方法抽象类可以包含抽象方法。 抽象类不能直接实例化普通类可以直接实例化。 53、抽象类能使用 final 修饰吗 不能定义抽象类就是让其他类继承的如果定义为 final 该类就不能被继承这样彼此就会产生矛盾所以 final 不能修饰抽象类 54、 String 类的常用方法都有那些 indexOf()返回指定字符的索引。 charAt()返回指定索引处的字符。 replace()字符串替换。 trim()去除字符串两端空白。 split()分割字符串返回一个分割后的字符串数组。 getBytes()返回字符串的 byte 类型数组。 length()返回字符串长度。 toLowerCase()将字符串转成小写字母。 toUpperCase()将字符串转成大写字符。 substring()截取字符串。 equals()字符串比较。 55、如何将字符串反转 使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。 56、java 中的 Math.round(-1.5) 等于多少 等于 -1因为在数轴上取值时中间值0.5向右取整所以正 0.5 是往上取整负 0.5 是直接舍弃 57、两个对象的 hashCode()相同则 equals()也一定为 true对吗 不对两个对象的 hashCode()相同equals()不一定 true。 代码解读很显然“通话”和“重地”的 hashCode() 相同然而 equals() 则为 false因为在散列表中hashCode()相等即两个键值对的哈希值相等然而哈希值相等并不一定能得出键值对相等。 58、final 在 java 中有什么作用 final 修饰的类叫最终类该类不能被继承。 final 修饰的方法不能被重写。 final 修饰的变量叫常量常量必须初始化初始化之后值就不能被修改。 59、JDK 和 JRE 有什么区别 JDKJava Development Kit 的简称java 开发工具包提供了 java 的开发环境和运行环境。 JREJava Runtime Environment 的简称java 运行环境为 java 的运行提供了所需环境。 60、并行和并发有什么区别 并行是指两个或者多个事件在同一时刻发生而并发是指两个或多个事件在同一时间间隔发生。 并行是在不同实体上的多个事件并发是在同一实体上的多个事件。 在一台处理器上“同时”处理多个任务在多台处理器上同时处理多个任务。如hadoop分布式集群。 所以并发编程的目标是充分的利用处理器的每一个核以达到最高的处理性能。 61、守护线程是什么 守护线程即daemon thread是个服务线程准确地来说就是服务其他的线程。 62、创建线程有哪几种方式 ①. 继承Thread类创建线程类 ②. 通过Runnable接口创建线程类 ③. 通过Callable和Future创建线程 63、说一下 runnable 和 callable 有什么区别 Runnable接口中的run()方法的返回值是void它做的事情只是纯粹地去执行run()方法中的代码而已 Callable接口中的call()方法是有返回值的是一个泛型和Future、FutureTask配合可以用来获取异步执行的结果。 64、线程有哪些状态 线程通常都有五种状态创建、就绪、运行、阻塞和死亡。 65、sleep() 和 wait() 有什么区别 sleep()方法是线程类Thread的静态方法让调用线程进入睡眠状态让出执行机会给其他线程等到休眠时间结束后线程进入就绪状态和其他线程一起竞争cpu的执行时间。因为sleep() 是static静态的方法他不能改变对象的机锁当一个synchronized块中调用了sleep() 方法线程虽然进入休眠但是对象的机锁没有被释放其他线程依然无法访问这个对象。 wait()wait()是Object类的方法当一个线程执行到wait方法时它就进入到一个和该对象相关的等待池同时释放对象的机锁使得其他线程能够访问可以通过notifynotifyAll方法来唤醒等待的线程。 66、notify()和 notifyAll()有什么区别 如果线程调用了对象的 wait()方法那么线程便会处于该对象的等待池中等待池中的线程不会去竞争该对象的锁。当有线程调用了对象的 notifyAll()方法唤醒所有 wait 线程或 notify()方法只随机唤醒一个 wait 线程被唤醒的的线程便会进入该对象的锁池中锁池中的线程会去竞争该对象锁。也就是说调用了notify后只要一个线程会由等待池进入锁池而notifyAll会将该对象等待池内的所有线程移动到锁池中等待锁竞争。优先级高的线程竞争到对象锁的概率大假若某线程没有竞争到该对象锁它还会留在锁池中唯有线程再次调用 wait()方法它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行直到执行完了 synchronized 代码块它会释放掉该对象锁这时锁池中的线程会继续竞争该对象锁。 67、线程的 run()和 start()有什么区别 start()方法来启动一个线程真正实现了多线程运行。这时无需等待run方法体代码执行完毕可以直接继续执行下面的代码 这时此线程是处于就绪状态 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态 这里方法run()称为线程体它包含了要执行的这个线程的内容 Run方法运行结束 此线程终止。然后CPU再调度其它线程。 run()方法是在本线程里的只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码所以执行路径还是只有一条根本就没有线程的特征所以在多线程执行时要使用start()方法而不是run()方法。 68、创建线程池有哪几种方式 ①. newFixedThreadPool(int nThreads) 创建一个固定长度的线程池每当提交一个任务就创建一个线程直到达到线程池的最大数量这时线程规模将不再变化当线程发生未预期的错误而结束时线程池会补充一个新的线程。 ②. newCachedThreadPool() 创建一个可缓存的线程池如果线程池的规模超过了处理需求将自动回收空闲线程而当需求增加时则可以自动添加新线程线程池的规模不存在任何限制。 ③. newSingleThreadExecutor() 这是一个单线程的Executor它创建单个工作线程来执行任务如果这个线程异常结束会创建一个新的来替代它它的特点是能确保依照任务在队列中的顺序来串行执行。 ④. newScheduledThreadPool(int corePoolSize) 创建了一个固定长度的线程池而且以延迟或定时的方式来执行任务类似于Timer。 69、线程池都有哪些状态 线程池有5种状态Running、ShutDown、Stop、Tidying、Terminated。 线程池各个状态切换框架图 70、线程池中 submit()和 execute()方法有什么区别 接收的参数不一样 submit有返回值而execute没有 submit方便Exception处理 71、在 java 程序中怎么保证多线程的运行安全 原子性提供互斥访问同一时刻只能有一个线程对数据进行操作atomic,synchronized 可见性一个线程对主内存的修改可以及时地被其他线程看到synchronized,volatile 有序性一个线程观察其他线程中的指令执行顺序由于指令重排序该观察结果一般杂乱无序happens-before原则。 72、多线程锁的升级原理是什么 在Java中锁共有4种状态级别从低到高依次为无状态锁偏向锁轻量级锁和重量级锁状态这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。 锁升级的图示过程 73、什么是死锁 死锁是指两个或两个以上的进程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用它们都将无法推进下去。 74、怎么防止死锁 死锁的四个必要条件 互斥条件进程对所分配到的资源不允许其他进程进行访问若其他进程访问该资源只能等待直至占有该资源的进程使用完成后释放该资源 请求和保持条件进程获得一定的资源之后又对其他资源发出请求但是该资源可能被其他进程占有此事请求阻塞但又对自己获得的资源保持不放 不可剥夺条件是指进程已获得的资源在未完成使用之前不可被剥夺只能在使用完后自己释放 环路等待条件是指进程发生死锁后若干进程之间形成一种头尾相接的循环等待资源关系 75、ThreadLocal 是什么有哪些使用场景 线程局部变量是局限于线程内部的变量属于线程自身所有不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量是一种实现线程安全的方式。但是在管理环境下如 web 服务器使用线程局部变量的时候要特别小心在这种情况下工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放Java 应用就存在内存泄露的风险。 76、说一下 synchronized 底层实现原理 synchronized可以保证方法或者代码块在运行时同一时刻只有一个方法可以进入到临界区同时它还可以保证共享变量的内存可见性。 Java中每一个对象都可以作为锁这是synchronized实现同步的基础 普通同步方法锁是当前实例对象静态同步方法锁是当前类的class对象同步方法块锁是括号里面的对象 77、synchronized 和 volatile 的区别是什么 volatile本质是在告诉jvm当前变量在寄存器工作内存中的值是不确定的需要从主存中读取 synchronized则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞住。volatile仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的。volatile仅能实现变量的修改可见性不能保证原子性而synchronized则可以保证变量的修改可见性和原子性。volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞。volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化。 78、synchronized 和 Lock 有什么区别 首先synchronized是java内置关键字在jvm层面Lock是个java类synchronized无法判断是否获取锁的状态Lock可以判断是否获取到锁synchronized会自动释放锁(a 线程执行完同步代码会释放锁 b 线程执行过程中发生异常会释放锁)Lock需在finally中手工释放锁unlock()方法释放锁否则容易造成线程死锁用synchronized关键字的两个线程1和线程2如果当前线程1获得锁线程2线程等待。如果线程1阻塞线程2则会一直等待下去而Lock锁就不一定会等待下去如果尝试获取不到锁线程可以不用一直等待就结束了synchronized的锁可重入、不可中断、非公平而Lock锁可重入、可判断、可公平两者皆可Lock锁适合大量同步的代码的同步问题synchronized锁适合代码少量的同步问题。 79、什么是 java 序列化什么情况下需要序列化 简单说就是为了保存在内存中的各种对象的状态也就是实例变量不是方法并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states但是Java给你提供一种应该比你自己好的保存对象状态的机制那就是序列化。 什么情况下需要序列化 a当你想把的内存中的对象状态保存到一个文件中或者数据库中时候 b当你想用套接字在网络上传送对象的时候 c当你想通过RMI传输对象的时候
http://www.hkea.cn/news/14303919/

相关文章:

  • 网站开发遵循的标准或规范58同城淄博网站建设
  • 网站建设管理权限广州番禺区邮编
  • 网站建设综合实训心得体会网站后台管理系统有哪些
  • 做网站安全维护是什么东东开公司需要什么手续和证件
  • 群晖建设网站国外网站 图片
  • 德州网站建设德州软件app开发公司哪家好
  • 分析竞争对手网站dedecms免费网站模板
  • 用户登录优化大师tv版
  • 微信上打开连接的网站怎么做的宜家设计装修怎么收费
  • 嘉兴网站建设定制网站福州销售网站设计企业
  • seo网站关键词优化快速官网我想自己做一个网站
  • 做淘宝的货源网站wordpress模板 更换
  • 国外销售网站网络营销推广方法有哪几种
  • 外贸网站建设方法需要建设网站的
  • 用pdf怎么做电子书下载网站成都cim软件公司
  • 高性能网站建设进阶指南pdfdw做网站的导航栏
  • 网站建设一定要买数据盘吗wordpress能用一个数据库
  • 网站备案后有什么好处wordpress好用的编辑器插件
  • 做代练网站能备案项目网络图最早开始时间
  • 关于网站建设新闻天津智能网站建设哪家好
  • 网站建设流程包括网站上的漂浮怎么做
  • 山西省建设厅执业资格注册中心网站财税公司怎么找客源
  • 河南网站制作公司哪家好上海网站建设多少
  • 网站虚拟主机共享网站建设安全需求
  • 做网站时网页中格式对不齐怎么办权威发布李建
  • 安丘网站建设aqfeifan网站建设的销售好做吗
  • 网站建设数据库怎么传送福建优化seo
  • 仿租号网站源码网站开发wordpress 简单
  • 四平网站建设404页面对网站的好处及设置方法官网站内优化怎么做 2018
  • 做网站6000左右的电脑html5手机网站下载