(根据自己的理解和根据黑马资料总结—意见不统一我会写上自己的理解)

一、Java面向对象

1.面向对象都有哪些特性以及你对这些特性的理解

继承、封装、多态。(抽象)

2.public,private,protected,默认的区别

3.为什么要用clone?

实际编程中,我们会遇到这种情况,有个对象A,我们需要和对象A参数一样的对象B,并且B的改动不会影响A的值。

clone()方法是最简单最高效的手段。

4.new一个对象的过程和clone一个对象过程的区别

new操作符

执行new操作符时,首先看new后面的类型,确定内存空间。

再调用构造函数,填充对象的域,也就是对象初始化。

构造方法返回后,对象创建完毕,把引用发布到外部,利用引用操纵这个对象。

clone操作符

第一步也是分配内存。

元对象参数通过clone方法进行复制,填充新对象的域、

clone方法返回,一个新对象创建,吧新对象引用发布到外部。

5.clone对象的使用

public LinkedBinaryTree<T> clone() throws CloneNotSupportedException {
LinkedBinaryTree<T> binaryTree=(LinkedBinaryTree<T>)super.clone();//1.强转
binaryTree.setRoot((BinaryNode<T>)binaryTree.getRoot().clone());//2.设置新的深层参数克隆
return binaryTree;//返回克隆对象
}

6.浅克隆和深克隆就是浅拷贝和深拷贝

二、JavaSE语法

1.Java有没有goto语句。

goto是Java的保留字,目前版本Java没有使用。

根据James Gosling编写的The Java Programming Language一书中附录给了一个Java关键字列表,其中有goto和const,但是现在这两个关键字是无法使用的关键字,因此很多地方将其称为保留字,保留字在C程序中表示为系统中有特殊意义的单词或者单词的组合

2.&和&&的区别

&运算符有2种用法,按位与。

&&运算符是短路与运算。

3.Java中,如何跳出当前多重嵌套循环

自带标记法

here:
for(int i=;i<;i++) {
for(int j=;j<;j++) {
System.out.println(j);
break here;
}
}

boolean法标记

try catch强行跳出

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

不对,重写equals方法首先得重写hashcode方法,hashcode相同直接返回true,因为表示对象相同,如果不同,那么会继续用equals方法比较参数的值,如果相同返回true,不同返回false,利用hashcode加入比较可以提高效率。

5.是否可以继承String

String类是个final类,不可以继承String。如果要对String重用,可以用关联关系(Has-A)和依赖关系(Use-A)、

Has-A关联关系:调用String。

Use-A依赖关系:调用String内部属性。(例如用char[] 数组模拟)

6.当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,name这里到底是值传递还是引用传递?

是值传递,该值为该对象的引用。对象的属性可以在调用中被改变,但对对象引用的改变不会影响到调动着的。

7.重载(overload)和重写(override)的区别。重载的方法能否根据返回类型进行区分?

方法重载和重写都是实现多态的方式。

重载发生在一个类中,参数类型,参数个数或者二者都不一样,蚕食名字一样,叫做重载。

重写则是发生在父类和子类之间,重写要求有相同名字,相同返回类型。

8.为什么函数不能通过返回类型区分重载?(华为面试题)

调用时不能指定返回类型信息,编译器不知道你要调用那个函数、

如float max(int a,int b);

int max(int a,int b);

9.char型遍历能不能储存一个中文汉字,为什么?

可以,因为Java中使用的编码是Unicode编码,一个char类型占2个字节,所以放一个中文是没有问题的。

10.抽象类和接口有什么不同?

抽象类可以定义构造器,接口不能

抽象类可以有抽象方法和具体方法,接口只能有抽象方法

抽象类可以定义成员变量,接口这孩子能定义常量

抽象类有静态方法,接口类不能有

一个类可以继承一个抽象类,但是能实现多个接口

11.抽象方法是否可以同时是静态的,是否可同时是本地方法(native),是否可以同时被synchronized?

都不能,抽象方法需要重写,静态方法不能重写,本地方法是本地代码(如C代码实现),抽象方法没有实现,矛盾。

synchronized和方法实现同步细节有关,抽象方法不涉及实现同步细节,也是矛盾的。

12.阐述静态变量和实例变量的区别?

静态变量:被static修饰的变量,也就是类变量。不管创造多少对象,只有一个拷贝。

实例变量:必须依存一个实例,需要先创建对象然后通过对象访问它。

13.==和equals区别?

equals是方法,==是运算符

==可用于比较基本数据类型是否相等,比较对象是比较对象的地址是否相等。

equals比较对象内容是否相等

14.break和continue区别?

break用于结束一个循环

continue跳过本次循环,执行下一个循环

15.String s="Hello";s=s+" world!";这句话执行完原始对象变了没有?

没有,指向了另一个对象Hello World!,原对象处于游离状态、

16.Java中多态机制是什么?

Java中多态机制实际是一个类似父类引用指向子类对象,通过一个抽象的父类,来实现多个子类的调用,可以调用时才进行动态绑定对象。

这样的好处是不用改变引用,只需要改变引用的对象指向即可。

三、异常处理

1.Java中异常分为哪些种类?

分为CheckedException和RuntimeException,Checked异常不处理无法编译,RuntimeException运行时异常知道处理时可以try-catch,不知道可以throw new RuntimeException()。

CheckedException例如IOException,FileNotFoundException

UnCheckedException例如ArithmaticException,IllegalArgumentException等

2.error和exception的区别

Error类和Exception类的父类都是Throwable类,他们的区别是:

Error一般是指虚拟机相关的问题,例如系统崩溃,虚拟机不足,内存空间不足,方法调用栈溢出等。

Exception表示可以处理的异常,可以捕捉并且回复,这样应该尽可能处理异常,使程序回复运行,而不应该随意终止

3.java异常处理机制

根类 Throwable

子类Error Exception

Exception中分为 ArrayIndexOutOfBoundsException,NullPointerException,ClassCastException

4.易错题

5.写出5个常见的RuntimeException

NullPointerException空指针异常

ClassNotFoundException类找不到异常

NumberFormatExcepion字符串转换异常

IndexOutOfBoundsException数组索引越界异常

IllegalArgumentException数据类型转换异常

NoClassDefFoundException未找到类定义错误

SQLExceptionSQL异常

InstantiationException实例化异常

NoSuchMethodException方法不存在异常

6.throw和throws区别

throw:在语句抛出异常,方法体内,如果出现某情况,throw一下

throws:声明方法时,方法声明时,不一定遇到这种情况,知识先抛出

7.final、finally、finalize区别

final:用于声明属性,方法和类。分别表示属性不可变,方法不可覆盖,被修饰类不可继承

finally:异常处理语句结构的一部分,表示无论运行成功与否,总是执行

finalize:Object类的一个方法,在垃圾收集器执行的时候会调用回收对象此方法,可以覆盖此方法提供垃圾手机时的其他资源回收,例如关闭文件等。

五、JavaSE常用API

1.Math.round(11.5)等于多少,Math.round(-11.5)是多少?

12和-11

四舍五入的原理是在参数上加上0.5或者向下取整

2.swith能否作用在byte上,能否作用在long上,能够作用在String上?

Java5之前,switch只能byte,short,char,int,Java5开始,可以使用Enum,Java7开始,可以使用String,long、floar等是不可以的

3.数组有没有length()方法?String有没有length方法?

数组没有length()方法,String有length()方法,JavaScript中,字符串长度是length属性

4.String,StringBuilder,StringBuffer区别?

String只是字符串,是无法改变的

StringBuffer更安全,因为各方面进行了synchronize修饰

StringBuiler更快

5.什么情况用+运算符进行字符串连接比调用StringBuffer/StringBuilder更好?(华为面试题)

实验表明,当我们使用jdk自带的javap反编译工具,可以发现无论是+还是StringBuiler,根本上都是使用的是StringBuiler进行连接

结果来说,是等效的

运行效率、资源消耗,在反编译时,我们会发现+运算符会出现大量的资源消耗,因为处于一个循环体,每个循环体都需要new出一个StringBuiler,所以消耗大量资源,

所以我们应该直接使用StringBuiler

6.请说出下面的输出

7.Java的日期时间

7.1如何获取年月日、小时分钟秒

7.2如何获得1970年1月1日0时0分0秒到现在的毫秒数?

7.3如何获取每个月最后一天?

调用ca.getActualMaximum(Calendar.Day_OF_MONTH);

7.4如何格式化日期?

SimpleDateFormat类

7.5打印昨天当前时刻?

cal.add(Cakendar.DATE,-1);

或者

LocalDateTime today=LocalDateTime.now();

today.minusDays(1);

7.6Java8日期特性?

客服日期时间实现所有缺陷。

我了解几个LocalDate类,LocalDateTime类,有plus,minus方法,

format方法,传入DateTimeFormatter.ofPattern("")

7.7吐槽Java8之前日期槽点?

(1)year与month,year必须减去1900,month必须加1

(2)Calendar,DateFormat,Date职责分开,3个都不太方便

(3)Date和Calendar属性都是可变的

六、Java的数据类型

1.Java基本数据类型有哪些,占几个字节?

8种,boolean1,byte1,char2,short2,int4,float4,double8,long8

2.String是基本数据类型吗?

String是引用类型,底层是通过char数组实现的。

3.short s1=1;s1=s1+1;有错误么?short s1=1;s1+=1有错么?

前者不正确,后者正确。对于short s1=1;s1+=1;可以正确编译,因为s1+=1相当于s1=(short)(s1+1),而前面不包含强制类型转换。

4.int和Integer有什么区别?

Java是一个近乎纯洁的面向对象的编程语言,每一个基本类型都对应一个包装类。

从Java5开始引入自动拆装箱机制,两者可以相互转换。

5.下面Integer类型输出结果是?

true和false

涉及IntegerCache,看过源码,不过多阐述

6.String类的常用方法?(略)

7.String、StringBuffer、StringBuilder的区别?(略)

8.数据类型之间的转换?

(1)调用对应包装类的方法parseXXX(String)或valueOf(其余类型)返回基本类型

(2)通过+进行连接转换

七、Java的IO

1.Java中有几种类型的流?

按照流的方向:InputStream、OutputStream

按照功能:

节点流:可以向某一个特定的地方读写数据,如FileReader

处理流:对一个已经存在的流进行包装,如BufferedReader

按照处理数据的单位:字节流和字符流

字节流:继承inputStream和outputStream

字符流:继承inputSteamReader和outputSteamWriter

2.字节流如何转换为字符流

字节输入流转字符输入流通过inputSteamReader实现,该类的构造方法可以传入inputSteam对象

字节输出流转字符输出流通过outputSteamWriter实现,该类的构造函数可以传入outputSteam对象

3.如何将一个java对象序列化到文件

能够序列化文件的类必须实现Serializable接口,该接口没有任何抽象方法,只是起到一个标记作用。

4.字节流和字符流的区别

字节流读取的时候,读到一个字节,返回一个字节,字符流使用了字节流,读到一个字节或者多个字节,(

中文对应字节GBK,GB2312是2个,在UTF-8是3个),先去查指定的编码表,能查到的字符返回,字节流

可以处理所有的类型数据,如:图片,MP3,AVI视频文件,字符流智能操作纯文本数据。字节流主要操作byte

型的数据,以byte数组为准,主要操作类就是OutputStream、InputSteam

字符流处理单元为两个字节的Unicode字符,分别操作字符,字符数组和字符串,而字节流处理单元为一个

字节,操作字节和字节数组,所以字符流是有Java虚拟机将字节转化为2个Unicode字符为单位而成的,所以对

多国语言支持也非常好,如果是音频,图片,歌曲的备份,则用字节流比较好。。

5.如何实现对象的克隆?

两种方式:

1.实现Cloneable接口并且重写Object类中的clone()方法;

2.实现Serializable接口,通过对象序列化和反序列化实现克隆,可以实现真正的深度克隆,克隆代码如下:

八、Java集合

1.HashMap排序题(某公司面试)(简单)

2.集合的安全性问题?

请问ArrayList,HashSet,HashMap是线程安全的么?如果不是我想要线程安全的集合怎么办?

只有Vector和HashTable是线程安全的,源码中各自的方法,都有synchronized关键字

Collections.synchronizedCollection(c);

Collections.synchronizedList(list);

Collections.synchronizedMap(m);

Collections.synchronizedSet(s);

上面几个函数都有相应的返回值类型,传入什么函数返回什么类型,源码中实际将集合的方法填上了synchronized关键字

3.ArrayList内部是用什么实现的?

回答这个,不能只是回答皮毛。

回答内部是用Object[]实现的,接下来可以分析ArrayList的构造,增删改查等

4.并发集合和普通集合有什么区别?

并发集合常见的有ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。并发集合位于java.util.concurrent包

下,是jdk1.5之后才有的,主要作者是Doug Lea完成的。

ConcurrentHashMap是线程安全的HashMap的实现,默认分成16个segment,每个segment都是线程安全的,所以效率比较高。

5.List的三个子类的特点?

ArrayList底层结构是数组,底层查询快,增删慢。

LinkedList底层结构是链表,增删快,查询慢。

Vector底层是数组,线程安全,增删慢,查询慢。

6.List,Map,Set区别?

List和Set是存单列数据的集合,Map属于存储Key-Value的集合。List存储的数据是有序顺序,并且允许重复。Map存储的数据

是无序数据,键是不能重复的,值是可以重复的,Set存储的是无序的,不允许重复,但是元素在集合中的位置由hashcode决定

,位置是固定的。

7.实现类

List有3个实现类LinkedList,ArrayList,Vector

Map有3个实现类HashMap,HashTable,LinkedHashMap

HashMap基于hash表Map接口,非线程安全,高效,支持null和null键。

HashTable线程安全,不支持null和null键。

LinkedHashMap是HashMap的一个子类,保存了记录数据的顺序。

SortedMap接口TreeMap能够排序,根据键值的升序排序

8.数组和链表简介

8.1数组和链表的区别

8.2数组和链表的应用场景

8.3跟数组有关的面试题

10.List a=new ArrayList()和ArrayList a=new ArrayList()的区别?

前者是list对象,所以有很多ArrayList的属性和方法都不能使用,而后者保留了属性。(比如trimToSize方法)

11.对集合更新操作时,ArrayList和LinkedList哪个更加适合?

ArrayList是实现了基于动态数组的结构,LinkedList基于链表的数据结构

如果集合数据对于集合访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。

如果集合数据要频繁进行add和remove,LinkedList比较占优势

12.用2个队列模拟堆栈结构。

两个队列模拟堆栈,队列先进先出,堆栈先进后出,模拟如下

需要一个ArrayList进行中间进行存放

13.Collection和Map的集成体系

14.Map中的key和value可以为null么?

HashMap对象的key,value均可为null

HashTable对象的key,value均不可为null

两者的key均不能重复,若添加key相同的键值对,后面的value会覆盖前面的value不会报错

九、Java的多线程

1.多线程的创建方式

(1)继承Thread类

(2)实现Runnable接口

(3)使用ExecutorService、Callable、Future实现有返回结果的线程:ExecutorService、Callable、Future对象属于Executor框架中

的功能类

2.在java中wait和sleep方法有什么不同?

wait会释放锁,sleep一直持有锁,wait通常被用于线程交互,sleep通常用于暂停执行

3.synchronized和volatile关键字的作用?

一个共享变量(member variable and static variable)被volatile修饰之后,有着2层含义:

(1)保证了不同现场对这个变量进行操作的可见性,一个线程修改了某个变量的值,新值对其他线程来说是立即可见的

(2)禁止进行指令重排序

volatile本质是告诉jvm当前变量在寄存器中是不稳定的,需要在主存中读取

synchronized是锁定当前变量,只有当前线程可以访问该变量,其他线程锁住

  2.1.1volatile仅仅用在变量级别;

    sychronized可以用在变量,方法,类级别

  2.1.2volatile仅仅实现变量修改可见性,不能保证原子性

    sychronized可以保证可见性和原子性

  2.1.3volatile不会造成线程堵塞

    synchronized可能造成线程堵塞

4.分析线程并发访问代码并解释原因

不一定,我运行后是600多,在Java的内存模型中每一个线程运行时都有一个线程栈,线程栈中保存了线程运行时的变量值信息,当访问某一个

对象的值的时候,首先通过对象的引用找到堆内存的变量值,然后把堆内存变量具体值load到线程本地内存中,建立一个变量副本

之后线程就不再和对象变量值有任何关系,而是直接修改变量的值,在修改后某个时刻,自动把线程变量副本值协会堆中

变量,这样堆中对象的值就产生变化了。(所以值一定小于1000,每次运行结果还不一样)

5.什么是线程池,如何使用?

线程池就是把多线程对象放在一个容器中,想使用,不是去new线程,而是直接去池子中拿到线程即可,节省了开辟线程的时间,提高了

代码的执行效率。

常见的线程池?

new SingleThreadExecutor创建单线程线程池,保证所有任务提交顺序进行

new FixedThreadPool可缓存线程池,依赖JVM最大线程的大小

new CachedThreadPool大小无限的线程池,周期性任务

new ScheduledThreadPool单线程线程池,周期性任务

new SingleThreadExecutor单线程的线程池,定时周期性执行任务

7.请叙述下您对线程池的理解?

(1)降低了资源的消耗。

(2)提高了响应的速度

(3)提高线程的可管理性

8.线程池启动策略

(1)池子刚创建时,没有线程

(2)调用execute()方法添加一个任务,线程池会进行如下判断:

  a.正在运行的线程数量小于corePoolSize,创建线程运行任务

  b.大于等于corePoolSize,这个任务放入队列

  c.队列已经满了,运行线程数量小于maximumPoolSize,name还是要创建线程运行这个任务

  d. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告

诉调用者“我不能再接受任务了”。 
(3)当完成一个任务时,它会从队列中取出下一个任务来执行
(4)一个线程无事可做,超过一定时间,线程池会判断,如果当前运行线程数大于corePoolSize,线程暂停,
所有任务完成后,又能收缩到corePoolSize的大小
9.如何控制某个方法允许并发访问线程个数?
可以使用Semaphore控制
10.三个线程abc并发运行,bc需要a线程的数据怎么实现
11.同一个类2个方法都加了同步锁,多个线程能访问同一个类中的两个方法吗?
12.什么情况下导致线程死锁,遇到线程死锁时应该怎么解决?
  如何避免死锁?
13.Java中多线程的通信怎么实现?
14.线程与进程的区别?
15.请说出同步线程及线程调度相关的方法?
16.启动一个线程是调用run方法还是start方法?
start方法,run方法是线程启动后要进行callback的方法
 
十、Java内部类
1.静态嵌套类和内部类的不同?
静态嵌套类:Static Nested Class 是被声明静态的内部类,它可以不依赖于外部类实例被实例化
内部类:需要外部类实例化
2.下面代码哪些地方会产生编译错误?
 
(内部类和多线程我会再刷一些课程,之后补上我的理解,下周有面试,这篇博文先未完结,这次写面试博文的目的还是以尽快复习为主)
 
 

面试复习题(一)Java系列的更多相关文章

  1. .net基础学java系列(一)视野

    本文目的在于扩展你我视野,求各位大神帮忙补充下表格中的内容,特别是Java的相关内容. 下面的文字纯是为了凑足150个字. 本人作为一名普通的.net程序员,也快混了十年了.在.net方面的知识面较广 ...

  2. .net基础学java系列(三)徘徊反思

    .net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...

  3. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

  4. 面试:用 Java 实现一个 Singleton 模式

    面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...

  5. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  6. 【面试突击】- Java面试总则

    Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...

  7. java 面试题目(java高级架构)

    题目信息 java基础: 1. Java 基础 JDK 和 JRE 有什么区别?   Java中JDK和JRE的区别是什么?它们的作用分别是什么? == 和 equals 的区别是什么? 两个对象的 ...

  8. 深度解析互联网大厂面试难题自定义@EnableXX系列

    深度解析互联网大厂面试难题自定义@EnableXX系列   其实是一个@Import的设计技巧 创建注解@EnableXX(任何名称注解都行,只是这个名字好一些) XXConfiguration类不能 ...

  9. 面试中关于Java你所需知道的的一切

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  10. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

随机推荐

  1. Qt 之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

    简述QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列. QVBox ...

  2. 模块的概念、模块的导入方式【IMPORT 模块名、FROM 模块 IMOPRT 功能】、模块的搜索路径、链式导入&循环导入

    今日内容 1. 模块:模块的概念 2.导入的方式:import  from import 3. 环境变量:sys.path 4. 导入模块的顺序 5. 循环导入:模块间互相导入 模块 常见的四种模块: ...

  3. Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)

    Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...

  4. deepin与win10 设置共享文件

    在做预料训练时用的是基于linux环境下的kenlm训练工具,然后当时发现woc? 这这这这训练出来的语言模型居然拖不到win10下使用......当时特别二,就在linux下登录邮箱给自己发邮件23 ...

  5. Vue 项目结构介绍

    Vue 项目创建完成后,使用 Web Storm 打开项目,项目目录如下: build 文件夹,用来存放项目构建脚本 config 中存放项目的一些基本配置信息,最常用的就是端口转发 node_mod ...

  6. VC/MFC中的CComboBox控件使用详解

    CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...

  7. 从零开始,SpreadJS新人学习笔记【第3周】

    表单&函数 阔别多日, SpreadJS新人学习笔记,本周起正式回归!(在断更的这一个月中,我为大家先后录制了14期SpreadJS产品入门系列学习视频,希望帮助那些正在学习和使用 Sprea ...

  8. Storm消费Kafka提交集群运行

    1.创建拓扑,配置KafkaSpout.Bolt KafkaTopologyBasic.java: package org.mort.storm.kafka; import org.apache.ka ...

  9. Maven简单项目及命令使用

    项目结构如下 HelloWorld.java package pak1; public class HelloWorld { public String sayHello(){ return &quo ...

  10. linux centos 7.3 编译安装mysql5.7

    #安装依赖 yum update yum install -y gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre ...