互联网公司面试题

北京邦利德网络科技有限公司

  1. String、StringBuffer 和 stringBullder 之间的区别。

执行速度:StringBuilder>StringBuffer>String

  • String 字符串常量
  • StringBuffer 字符串变量(线程安全) 多线程
  • StringBuilder 字符串变量(线程不安全) 单线程 JDK5.0后新增
  1. 说出 Arraylist,Vector, LinkedList 的存储性能和特性。
  • ArrayList、Vector 数组方式存储数据,允许直接按序号索引, 索引快,插入删除慢
  • Vector由于使用了synchronized修饰,通常性能较ArrayList较差
  • LinkedList 双向链表方式存储数据,按序号索引数据需要前向或后向遍历,插入数据时只需记录本项的前后项即可,索引慢,插入删除快

同步性

  • Vector是线程安全的
  • ArrayList是线程不安全的 数据增长
  • Vector默认增长为原来的的一倍
  • ArrayList却是原来的一半
  1. HashMap 和 Hashtable 的区别。

都实现了Map接口,主要区别有:线程安全性、同步,以及速度。

  1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

  1. HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
  2. 哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模:

int hash = hash(k);
int i = indexFor(hash, table.length);
   
static int hash(Object x) {
  int h = x.hashCode();

  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}
static int indexFor(int h, int length) {
  return h & (length-1);
}

要注意的一些重要术语:

  1. sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
  2. Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
  3. 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。
  • 我们能否让HashMap同步?

HashMap可以通过下面的语句进行同步:

Map m = Collections.synchronizeMap(hashMap);

final, finally, flnalize 的区別。

  • final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
  • finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
  • finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
  1. sleep()和 wait 有什么区别?

sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

补充:可能不少人对什么是进程,什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源。当然,也不是线程越多,程序的性能就越好,因为线程之间的调度和 切换也会浪费CPU时间。时下很时髦的Node.js就采用了单线程异步I/O的工作模式。

sleep是Thread类的方法,wait是Object类中定义的方法.
Thread.sleep不会导致锁行为的改变, 如果当前线程是拥有锁的, 那么Thread.sleep不会让线程释放锁.
Thread.sleep和Object.wait都会暂停当前的线程. OS会将执行时间分配给其它线程. 区别是, 调用wait后,需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间.

  1. Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

7.try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的code会不会被执行,什么时候执行,在return前还是后?

会执行,在方法返回调用者前执行。

注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。

8.两个对象值相同(x.equals(y)==true),但却可有不同的hash code ,这句话对不对?

不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

补充:关于equals和hashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,在Joshua Bloch的大作《Effective Java》(很多软件公司,《Effective Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查”参数是否为这个对象的引用”;2. 使用instanceof操作符检查”参数是否为正确的类型”;3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

9.当一个线稈逬入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

10.写一个 Singleton 出来

11.你知道排序都有哪儿种方法?请写出冒泡排序程序代码?

冒泡排序、快速排序、选择排序、插入排序、希尔排序

代码判断题,判断下面代码是否有错,有错时指出错误, 1.

public class Something {
    void doSomething() {
        private String s = "";
        int I = s.length();
    }
}
abstract class Something {
    private abstract String doSomething();
}
public class Something {
    public int addOne(final int x) {
        return ++x;
    }
}
public class Something {
    public static void main(String[] args) {
        Other o = new Other();
        new Something().addOne(o);
    }

    public void addOne(final Other o) {
        o.i++;
    }

    class Other {
        public int i;
    }
}
  1. b-tree 索引与hash索引区别
  2. 事务 死锁 如何避免
  3. Spring mvc 是线程安全的吗,servlet是线程安全的吗?

中国耀盛

StringBuffer与StringBuilder的区别有哪些?,说说你对这两个对象如何使用的。

  • String 字符串常量
  • StringBuffer 字符串变量(线程安全)
  • StringBuilder 字符串变量(非线程安全)

Hashset与HashMap有什么区别,谈谈自己的理解。

下面程序的运行结果是

String str1=”hello”;
String str2=”he”+”llo”;
System.out.println(str1==str2);

结果:true

举例说明内存溢出和内存泄露的区别

简单描述一下你对String IOC与AOP实现原理的理解。
在Sql编程时有哪些无法使用索引的地方需要注意。
列举你平时使用的持久化框架有哪些?并说下你使用的该框架有什么优点?
你是用的RPC框架有哪些?如果有使用请列出,并说明使用该款家有哪些好处?
编程:现有数组{2,4,5,6,40,11,22,90} ,请任选一种算法进行排序,写出代码大体实现。
编程:对两个变脸的数据进行交换,不使用第三方变量
编程:这里有一组数:1、1、2、3、5、8、13、21、34、55……要求计算用这个递归算法,计算出这组数的第50个数是多少?

九域互联

  1. Java中所有类的父类是什么?这个类当中有哪些方法?

java.lang.Object

  • getClass();
  • hashCode();
  • equals();
  • clone();
  • toString();
  • notify(),notifyAll();
  • wait();
  • finalize();
  1. synchronized有哪些方法?尽可能全面的描述一下。
  • 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  • 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  • 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  • 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
  1. equals与 == 的区别?
    Java中的数据类型,可分为两类:
  • 基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
    他们之间的比较,应用双等号(==),比较的是他们的值。
  • 复合数据类型(类)
    当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
    对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
  1. List与 ArrayList的区别? List是一个接口,而ListArray是一个类。 ListArray继承并实现了List。 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。 List list; //正确 list=null; List list=new List(); // 是错误的用法

  2. JVM有着怎么样的内存分区?这些分区分别用来存放什么数据? 程序计数器、堆、栈

  3. i是int型变量,是否存在i+1<i的情况?

存在,i为最大值,考察int类型的值范围

  1. 不通过构造函数是否能创建对象?可以通过哪些方式做到?
  • Clone 克隆
  • 反序列化
  • 反射机制
  • new关键字
  1. 列出两个常见的对称加密算法,以及两个常见的非对称加密算法。
  • 对称加密算法:DES AES 3DES RC2 RC4 RC5
  • 非对称加密算法:SHA1 RSA Elgamal
  1. 描述一下方法的参数和返回值类型。
public <T,C extends Collector<?>> Collection<?> transform(String s,c,Class<T>,t){

}
  1. 写一个线程安全的singleton。

答:饿汉式 懒汉式 枚举

  1. Java为每一个简单数据类型提供了一个封装类,每个基本数据类型可以封装成对象类型。

除int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。double (Double), float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean).

以int和Integer为例说明
Java中int和Integer区别如下:
1. int是基本的数据类型,默认值可以为0;
2. Integer是int的封装类,默认值为null;
3. int和Integer都可以表示某一个数值;
4. int和Integer不能够互用,因为他们两种不同的数据类型;

  1. abstract class和interface有什么区别 Abstract Class抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。 抽象类是被用来创建继承层级里子类的模板。 GenericServlet Interface接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方 法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式, 接口自身不能做任何事情。

抽象类和接口的对比

参数抽象类接口
默认的方法实现它可以有默认的方法实现接口完全是抽象的。它根本不存在方法的实现
实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器抽象类可以有构造器接口不能有构造器
与正常Java类的区别除了你不能实例化抽象类之外,它和普通Java类没有任何区别接口是完全不同的类型
访问修饰符抽象方法可以有public、protected和default这些修饰符接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法抽象方法可以有main方法并且我们可以运行它接口没有main方法,因此我们不能运行它。
多继承抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其它接口
速度它比接口速度要快接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  1. Java里面 == 与 equals的区别
  2. ArrayList和Vector的区别,HashMap和Hashtable的区别
  3. java线程有几种状态?线程同步有几种方法?
  • 状态

    • 创建(new)状态: 准备好了一个多线程的对象
    • 就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
    • 运行(running)状态: 执行run()方法
    • 阻塞(blocked)状态: 暂时停止执行, 可能将资源交给其它线程使用
    • 终止(dead)状态: 线程销毁
  • 同步

    • reentrantLock.lock()、synchronized,wait与notify\notifyall
  1. 简述servlet生命周期
  2. 进程和线程的区别是什么?
  3. Java有哪些基本数据类型,String是不是基本数据类型?
  4. 写三个你常用的js框架\插件
  5. 简述sql中outter join、inner join的区别
  6. Java里的构造器是否可以被override?
  7. 获取Class对象有哪几种方式? 1.超类Object方法getClass(); 2.Class.forName(className); 3.泛型类T.class 类、枚举、接口、注解、数组类型、原生类型的名称.class 4. ClassLoader.loadClass
  8. String 与String Buffer的区别?
  9. 转发(forward)和重定向(redirect)的区别?
  10. 分析程序最后输出结果
public class Test01 {
     public static void main(String[] args) {
            int i = 9999;  int j = 0;
            while (i > 0) {
                  i = i & (i - 1);
                   j++;
             }
            System.out.println("j=" + j);
     }
}

结果:j=8 17. JEE开发过程中有哪几种途径可以避免乱码问题(简述) 18. 描述一下 JVM加载class文件的原理机制? 19. 请简述Spring mvc 或 struts2的 工作原理(任选一种框架) 20. 如何有效处理海量数据?(关系数据库)

面试题

  1. Java 有哪些常用的包,请列出一下,并说明一下包的主要功能。
  2. java.lang包:java的核心类库,包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包。
  3. java.io包:java语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等等。
  4. java.util包:Java的实用工具类库Java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。包含如处理时间的date类,处理变成数组的Vector类,以及stack和HashTable类。
  5. java.util.zip包:实现文件压缩功能。
  6. java.lang.reflect包:提供用于反射对象的工具。
  7. java.awt.image包:处理和操纵来自于网上的图片的java工具类库。
  8. java.wat.peer包:很少在程序中直接用到,使得同一个java程序在不同的软硬件平台上运行。
  9. java.applet包:用于执行小程序的类,如Applet类。
  10. java.net包:实现网络功能的类库有Socket类、ServerSocket类。
  11. java.corba包和java.corba.orb包。
  12. java.awt.datatransfer包:处理数据传输的工具类,包括剪贴板,字符串发送器等。
  13. java.awt包:构建图形用户界面(GUI)的类库,低级绘图操作Graphics类,图形界面组件和布局管理如 Checkbox类、Container类、LayoutManger接口等,以及界面用户交互控制和事件响应,如Event类。
  14. java.awt.event包:GUI事件处理包。
  15. java.sql包:实现JDBC的类库。
  16. sun.tools.debug包:是Sun公司提供给Java用户的调试工具包,它包含各种用于调试类和接口的工具。

面试题

  1. 请列出 你知道的java关键字,并说明一下功能

  2. 你常用的有哪些java类,列出你所知道的类,并说明一下其功能

1 String,八种基本数据类型的包装类都在这个包中 2 Object:类层次结构的根类 3 Math:执行基本数学方法运算 4 StringBuffer:线程安全的可变字符序列 thread:是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程

  1. Java语言有哪些特点?列出几个并举例说明一下 共11个:简单、面向对象、分布式、健壮、安全、结构中立、可移植、解释、高性能、多线程、 动态的

面向对象的三大特征:封装 继承 多态.,抽象

  1. Java多线程实现方式 有几种,请说明一下
  • 继承Thread类;
  • 实现Runnable接口
  1. Java语言锁有几种
  2. Java的inputStream/outputStream和reader/writer的区别是什么?
  3. 简单写一个socket的服务端和客户端通讯的步骤
  4. Jsp有哪些内置对象?说一下servlet有哪些主要方法,并说明一下servlet生命周期 JSP:
  • out
  • request
  • response
  • session
  • pageContext
  • page
  • application
  • config
  • exception

Servlet

  • init()
  • service()
  • destroy()
  1. Java web开发框架熟悉哪些?你熟悉的web服务器软件有哪些?

Struts2、 spring mvc、mybatis、hibernate、guice

Apache nginx tomcat iis jetty weblogic

11.你熟悉哪些java开源项目?你知道哪些java开源项目

  • Mondrian
  • apache
  • fastjson

12.你熟悉哪些设计模式?在开发过程中用过哪些?

阅读源码的类有

  • ThreadLocal
  • Runnable
  • Thread
  • HashMap
  • HashTable
  • HashSet
  • ArrayList
  • Vector
  • LinkedList
  1. 写出3条你遵循的多线程最佳实践
    这种问题我最喜欢了,我相信你在写并发代码来提升性能的时候也会遵循某些最佳实践。以下三条最佳实践我觉得大多数Java程序员都应该遵循:
  • 给你的线程起个有意义的名字。
    这样可以方便找bug或追踪。OrderProcessor, QuoteProcessor or TradeProcessor 这种名字比 Thread-1. Thread-2 and Thread-3 好多了,给线程起一个和它要完成的任务相关的名字,所有的主要框架甚至JDK都遵循这个最佳实践。
  • 避免锁定和缩小同步的范围
    锁花费的代价高昂且上下文切换更耗费时间空间,试试最低限度的使用同步和锁,缩小临界区。因此相对于同步方法我更喜欢同步块,它给我拥有对锁的绝对控制权。
  • 多用同步类少用wait 和 notify
    首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用wait和notify很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的JDK中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。
  • 多用并发集合少用同步集合
    这是另外一个容易遵循且受益巨大的最佳实践,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。如果下一次你需要用到map,你应该首先想到用ConcurrentHashMap。我的文章Java并发集合有更详细的说明。

面试时被问到优缺
优点:能够独立发现问题,并解决问题,java基础掌握的 比较好。
缺点:Java 高并发高可用 接触的比较少,实战经验不足,缺乏大公司的工作经验,所以掌握的的知识点有些咋,但这也算是小公司工作的优点。

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22