六扇门 6doors 是什么?

六扇门dayuzi 回复了问题 • 2 人关注 • 2 个回复 • 55 次浏览 • 2016-11-14 16:04 • 来自相关话题

java面试题集合(不定期更新)

经验交流admin 发表了文章 • 0 个评论 • 27 次浏览 • 2016-11-13 15:16 • 来自相关话题

注:基于jdk1.7

2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客。在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等。当时我甚至希望把面试中经常出现的操作系统、数据库、软件测试等内容也补充进去,但是由于各种原因,最终只整理出了150道面试题。让我欣慰的是,这150道题还是帮助到了很多人,而且在我CSDN博客上的总访问量超过了5万次,最终还被很多网站和个人以原创的方式转载了。最近一年内,用百度搜索”Java面试”我写的这些东西基本上都排在搜索结果的前5名,这让我觉得”亚历山大”,因为我写的这些东西一旦不准确就可能误导很多人。2014年的时候我又整理了30道题,希望把之前遗漏的面试题和知识点补充上去,但是仍然感觉挂一漏万,而且Java 8问世后很多新的东西又需要去总结和整理。为此,我不止一次的修改了之前的180题,修改到自己已经感觉有些疲惫或者厌烦了。2014年至今,自己带的学生又有很多走上了Java程序员、Java工程师的工作岗位,他们的面试经验也还没来得及跟大家分享,冥冥之中似乎有一股力量在刺激我要重新写一篇《Java面试题全集》,于是这篇文章就诞生了。请不要责备我把那些出现过的内容又写了一次,因为每次写东西就算是重复的内容,我也需要对编程语言和相关技术进行重新思考,不仅字斟句酌更是力求至臻完美,所以请相信我分享的一定是更新的、更好的、更有益的东西,这些内容也诉说着一个职业程序员和培训师的思想、精神和情感。

原文出处:骆昊

 1、面向对象的特征有哪些?
答:面向对象的特征主要有以下几个方面:
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式理解》中关于桥梁模式的部分)。封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想象普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装足够好的,因为几个按键就实现所需做的事情)。多态:多态是指允许不同子类型对象对同一消息作出不同响应。简单说是用同样的对象引用调用同样的方法但是做了不同事情。多态分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,A系统只会通过B类对象调用通电的方法,但并不知道供电系统的底层实现是什么,如何获得动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现是运行时的多态(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两点:1)方法重写(子类继承父类并重写父类中已有的或抽象的方法);2)对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现不同的行为)。
 
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
答:
修饰符         当前类         同 包         子 类         其他包
public             √                    √                   √                    √
protected         √                    √                   √                    ×
default             √                    √                   ×                    ×
private             √                    ×                   ×                    ×
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以使以上四种!
 
3、String时最基本的数据类型吗?
答:不是。
Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;
除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type) 
4、float f=3.4;是否正确?
答:不正确。
3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f=(float)3.4;或者写成float f=3.4F; 
5、short s1=1;s1=s1+1;有错吗?short s1=1;s1+=1;有错吗?
答:对于short s1=1;s1=s1+1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。而short s1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换。 
6、Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字) 
7、int和Integer有什么区别?
答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换.
Java为每个原始类型提供了包装类型:
--原始类型: boolean , char , byte , short , int , long , float , double 
--包装类型: Boolean , Character , Byte , Short , Integer , Long , Float , Double
#==================================================================
class AutoUnboxingTest {
    public static void main (String[] args){
              Integer a = new Integer(3);
              Integer b = 3;                            //将3自动装箱成Integer类型
              Int  c = 3;
              System.out.println(a == b);      // false 两个引用没有引用同一个对象
              System.out.println(a == c);      //  true  a自动拆箱成int类型再和c比较
   }
}

#===================================================================
最近遇到一个面试题, 也是和自动装箱/拆箱有点关系,代码如下:
#===================================================================
public class Test03{
     public static void main(String[] args){
            Integer f1 = 100 , f2 = 100, f3 = 150, f4 = 150;

            System.out.println(f1 == f2);
            System.out.println(f3 == f4);

     }

}
#====================================================================
如果不明就里容易认为两个输出要么都是true要么都是false.
首先需要注意是f1 , f2 , f3 , f4 四个变量都是Integer对象引用,
所以下面的 == 运算比较的不是值而是引用.
装箱的本质是什么?
当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么.
#============================================================
public static Integer valueOf(int i){
     if(i >= IntegerCache.low && i <= IntegerCache.high)
         return IntegerCache.cache[i + ( - IntegerCache.low) ];
       return new Integer( i );
}

#==========================================================
IntegerCache是Integer的内部类,其代码如下所示:
#==========================================================
/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
   private static class IntegerCache{       static final int low = -128;
       static final int high;
       static final Integer cache[];

       static{
             // high value may be configured by property
            int h = 127 ;
            String integerCacheHighPropValue =
                        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                        if(integerCacheHighPropValue != null){
                           try{
                              int i = parseInt(integerCacheHighPropValue);
                               i = Math.max(i, 127);
                               //Maximum array size is Integer.MAX_VALUE
                               h = Math.min(i , Integer.MAX_VALUE - (-low) - 1);
                            }catch(NumberFormatException nfe){
                                // If the property cannot be parsed into an int, ignore it.
                             }
                        }
               high = h;

               cache = new Integer[(high - low ) + 1];
               int j = low;
               for(int k = 0 ; k < cache.length; k++ )
                     cache[k] = new Integer(j++);


                //range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
       }
       private IntegerCache(){

       }
}
#===========================================================

简单说,如果整型字面量值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面面试题中的f1 == f2 的结果是true,f3 == f4的结果是false.

提醒: 越貌似简单的面试题其中的玄机越多,需要面试者有相当深厚的功底.

8、&和&&的区别?答: & 运算符有两种用法 1)按位与;(2)逻辑与.&&运算符是短路与运算.
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true. &&之所以称为短路运算是因为&&左边的表达式值为false时,右边的表达式会被直接短路掉,不会进行运算.很多时候,我们需要用&&而不是&,例如验证用户登陆时判定用户名是否为null而且不是空字符串,习惯用: username != null && !username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,则根本不进行字符串的equals比较,否则会产生NullPointerException异常. 注意: 逻辑或运算符( | ) 和短路或运算符( || )的差别也是如此.

补充:  如果你熟悉JavaScript ,那你可能更能感受到短路运算的强大,想称为JavaScript的高手就先从短路运算玩起.

 
9、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如:直接书写的100,"hello"和常量都是放在静态区中.栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间使用.
String str = new String("hello");
上面的语句中变量str放栈中,用new创建出来的字符串对象放在堆中,而"hello"这个字面量放在静态区.


补充: 较新版的java(从java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能.

 
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11.四舍五入的原理是在参数上加0.5然后进行下取整.
 
11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
答:在Java 5之前,switch(expr)中,expr只能是byte  short   char   int.从java 5 开始,java中引入了枚举类型,expr也可以是enum类型,从java7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的.
 
12、用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方).

补充: 我们为编写的类重写hashCode方法时,可能会看到如下所示代码,其实我们不太理解为什么要这样的乘法来产生哈希码(散列码) .而且为什么这个数是个素数. 为什么通常选择31这个数?前两个问题的答案你可以自己谷歌百度,选择31是因为可以用移位和减法运算来代替乘法.从而得到更好的性能.说道这里,你可以思考:  31 * num 等价于(num<<5)-num .左移5位相当于乘以2的5次方再减去自身就相当于乘以31 . 现在的vm都能自动完成这个优化.
#===============================================
public class PhoneNumber{
private int areaCode;
private String prefix;
private String lineNumber;

@Override
public int hashCode(){
    final int prime = 31;
    int result = 1;
    result = prime * result + areaCode;
    result = prime * result
               + ((lineNumber == null)?0:lineNumber.hashCode());
    result = prime * result + ((prefix == null ) ? 0: prefix.hashCode()));
    return result; 
}

  @Override
   public boolean equals(Object obj){
        if(this == obj) return true;
        if(obj == null )return false;
        if(getClass() != obj.getClass()) return false;
        PhoneNumber other = (PhoneNumber) obj;
        if(areaCode != other.areaCode) return false;
        if(lineNumber == null ){
            if(other.lineNumber != null )return false;
        }else if (!lineNumber.equals(other.lineNumber))return false;
        if(prefix == null){
            if(other.prefix != null) return false;
        }else if(!prefix.equals(other.prefix))return false;
        return true;

   }
}

#===============================================
 
13、数组有没有length()方法?String有没有length()方法?
答:数组没有length()方法,有length属性.String有length()方法.javascript 中,获得字符串的长度是通过length属性得到的,这一点容易和java混淆. 
14、在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环.
(Java中支持带标签的break和continue,作用类似C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好 ?)
 
15、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载!
 
16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true; 他们的哈希吗(hash code) 应当相同.Java对于equals方法和hashCode方法的规定是 1)如果两个对象相同(equals方法返回true),那么他们的hashCode值一定相同;(2)如果两个对象的hashCode相同,他们并不相同.当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性急剧下降).
 

补充: 关于equals和hashCode方法,很多java程序都知道,但很多人也就是仅仅知道而已.在JoshuaBlock的大作<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注解).

 
17、是否可以继承String类?
答:String类是final类 , 不可以被继承.
 
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递. java语言的方法调用只支持参数的值传递. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用. 对象的属性可以在调用过程中被改变,但对对象引用的改变是不会影响到调用者的. C++和C#中可以通过传引用或传输出参数来改变传入的参数的值.在C#中可以编写如下所示的代码,但是在Java中却做不到.
#========================================
using System;

namespace CS01{
    class Program{
         public static void swap( ref int x , ref int y){
               int temp = x;
               x = y ;
               y = temp;
         }

         public static void Main(String[] args){
           int a = 5, b = 10;
           swap (ref a, ref b);
            //a = 10 , b = 5
            Console.WriteLine(" a = {0} , b = {1}", a, b);
        } 
    }
}
#========================================
说明: Java 中没有传引用实在是非常不方便.这一点在Java 8 中仍然没有得到改进.正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法). 这样的做法只会让代码变得臃肿 , 尤其让从C和C++转型为Java的程序员无法容忍. 
19、String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuff/StringBuilder ,他们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示字符串对象可以直接进行修改。StringBuilder是Java 5 中引入的,他和StringBuffer的方法完全相同,区别在于它是单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

面试题1 - 什么情况下用 + 运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

面试题2 - 请说出下面程序的输出。
#==================
class StringEqualTest{

   public static void main(String[] args){
         String s1 = "Programming";   String s2 = new String("Programming");
   String s3 = "Program" + "ming";
   System.out.println(s1 == s2);
   System.out.println(s1 == s3);
   System.out.println(s1 == s1.intern());
   }

}
#==================== 
补充: String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。 
20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现编译时的多态性,后者实现运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊要求。

面试题: 华为的面试题中曾经问过这样一个问题--“为什么不能根据返回类型来区分重载”,会说出你的答案吧! 
21、描述一下JVM加载class文件的原理机制?
答: JVM中类的装载是由类加载器(ClassLoader) 和它的子类来实现的,Java 中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类.
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件.当Java程序需要使用某个类时,JVM会确保这个类已经被加载或连接(验证/准备/解析)和初始化.类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象.加载完成后,Class对象还不完整,所以此时的类还不可用.当类被加载后就进入连接阶段,这一阶段包括验证/准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤.最后JVM对类进行初始化,包括: 1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类; 2)如果类中存在初始化语句,就依次执行这些初始化语句.
类的加载由类加载器完成的,类加载器包括:根加载器(BootStrap) / 扩展加载器(Extension) /系统加载器(System) 和用户自定义类加载器(java.lang.ClassLoader的子类).从Java2(JDk1.2)开始,类加载过程采用父亲委托机制(PDM).PDM更好保证Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器.类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载.JVM不会向Java程序提供对Bootstrap的引用 . 下面是关于几个类加载器的说明:

*Bootstrap : 一般用本地代码实现.负责加载JVM基础核心类库 (rt.jar)
*Extension: 从java.ext.dirs系统属性所指定的目标中加载类库,它的父亲加载器是Bootstrap:
*System: 又叫引用类加载器,其父类是Extension.他是引用最广泛的类加载器,他从环境变量classpath或者系统属性java.class.path所指定的目录中记载类.是用户自定义加载器的默认父加载器. 
22、char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编码,这是统一唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的.
补充: 使用Unicode意味着字符在JVM内部和外部有不同的表现形式.在JVM内部都是Unicode.当这个字符被从JVM内部转移到外部时(例如存入文件系统中) ,需要进行编码转换.所以Java中有字节流和字符流.以及在字符流和字节流之间进行转换的转换流.如InputStreamReader 和 OutputStreamReader .这两个类是字节流和字符流之间的适配器类.承担了编码转换的任务:对于C程序员来说.要完成这样的编码转换恐怕要依赖于union(联合体/共用体) 共享内存的特征来实现了.
 

待续......


  查看全部


注:基于jdk1.7


2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客。在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等。当时我甚至希望把面试中经常出现的操作系统、数据库、软件测试等内容也补充进去,但是由于各种原因,最终只整理出了150道面试题。让我欣慰的是,这150道题还是帮助到了很多人,而且在我CSDN博客上的总访问量超过了5万次,最终还被很多网站和个人以原创的方式转载了。最近一年内,用百度搜索”Java面试”我写的这些东西基本上都排在搜索结果的前5名,这让我觉得”亚历山大”,因为我写的这些东西一旦不准确就可能误导很多人。2014年的时候我又整理了30道题,希望把之前遗漏的面试题和知识点补充上去,但是仍然感觉挂一漏万,而且Java 8问世后很多新的东西又需要去总结和整理。为此,我不止一次的修改了之前的180题,修改到自己已经感觉有些疲惫或者厌烦了。2014年至今,自己带的学生又有很多走上了Java程序员、Java工程师的工作岗位,他们的面试经验也还没来得及跟大家分享,冥冥之中似乎有一股力量在刺激我要重新写一篇《Java面试题全集》,于是这篇文章就诞生了。请不要责备我把那些出现过的内容又写了一次,因为每次写东西就算是重复的内容,我也需要对编程语言和相关技术进行重新思考,不仅字斟句酌更是力求至臻完美,所以请相信我分享的一定是更新的、更好的、更有益的东西,这些内容也诉说着一个职业程序员和培训师的思想、精神和情感。


原文出处:骆昊


 1、面向对象的特征有哪些?
答:面向对象的特征主要有以下几个方面:
  • 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
  • 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式理解》中关于桥梁模式的部分)。
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想象普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装足够好的,因为几个按键就实现所需做的事情)。
  • 多态:多态是指允许不同子类型对象对同一消息作出不同响应。简单说是用同样的对象引用调用同样的方法但是做了不同事情。多态分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,A系统只会通过B类对象调用通电的方法,但并不知道供电系统的底层实现是什么,如何获得动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现是运行时的多态(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两点:1)方法重写(子类继承父类并重写父类中已有的或抽象的方法);2)对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现不同的行为)。

 
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
答:
修饰符         当前类         同 包         子 类         其他包
public             √                    √                   √                    √
protected         √                    √                   √                    ×
default             √                    √                   ×                    ×
private             √                    ×                   ×                    ×
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以使以上四种!
 
3、String时最基本的数据类型吗?
答:不是。
Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;
除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type) 
4、float f=3.4;是否正确?
答:不正确。
3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f=(float)3.4;或者写成float f=3.4F; 
5、short s1=1;s1=s1+1;有错吗?short s1=1;s1+=1;有错吗?
答:对于short s1=1;s1=s1+1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。而short s1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换。 
6、Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字) 
7、int和Integer有什么区别?
答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换.
Java为每个原始类型提供了包装类型:
--原始类型: boolean , char , byte , short , int , long , float , double 
--包装类型: Boolean , Character , Byte , Short , Integer , Long , Float , Double
#==================================================================
class AutoUnboxingTest {
    public static void main (String[] args){
              Integer a = new Integer(3);
              Integer b = 3;                            //将3自动装箱成Integer类型
              Int  c = 3;
              System.out.println(a == b);      // false 两个引用没有引用同一个对象
              System.out.println(a == c);      //  true  a自动拆箱成int类型再和c比较
   }
}

#===================================================================
最近遇到一个面试题, 也是和自动装箱/拆箱有点关系,代码如下:
#===================================================================
public class Test03{
     public static void main(String[] args){
            Integer f1 = 100 , f2 = 100, f3 = 150, f4 = 150;

            System.out.println(f1 == f2);
            System.out.println(f3 == f4);

     }

}
#====================================================================
如果不明就里容易认为两个输出要么都是true要么都是false.
首先需要注意是f1 , f2 , f3 , f4 四个变量都是Integer对象引用,
所以下面的 == 运算比较的不是值而是引用.
装箱的本质是什么?
当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么.
#============================================================
public static Integer valueOf(int i){
     if(i >= IntegerCache.low && i <= IntegerCache.high)
         return IntegerCache.cache[i + ( - IntegerCache.low) ];
       return new Integer( i );
}

#==========================================================
IntegerCache是Integer的内部类,其代码如下所示:
#==========================================================
/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
   private static class IntegerCache{       static final int low = -128;
       static final int high;
       static final Integer cache[];

       static{
             // high value may be configured by property
            int h = 127 ;
            String integerCacheHighPropValue =
                        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                        if(integerCacheHighPropValue != null){
                           try{
                              int i = parseInt(integerCacheHighPropValue);
                               i = Math.max(i, 127);
                               //Maximum array size is Integer.MAX_VALUE
                               h = Math.min(i , Integer.MAX_VALUE - (-low) - 1);
                            }catch(NumberFormatException nfe){
                                // If the property cannot be parsed into an int, ignore it.
                             }
                        }
               high = h;

               cache = new Integer[(high - low ) + 1];
               int j = low;
               for(int k = 0 ; k < cache.length; k++ )
                     cache[k] = new Integer(j++);


                //range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
       }
       private IntegerCache(){

       }
}
#===========================================================

简单说,如果整型字面量值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面面试题中的f1 == f2 的结果是true,f3 == f4的结果是false.


提醒: 越貌似简单的面试题其中的玄机越多,需要面试者有相当深厚的功底.


8、&和&&的区别?答: & 运算符有两种用法 1)按位与;(2)逻辑与.&&运算符是短路与运算.
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true. &&之所以称为短路运算是因为&&左边的表达式值为false时,右边的表达式会被直接短路掉,不会进行运算.很多时候,我们需要用&&而不是&,例如验证用户登陆时判定用户名是否为null而且不是空字符串,习惯用: username != null && !username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,则根本不进行字符串的equals比较,否则会产生NullPointerException异常. 注意: 逻辑或运算符( | ) 和短路或运算符( || )的差别也是如此.


补充:  如果你熟悉JavaScript ,那你可能更能感受到短路运算的强大,想称为JavaScript的高手就先从短路运算玩起.


 
9、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如:直接书写的100,"hello"和常量都是放在静态区中.栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间使用.
String str = new String("hello");
上面的语句中变量str放栈中,用new创建出来的字符串对象放在堆中,而"hello"这个字面量放在静态区.



补充: 较新版的java(从java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能.


 
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11.四舍五入的原理是在参数上加0.5然后进行下取整.
 
11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
答:在Java 5之前,switch(expr)中,expr只能是byte  short   char   int.从java 5 开始,java中引入了枚举类型,expr也可以是enum类型,从java7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的.
 
12、用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方).

补充: 我们为编写的类重写hashCode方法时,可能会看到如下所示代码,其实我们不太理解为什么要这样的乘法来产生哈希码(散列码) .而且为什么这个数是个素数. 为什么通常选择31这个数?前两个问题的答案你可以自己谷歌百度,选择31是因为可以用移位和减法运算来代替乘法.从而得到更好的性能.说道这里,你可以思考:  31 * num 等价于(num<<5)-num .左移5位相当于乘以2的5次方再减去自身就相当于乘以31 . 现在的vm都能自动完成这个优化.
#===============================================
public class PhoneNumber{
private int areaCode;
private String prefix;
private String lineNumber;

@Override
public int hashCode(){
    final int prime = 31;
    int result = 1;
    result = prime * result + areaCode;
    result = prime * result
               + ((lineNumber == null)?0:lineNumber.hashCode());
    result = prime * result + ((prefix == null ) ? 0: prefix.hashCode()));
    return result; 
}

  @Override
   public boolean equals(Object obj){
        if(this == obj) return true;
        if(obj == null )return false;
        if(getClass() != obj.getClass()) return false;
        PhoneNumber other = (PhoneNumber) obj;
        if(areaCode != other.areaCode) return false;
        if(lineNumber == null ){
            if(other.lineNumber != null )return false;
        }else if (!lineNumber.equals(other.lineNumber))return false;
        if(prefix == null){
            if(other.prefix != null) return false;
        }else if(!prefix.equals(other.prefix))return false;
        return true;

   }
}

#===============================================
 
13、数组有没有length()方法?String有没有length()方法?
答:数组没有length()方法,有length属性.String有length()方法.javascript 中,获得字符串的长度是通过length属性得到的,这一点容易和java混淆. 
14、在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环.
(Java中支持带标签的break和continue,作用类似C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好 ?)
 
15、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载!
 
16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true; 他们的哈希吗(hash code) 应当相同.Java对于equals方法和hashCode方法的规定是 1)如果两个对象相同(equals方法返回true),那么他们的hashCode值一定相同;(2)如果两个对象的hashCode相同,他们并不相同.当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性急剧下降).
 


补充: 关于equals和hashCode方法,很多java程序都知道,但很多人也就是仅仅知道而已.在JoshuaBlock的大作<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注解).


 
17、是否可以继承String类?
答:String类是final类 , 不可以被继承.
 
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递. java语言的方法调用只支持参数的值传递. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用. 对象的属性可以在调用过程中被改变,但对对象引用的改变是不会影响到调用者的. C++和C#中可以通过传引用或传输出参数来改变传入的参数的值.在C#中可以编写如下所示的代码,但是在Java中却做不到.
#========================================
using System;

namespace CS01{
    class Program{
         public static void swap( ref int x , ref int y){
               int temp = x;
               x = y ;
               y = temp;
         }

         public static void Main(String[] args){
           int a = 5, b = 10;
           swap (ref a, ref b);
            //a = 10 , b = 5
            Console.WriteLine(" a = {0} , b = {1}", a, b);
        } 
    }
}
#========================================
说明: Java 中没有传引用实在是非常不方便.这一点在Java 8 中仍然没有得到改进.正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法). 这样的做法只会让代码变得臃肿 , 尤其让从C和C++转型为Java的程序员无法容忍. 
19、String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuff/StringBuilder ,他们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示字符串对象可以直接进行修改。StringBuilder是Java 5 中引入的,他和StringBuffer的方法完全相同,区别在于它是单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

面试题1 - 什么情况下用 + 运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

面试题2 - 请说出下面程序的输出。
#==================
class StringEqualTest{

   public static void main(String[] args){
         String s1 = "Programming";   String s2 = new String("Programming");
   String s3 = "Program" + "ming";
   System.out.println(s1 == s2);
   System.out.println(s1 == s3);
   System.out.println(s1 == s1.intern());
   }

}
#==================== 
补充: String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。 
20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现编译时的多态性,后者实现运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊要求。

面试题: 华为的面试题中曾经问过这样一个问题--“为什么不能根据返回类型来区分重载”,会说出你的答案吧! 
21、描述一下JVM加载class文件的原理机制?
答: JVM中类的装载是由类加载器(ClassLoader) 和它的子类来实现的,Java 中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类.
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件.当Java程序需要使用某个类时,JVM会确保这个类已经被加载或连接(验证/准备/解析)和初始化.类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象.加载完成后,Class对象还不完整,所以此时的类还不可用.当类被加载后就进入连接阶段,这一阶段包括验证/准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤.最后JVM对类进行初始化,包括: 1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类; 2)如果类中存在初始化语句,就依次执行这些初始化语句.
类的加载由类加载器完成的,类加载器包括:根加载器(BootStrap) / 扩展加载器(Extension) /系统加载器(System) 和用户自定义类加载器(java.lang.ClassLoader的子类).从Java2(JDk1.2)开始,类加载过程采用父亲委托机制(PDM).PDM更好保证Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器.类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载.JVM不会向Java程序提供对Bootstrap的引用 . 下面是关于几个类加载器的说明:

*Bootstrap : 一般用本地代码实现.负责加载JVM基础核心类库 (rt.jar)
*Extension: 从java.ext.dirs系统属性所指定的目标中加载类库,它的父亲加载器是Bootstrap:
*System: 又叫引用类加载器,其父类是Extension.他是引用最广泛的类加载器,他从环境变量classpath或者系统属性java.class.path所指定的目录中记载类.是用户自定义加载器的默认父加载器. 
22、char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编码,这是统一唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的.
补充: 使用Unicode意味着字符在JVM内部和外部有不同的表现形式.在JVM内部都是Unicode.当这个字符被从JVM内部转移到外部时(例如存入文件系统中) ,需要进行编码转换.所以Java中有字节流和字符流.以及在字符流和字节流之间进行转换的转换流.如InputStreamReader 和 OutputStreamReader .这两个类是字节流和字符流之间的适配器类.承担了编码转换的任务:对于C程序员来说.要完成这样的编码转换恐怕要依赖于union(联合体/共用体) 共享内存的特征来实现了.
 


待续......



 

Centos7 LNMP 搭建

经验交流admin 发表了文章 • 0 个评论 • 85 次浏览 • 2016-11-13 15:13 • 来自相关话题

一、关闭SELINUX

1、 查看SELINUX状态:/usr/sbin/sestatus -v或getenforce##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled

2、临时关闭(不用重启机器):

`setenforce 0` ##设置SELinux 成为permissive模式
`setenforce 1` ## 设置SELinux 成为enforcing模式

3、修改配置文件需要重启机器:
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
#重启之后使配置永久生效

二、更新centos源

centos 7 :
yum install epel-release
rpm -Uvh https://dl.fedoraproject.org/pub ... latest-7.noarch.rpm
#=====================================================
centos 6 :
yum install epel-release
rpm -Uvh https://dl.fedoraproject.org/pub ... latest-6.noarch.rpm

三、安裝 MySQL,現在可改為 MariaDB

yum -y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service

如果出現這樣的錯誤,那就重開 Linux 吧,比較快…
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: PackageKit
Memory : 136 M RSS (1.5 GB VSZ)
Started: Tue Dec 8 01:09:47 2015 - 01:21 ago
State : Uninterruptible, pid: 12947
#==============================================

安装完毕后,启动数据库安全模式进行处理

sudo mysql_secure_installation
You will be asked for the root password. Because you didn't set it earlier, press Enter to set a password now.
Type "Y" to set the root password.
Enter and confirm the new password.
You will be asked more questions as part of the security configuration. It is a best practice to respond "Y" to these system prompts

四、安装Apache

yum -y install httpd
systemctl start httpd.service
systemctl enable httpd.service
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

查看 localhost 就會出現畫面了。讓 Apache 可以支援 .htaccess ,須要把 AllowOverride 的功能開啟。如使用框架 Codeigniter 就須要設定。

vim /etc/httpd/conf/httpd.conf

因為我的網頁預設在

DocumentRoot "/var/www/html"

所以將 None 修改為 All

<Directory "/var/www/html">
AllowOverride All
</Directory>

重新启动

sudo systemctl restart httpd

五、安装php
PHP5.6安装centos
yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-mysql php-common php-xmlrpc php-pear php-xml php-fpm ----可以添加
php-ldap php-odbc php-snmp php-soap php-mcrypt curl curl-devel --未测试

Php7.x 安装 centos
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql php-common php-xmlrpc php-pear php-xml php-fpm ---可以添加
Test PHP processing on Apache
Create a new PHP file under the /var/www/html directory: sudo vim /var/www/html/info.php
When the file opens, type in the following code:<?phpphpinfo();?>
Save and close the file: :wq!
To verify it worked, type this URL in your browser:
http://your server's IP address/info.php
A page displays with the PHP version, extensions, build date, and other information.

六、建立FTP

yum -y install vsftpd
vim /etc/vsftpd/vsftpd.conf

透過 vi 修改為

anonymous_enable=NO

接著下指令

systemctl restart vsftpd
systemctl enable vsftpd
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --reload

啟動FTP

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
#================================================firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
#================================================
setsebool -P ftp_home_dir 1
setsebool -P ftpd_use_passive_mode 1
#================================================
setsebool -P ftpd_anon_write 1
setsebool -P ftpd_full_access 1
setsebool -P httpd_can_network_connect on (要設定這個,才能透過smtp.gmail.com寄信)
#===============================================
sudo systemctl restart vsftpd

接著就可以使用 Linux 原本系統已存在的使用者做登入。 查看全部
一、关闭SELINUX

1、 查看SELINUX状态:
/usr/sbin/sestatus -v
getenforce
##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled

2、临时关闭(不用重启机器):

`setenforce 0` ##设置SELinux 成为permissive模式
`setenforce 1` ## 设置SELinux 成为enforcing模式

3、修改配置文件需要重启机器:
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
#重启之后使配置永久生效

二、更新centos源

centos 7 :
yum install epel-release
rpm -Uvh https://dl.fedoraproject.org/pub ... latest-7.noarch.rpm
#=====================================================
centos 6 :
yum install epel-release
rpm -Uvh https://dl.fedoraproject.org/pub ... latest-6.noarch.rpm

三、安裝 MySQL,現在可改為 MariaDB

yum -y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service

如果出現這樣的錯誤,那就重開 Linux 吧,比較快…
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: PackageKit
Memory : 136 M RSS (1.5 GB VSZ)
Started: Tue Dec 8 01:09:47 2015 - 01:21 ago
State : Uninterruptible, pid: 12947
#==============================================

安装完毕后,启动数据库安全模式进行处理

sudo mysql_secure_installation
You will be asked for the root password. Because you didn't set it earlier, press Enter to set a password now.
Type "Y" to set the root password.
Enter and confirm the new password.
You will be asked more questions as part of the security configuration. It is a best practice to respond "Y" to these system prompts

四、安装Apache

yum -y install httpd
systemctl start httpd.service
systemctl enable httpd.service
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

查看 localhost 就會出現畫面了。讓 Apache 可以支援 .htaccess ,須要把 AllowOverride 的功能開啟。如使用框架 Codeigniter 就須要設定。

vim /etc/httpd/conf/httpd.conf

因為我的網頁預設在

DocumentRoot "/var/www/html"

所以將 None 修改為 All

<Directory "/var/www/html">
AllowOverride All
</Directory>

重新启动

sudo systemctl restart httpd

五、安装php
PHP5.6安装centos
yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-mysql php-common php-xmlrpc php-pear php-xml php-fpm ----可以添加
php-ldap php-odbc php-snmp php-soap php-mcrypt curl curl-devel --未测试

Php7.x 安装 centos
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql php-common php-xmlrpc php-pear php-xml php-fpm ---可以添加
Test PHP processing on Apache
Create a new PHP file under the /var/www/html directory: sudo vim /var/www/html/info.php
When the file opens, type in the following code:<?phpphpinfo();?>
Save and close the file: :wq!
To verify it worked, type this URL in your browser:
http://your server's IP address/info.php
A page displays with the PHP version, extensions, build date, and other information.

六、建立FTP

yum -y install vsftpd
vim /etc/vsftpd/vsftpd.conf

透過 vi 修改為

anonymous_enable=NO

接著下指令

systemctl restart vsftpd
systemctl enable vsftpd
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --reload

啟動FTP

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
#================================================firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
#================================================
setsebool -P ftp_home_dir 1
setsebool -P ftpd_use_passive_mode 1
#================================================
setsebool -P ftpd_anon_write 1
setsebool -P ftpd_full_access 1
setsebool -P httpd_can_network_connect on (要設定這個,才能透過smtp.gmail.com寄信)
#===============================================
sudo systemctl restart vsftpd

接著就可以使用 Linux 原本系統已存在的使用者做登入。

自媒体运营:爆五个大招,快速提升个人影响力

六扇门admin 发表了文章 • 0 个评论 • 46 次浏览 • 2016-11-13 15:09 • 来自相关话题

大家都知道这两年火爆的“自媒体”,出现了像:罗辑思维、吴晓波频道等让营销圈沸腾的案例,估值有的都达到了1亿美金。在许多人的概念里,自媒体就是微信公众号,微信公众号就是自媒体。
2015年自媒体依旧火爆,并且展现的形式也是更加的多样性,现在最多人使用的是微信公众平台订阅号,还有如视频类自媒体,优酷100亿推广的自频道计划;音频自媒体如喜马拉雅、力荔、蜻蜓fm等百花齐放。
那么,这么多的平台如何选择呢?
这个就需要根据你自身的情况与特长,进行一个定位选择了,媒体平台只是一个内容传播的渠道,最重要的还是你的内容能给别人带去价值。
许多网友经常向我咨询如何开始做自媒体,我这里总结了10种自媒体人才必备的技能,分享给大家。
一、定位:我们需要多个方面不同角度的去定位客户,所以我的理解主要是以下5种定位:
1、定位自已:找到适合自已的领域,并精通这个领域。主要是三点:
1.1、我是谁?
1.2、我有什么优势?
1.3、我能给别人提供什么价值?
首先一定要清楚自已的优势钻研某个领域,成为这个领域的模范人物,并且成为专家人物。不要想着做大而全,精通你所要做的领域,还有不管你是做那个领域,一定是要做自已喜欢的有兴趣的,因为只有自已喜欢你能才做的更远。
记得做一个与时间成为朋友的领域,就是说这个东西会随着时间越久,越来越有味道。
2、定位客户:选择目标客户
你要清楚你的客户是那类人群,你最终是想服务谁,是学生、家长、工人、男人、女人,还是服务企业、或是老板,你要弄清楚谁才是你的目标受众,一旦你初步确定了客户群体,你就可以根据他们的生活经历、性格和职业筛选出最精准备的客户,你最好把精准客户定为某个有明显特征。
3、定位痛点:发现客户的问题
清楚你的客户是谁后,你要想办法了解他们有什么痛点,你必须研究你的客户,发现他们的需求,为他们提供解决问题的方法或产品。
了解你客户痛点其实有很多办法,在这里,我分享一些我挖掘客户需求方程式,这个方程式包括4个简单的问题,详细如下:
3.1、你今年的目标是什么?
3.2、你认为今年有什么东西能让你的成功指数翻倍?
3.3、生活中或职场上最让你失望的事是什么?
3.4、为了改善现况,你做了什么?哪些方法奏效了,哪些方法是无效?
对于上面的这些问题的回答有帮助我了解客户的目标、需求、痛点、爱好等。总的来说,你越了解客户最迫切的问题,就越对对症下药,找到有针对性的方法,还可以通过以下几个方法去了解你客户的痛点:
3.5、上百度知道,去找你客户一般是在上面问的问题,并且找出你客户的100个问题来,加以分析解决,做完这些你基本上你就能够形成清晰思路,知道目标客户的痛点在那里?
3.6、通过百度指数,去分析你客户的关注焦点,以及一些相关的问题,我以美容为例,给你展现一下百度指数的相关分析功能:
3.6.1、需求分布:将你客户的需求由强到弱进行一个分析。

3.6.2、同时关心的问题分布:这个是说明你的客户在关心了这个问题后,还关心的一些问题,这样你可以从多个角度去分析你的客户,让你对客户有一个更全面的了解。

3.6.3、客户地哉分布:让你清楚你最精准的客户是在那里。

3.6.4、人群属性:通过这个可以分析到你客户的年龄及性别。

3.7、用淘宝指数,你还可以更加清楚的分析你客户的属性,包含星座、喜爱度、消费层级等等,让你对客户有一个更加清楚的认知。
4、定位渠道:你客户所出现的地方,你就要采取相应的行动来吸引他们,让他们来关注你;
5、定位运营:你需要采取客户能接受并且喜欢的方式,来传播你的价值,更好的方式是能让你的受众也一起参与到你的运营中来,让客户也有一份参与感,这样他就更喜欢去传播。
二、打造你的产品:打造好你的产品帮助你的客户解决问题。
你已思考过适合自已的领域、了解精准客户的需求,并且通过工具进行详细分析,找到了客户的痛点,现在你可以着手打造你的产品或项目。你的产品可以是实物也可以是虚拟,你擅长什么就做什么,但是一定是能给客户带来价值的产品。
三、自媒体传播工具:通过不同的自媒体工具,让你吸引到更多的受众。
既然你已经想好了分享并且吸引精准受众的产品,接下来就应该建立自媒体账户渠道,宣传自已的经验与心得。
随着互联网的快速发展,现在网络已经改变了我们的生活、学习、工作的方式,我们需要在受众最多的地方,通过免费分享有价值的内容与产品,在为受众带去附加价值的同时和他们搞好关系,这就是自媒体的第一步:给客户分享附加价值。
我所使用的自媒体工具有很多种,有微信公众号、微博、百度百家专栏、搜狐自媒体、QQ空间、优酷自频道、喜马拉雅与力荔音频平台等。
我觉得每一种自媒体工具都各有优点,比如百度专栏、搜狐自媒体我所发布的文章有很高的权重,很快就能够被各大搜索引擎收录,这样当别人搜索相关关键词时,我所写的文章一般都会排在前面,这样可以吸引到更多的受众。微信公众号可以让我与客户间,有一个更加深层的沟通与交流。
如果你有精力的话我建议是所有的自媒体工具,你都要合理的利用起来,因为这个可以加大你与受众之间的连接点,扩大你的影响力。就像是中国特种部兵一样,什么武器都有,这样什么情况下都能够面对。
四、免费分享:通过各大自媒体渠道去免费分享你的有价值的内容吸引客户。
你需要在各大自媒体渠道免费分享优质、有价值的文章、录音、视频,同时你需在在发布的时候,在发布的标题、文章中加入你的品牌关键词,和目前受众有关的关键词,当你的受众在搜索引擎搜索相关关键词时,你所发布的内容就在会结果中展现在前面,并且吸引到你的客户。
有的人可能会觉得在网上发布免费有价值的信息,这样会“泄露了太多含金量很多的信息“,或者“没有留下可以教给别人的东本”。当你心里这样想的时候,说明你还没有懂得如何去包装价值,怎么做生意。
你在免费分享信息的时候,我并不是建议你无偿分享所有的内容,而是建议你无偿分享最好的内容。我经常告诉别人,要“展现最好的作品”,因为现在是一个信息大爆炸的时代,每个人的注意力都是非常有限的,你往往只有一次机会证明自我价值,因为你错过了这次机会,可能永远的就失去了这个客户。
五、吸引粉丝:通过各种方法去吸引你的精准粉丝。
吸引粉丝可以分为了简单的2个步骤:
5.1、我吸引粉丝;
5.2、粉丝吸引粉比;
当开通一个自媒体渠道后,大部份人吸引受众都是在自已的微信私人号或是QQ上的好友,但是这些用户是非常有限。
第二步,让你的公众号粉丝帮你分享文章,只要你写的文章足够吸引人,足够有价值,你的粉丝是会愿意帮助你分享的。然后不断重复第一步、第二步,你的粉丝就会慢慢滚雪球式的增长。这里要强调的是你必须是坚持有价值的好内容。
六、文案策划:教你将文案写出去,就能把钱收回来。
许多自媒体新手写文章的时候,总是把文章写的很散,自已想表达的意思很多,读者看上进心来去是言之无货,对于这样的新手,只需学习以下方法及可:
6.1、一个好的标题是成功的一半,所以你的标题必须要足够的吸引人;
6.2、文章的开头非常重要,必须上来就要吸引眼球,需要做到分析痛苦,描绘好处;
6.3、文章需要有一个框架逻辑结构,同时还要懂得文章排版中的留白处理,如果你的文章上来就是密密麻烦的十几段,别人一眼看上去会觉得晕乎乎的,立马将你的文章关掉走人。
6.4、你要让越来越多的人阅读与转发你的文章,文章的转发量越大,就说明你的文章越受欢迎,这里有二招,第一招是暗示用户转发,第二招是吸引用户转发。
七、倍增你的名气:找到你快速广大自媒体的方法。
你的名气越大,你的粉丝就会越多,那如何能让我更有名呢?现在的明星为什么有名,除了自身的价值外还有一个共同点,就是有大量的报道,经常出现在各大媒体上。
自媒体也不例外,你想自已更有名,那就要别人不断的去采访你。你可以找其它自媒体来采访你,当然你也可以采访别人,这样采访的人越多你的名气就会越大,慢慢的,你就会吸引到报纸、电视台的注意,他们也会采访你,当然你也可以通过一些公关方法来让传统媒体采访你。
你还可以采取相互推荐的方式,这种也是很有效,这里需要注意一点的是,你尽量找比你能量大的媒体来推荐你,还要是那种媒体自身价值与人气不错的,这点特别重要。
我需要提醒你注意的是,这一点排在第六步是有原因的,除非你已经完成了前面五步,否则请不要贸然寻找推广的合作伙伴,因为当你自身能力不够强大时,别人帮助推广你反倒是对你致命的打击。
八、与众不同:你应该做到独一无二,这样别人选择你的机会会更大。
自媒体的首要精髓就是与众不同—你应该是独一无二的。如果你总是留心做到这一点,为你的客户提供独特的附加价值和信息,你就能获得别人的特别关注。无论是在生活中,还是在自媒体行业中,千篇一律或盲目模仿都不会得到青睐。你越是与众不同,越能把自已的独特性呈现给喜欢你的人,你的影响力就会越来越大。
九、精益求精:快速测试、持续迭代、不断优化。
当你做了自媒体后,你必须快速的去测试,持续迭代,不断优化,让你的自媒体变更比同行更加精益求精,你只有这样了才能更加持久的在行业中脱颖而出。
十、如何盈利
做自媒体一定要想好盈利模式,因为没有盈利你是做不长。如何盈利呢?
盈利无外乎二种模式,一种是虚拟的比如服务业、培训、咨询等,另外一种是实体的,不同的自媒体可以有不同的盈利模式。
只要你能够在某个自媒体行业做出名气,把自已打造成明星,吸引足够多的用户,盈利不是什么大的问题,现在用户会为有个性和有价价值的个人买音,因为大家现在注重的是你给他所带来的结果,所以现在打造自媒体相对还是比较容易的,有想法的人可以马上动手进行测试。 查看全部
大家都知道这两年火爆的“自媒体”,出现了像:罗辑思维、吴晓波频道等让营销圈沸腾的案例,估值有的都达到了1亿美金。在许多人的概念里,自媒体就是微信公众号,微信公众号就是自媒体。
2015年自媒体依旧火爆,并且展现的形式也是更加的多样性,现在最多人使用的是微信公众平台订阅号,还有如视频类自媒体,优酷100亿推广的自频道计划;音频自媒体如喜马拉雅、力荔、蜻蜓fm等百花齐放。
那么,这么多的平台如何选择呢?
这个就需要根据你自身的情况与特长,进行一个定位选择了,媒体平台只是一个内容传播的渠道,最重要的还是你的内容能给别人带去价值。
许多网友经常向我咨询如何开始做自媒体,我这里总结了10种自媒体人才必备的技能,分享给大家。
一、定位:我们需要多个方面不同角度的去定位客户,所以我的理解主要是以下5种定位:
1、定位自已:找到适合自已的领域,并精通这个领域。主要是三点:
1.1、我是谁?
1.2、我有什么优势?
1.3、我能给别人提供什么价值?
首先一定要清楚自已的优势钻研某个领域,成为这个领域的模范人物,并且成为专家人物。不要想着做大而全,精通你所要做的领域,还有不管你是做那个领域,一定是要做自已喜欢的有兴趣的,因为只有自已喜欢你能才做的更远。
记得做一个与时间成为朋友的领域,就是说这个东西会随着时间越久,越来越有味道。
2、定位客户:选择目标客户
你要清楚你的客户是那类人群,你最终是想服务谁,是学生、家长、工人、男人、女人,还是服务企业、或是老板,你要弄清楚谁才是你的目标受众,一旦你初步确定了客户群体,你就可以根据他们的生活经历、性格和职业筛选出最精准备的客户,你最好把精准客户定为某个有明显特征。
3、定位痛点:发现客户的问题
清楚你的客户是谁后,你要想办法了解他们有什么痛点,你必须研究你的客户,发现他们的需求,为他们提供解决问题的方法或产品。
了解你客户痛点其实有很多办法,在这里,我分享一些我挖掘客户需求方程式,这个方程式包括4个简单的问题,详细如下:
3.1、你今年的目标是什么?
3.2、你认为今年有什么东西能让你的成功指数翻倍?
3.3、生活中或职场上最让你失望的事是什么?
3.4、为了改善现况,你做了什么?哪些方法奏效了,哪些方法是无效?
对于上面的这些问题的回答有帮助我了解客户的目标、需求、痛点、爱好等。总的来说,你越了解客户最迫切的问题,就越对对症下药,找到有针对性的方法,还可以通过以下几个方法去了解你客户的痛点:
3.5、上百度知道,去找你客户一般是在上面问的问题,并且找出你客户的100个问题来,加以分析解决,做完这些你基本上你就能够形成清晰思路,知道目标客户的痛点在那里?
3.6、通过百度指数,去分析你客户的关注焦点,以及一些相关的问题,我以美容为例,给你展现一下百度指数的相关分析功能:
3.6.1、需求分布:将你客户的需求由强到弱进行一个分析。

3.6.2、同时关心的问题分布:这个是说明你的客户在关心了这个问题后,还关心的一些问题,这样你可以从多个角度去分析你的客户,让你对客户有一个更全面的了解。

3.6.3、客户地哉分布:让你清楚你最精准的客户是在那里。

3.6.4、人群属性:通过这个可以分析到你客户的年龄及性别。

3.7、用淘宝指数,你还可以更加清楚的分析你客户的属性,包含星座、喜爱度、消费层级等等,让你对客户有一个更加清楚的认知。
4、定位渠道:你客户所出现的地方,你就要采取相应的行动来吸引他们,让他们来关注你;
5、定位运营:你需要采取客户能接受并且喜欢的方式,来传播你的价值,更好的方式是能让你的受众也一起参与到你的运营中来,让客户也有一份参与感,这样他就更喜欢去传播。
二、打造你的产品:打造好你的产品帮助你的客户解决问题。
你已思考过适合自已的领域、了解精准客户的需求,并且通过工具进行详细分析,找到了客户的痛点,现在你可以着手打造你的产品或项目。你的产品可以是实物也可以是虚拟,你擅长什么就做什么,但是一定是能给客户带来价值的产品。
三、自媒体传播工具:通过不同的自媒体工具,让你吸引到更多的受众。
既然你已经想好了分享并且吸引精准受众的产品,接下来就应该建立自媒体账户渠道,宣传自已的经验与心得。
随着互联网的快速发展,现在网络已经改变了我们的生活、学习、工作的方式,我们需要在受众最多的地方,通过免费分享有价值的内容与产品,在为受众带去附加价值的同时和他们搞好关系,这就是自媒体的第一步:给客户分享附加价值。
我所使用的自媒体工具有很多种,有微信公众号、微博、百度百家专栏、搜狐自媒体、QQ空间、优酷自频道、喜马拉雅与力荔音频平台等。
我觉得每一种自媒体工具都各有优点,比如百度专栏、搜狐自媒体我所发布的文章有很高的权重,很快就能够被各大搜索引擎收录,这样当别人搜索相关关键词时,我所写的文章一般都会排在前面,这样可以吸引到更多的受众。微信公众号可以让我与客户间,有一个更加深层的沟通与交流。
如果你有精力的话我建议是所有的自媒体工具,你都要合理的利用起来,因为这个可以加大你与受众之间的连接点,扩大你的影响力。就像是中国特种部兵一样,什么武器都有,这样什么情况下都能够面对。
四、免费分享:通过各大自媒体渠道去免费分享你的有价值的内容吸引客户。
你需要在各大自媒体渠道免费分享优质、有价值的文章、录音、视频,同时你需在在发布的时候,在发布的标题、文章中加入你的品牌关键词,和目前受众有关的关键词,当你的受众在搜索引擎搜索相关关键词时,你所发布的内容就在会结果中展现在前面,并且吸引到你的客户。
有的人可能会觉得在网上发布免费有价值的信息,这样会“泄露了太多含金量很多的信息“,或者“没有留下可以教给别人的东本”。当你心里这样想的时候,说明你还没有懂得如何去包装价值,怎么做生意。
你在免费分享信息的时候,我并不是建议你无偿分享所有的内容,而是建议你无偿分享最好的内容。我经常告诉别人,要“展现最好的作品”,因为现在是一个信息大爆炸的时代,每个人的注意力都是非常有限的,你往往只有一次机会证明自我价值,因为你错过了这次机会,可能永远的就失去了这个客户。
五、吸引粉丝:通过各种方法去吸引你的精准粉丝。
吸引粉丝可以分为了简单的2个步骤:
5.1、我吸引粉丝;
5.2、粉丝吸引粉比;
当开通一个自媒体渠道后,大部份人吸引受众都是在自已的微信私人号或是QQ上的好友,但是这些用户是非常有限。
第二步,让你的公众号粉丝帮你分享文章,只要你写的文章足够吸引人,足够有价值,你的粉丝是会愿意帮助你分享的。然后不断重复第一步、第二步,你的粉丝就会慢慢滚雪球式的增长。这里要强调的是你必须是坚持有价值的好内容。
六、文案策划:教你将文案写出去,就能把钱收回来。
许多自媒体新手写文章的时候,总是把文章写的很散,自已想表达的意思很多,读者看上进心来去是言之无货,对于这样的新手,只需学习以下方法及可:
6.1、一个好的标题是成功的一半,所以你的标题必须要足够的吸引人;
6.2、文章的开头非常重要,必须上来就要吸引眼球,需要做到分析痛苦,描绘好处;
6.3、文章需要有一个框架逻辑结构,同时还要懂得文章排版中的留白处理,如果你的文章上来就是密密麻烦的十几段,别人一眼看上去会觉得晕乎乎的,立马将你的文章关掉走人。
6.4、你要让越来越多的人阅读与转发你的文章,文章的转发量越大,就说明你的文章越受欢迎,这里有二招,第一招是暗示用户转发,第二招是吸引用户转发。
七、倍增你的名气:找到你快速广大自媒体的方法。
你的名气越大,你的粉丝就会越多,那如何能让我更有名呢?现在的明星为什么有名,除了自身的价值外还有一个共同点,就是有大量的报道,经常出现在各大媒体上。
自媒体也不例外,你想自已更有名,那就要别人不断的去采访你。你可以找其它自媒体来采访你,当然你也可以采访别人,这样采访的人越多你的名气就会越大,慢慢的,你就会吸引到报纸、电视台的注意,他们也会采访你,当然你也可以通过一些公关方法来让传统媒体采访你。
你还可以采取相互推荐的方式,这种也是很有效,这里需要注意一点的是,你尽量找比你能量大的媒体来推荐你,还要是那种媒体自身价值与人气不错的,这点特别重要。
我需要提醒你注意的是,这一点排在第六步是有原因的,除非你已经完成了前面五步,否则请不要贸然寻找推广的合作伙伴,因为当你自身能力不够强大时,别人帮助推广你反倒是对你致命的打击。
八、与众不同:你应该做到独一无二,这样别人选择你的机会会更大。
自媒体的首要精髓就是与众不同—你应该是独一无二的。如果你总是留心做到这一点,为你的客户提供独特的附加价值和信息,你就能获得别人的特别关注。无论是在生活中,还是在自媒体行业中,千篇一律或盲目模仿都不会得到青睐。你越是与众不同,越能把自已的独特性呈现给喜欢你的人,你的影响力就会越来越大。
九、精益求精:快速测试、持续迭代、不断优化。
当你做了自媒体后,你必须快速的去测试,持续迭代,不断优化,让你的自媒体变更比同行更加精益求精,你只有这样了才能更加持久的在行业中脱颖而出。
十、如何盈利
做自媒体一定要想好盈利模式,因为没有盈利你是做不长。如何盈利呢?
盈利无外乎二种模式,一种是虚拟的比如服务业、培训、咨询等,另外一种是实体的,不同的自媒体可以有不同的盈利模式。
只要你能够在某个自媒体行业做出名气,把自已打造成明星,吸引足够多的用户,盈利不是什么大的问题,现在用户会为有个性和有价价值的个人买音,因为大家现在注重的是你给他所带来的结果,所以现在打造自媒体相对还是比较容易的,有想法的人可以马上动手进行测试。