杂记java

来源:互联网 发布:dnf端口辅助 编辑:程序博客网 时间:2024/06/15 09:35

1、输出Map集合的键值

        HashMap<String, String> map = new HashMap(){            {                put("", "");                put("", "");            }        };

方法1:

        // 先获取Map集合中键的集合        Set<String> keySet = map.keySet();        // 有了Set集合就可以获取迭代器        Iterator<String> it = keySet.iterator();        while (it.hasNext()) {            String key = it.next();            String value = map.get(key);            System.out.print("key:" + key + "value:" + value);        }

方法2:

        // 将Map集合中的映射关系取出,存到Set集合中        Set<Map.Entry<String, String>> entrySet = map.entrySet();        Iterator<Map.Entry<String, String>> it = entrySet.iterator();        while (it.hasNext()) {            Map.Entry<String, String> me = it.next();            String key = me.getKey();            String value = me.getValue();            System.out.print("key:" + key + "value:" + value);        }

方法二比方法一执行效率快。

2、多态

假设你要设计一个通用框架,这个框架会涉及到数据库的操作,但是你不能限定用户用哪个数据库,这个时候你就可以用到多态。
你可以设计一个接口:DataBaseDao
然后,每个不同的数据库,你可以编写接口的实现类,比如:SQLServerDao, MySqlDao, DB2Dao等等

当用户使用你框架的时候,他就可以用多态,实现自己的数据库连接功能:
DaoBaseDao dao = new SQLServerDao(); //针对SQLServer的接口实现,这里dao就是多态
dao.connect();
可以增强代码的健壮性,只管按照父类的设计进行操作,不管具体是什么样的子类,将来这个子类用着不舒服了,换一个就行,不影响原来的代码,这样代码维护起来就更加容易
举个例子吧

class Car{
void run(){

}
}

class BMW extends Car{}
class Benz extends Car{}

实现的时候

Car car = new BMW();
car.run();

将来你开着觉得难受,直接将new BMW()换成 new Benz()就可以了,完全不影响别的代码。

多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
多态的前提
继承,实现,重写
多态的好处
大大提高程序的扩展性
多态的弊端
父类的引用可以访问父类中成员,对于只存在于子类中的方法和属性它就望尘莫及了

Car car = new BMW(); // 类型提升,向上转型
// 想要调用BMW特有方法,强制将父类的引用转成子类类型
BMW bmw = (BMW) car; //向下转型

多态自始至终都是子类做着变化
在多态中成员函数的特点
在编译时期,参阅引用型变量所属的类中是否有调用的方法。
在运行时期,参阅对象所属的类中是否有调用的方法。
在多态中静态成员函数的特点
无论编译还是运行,都参考左边
在多态中成员变量的特点
无论编译还是运行,都参考左边

3、API和接口

interface是开发接口,别人通过这个接口实现你的功能函数来达到你要展示的功能。你提供的接口好比一个标准,别人必须要实现。
API一般是指功能函数,比如查询JAVA的API,就是已经实现了的功能,提供给用户就行了。

4、标示接口

标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
例如java.io.Serializablejava就是这样一个接口,他只是告诉jvm,继承于这个接口的CLASS需要序列化处理。

5、ArrayList和LinkedList区别

1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3、对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

6、ArrayList和Vector区别

1、Vector是线程安全的,ArrayList不是线程安全的。
2、ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。

Vector和ArrayList一样,都继承自List
都是数组来实现的

Vector 只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。
当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用ArrayList,需要做处理)。

7、HashMap和HashTable区别

1、由于HashMap非线程安全,在只有一个线程访问的情况下,效率要高于HashTable
——HashMap可以通过下面的语句进行同步:

Collections.synchronizeMap(hashMap);

——直接使用JDK 5 之后的 ConcurrentHashMap,如果使用Java 5或以上的话,请使用ConcurrentHashMap。

2、HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3、HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。
4、Hashtable和HashMap扩容的方法不一样,HashTable中hash数组默认大小11,扩容方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数,增加为原来的2倍,没有加1。

原创粉丝点击