Java笔记类与容器

子类可以在自己的构造方法中使用super调用基类的构造方法
1.使用this(argument_list)调用本类的另外的构造方法
2.如果调用super,必须写在子类的构造方法的第一行
3.如果子类的构造方法中没有显示的调用基类构造方法则系统默认调用基类无参数的构造方法
在类中,用static声明的成员变量为静态成员变量,他为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份
局部变量必须初始化才能使用,不然编译不能通过,但是成员变量可以不初始化,因为他有默认值
为了提高程序的清晰度,包含一个或多个抽象方法的类必须被声明为抽象的
	abstract class Person
	{
		public abstract String getDescription();
	}
抽象类还可以包含具体数据和具体方法
abstract class Person
{
	public Person(String n)
	{
		name=n;
	}
	public abstract String getDescription();
	
	public String getName()
	{
		return name;
	}
	private String name;
}
Java用于控制可见性的4个访问修饰符
  • 仅对本类可见 ----private
  • 对所有类可见 — public
  • 对本包和所有子类可见 —protected
  • 对本包可见 --默认,所谓默认是指没有标明任何修饰符的情况,这是一种不太受欢迎的形式
Equals方法:如果两个对象具有相同的引用,他们一定是相等的
Object超类对象的几个方法:
  • Class getClass():返回包含对象信息的类对象
  • boolean equals():比较两个对象是否相等如果两个对象指向同一块存储区域,方法返回true,否则方法慧慧false
  • String toString():返回描述该对象值的字符串
  • Object Clone():创建对象的一个副本
有时,需要将int这样的基本类型转换成对象,所有的基本类型都有一个与之对应的类。例如:Integer类对应的基本类型int.通常,这些类称为包装器。这些对象包装器类拥有很鲜明的名字:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean对象包装器是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时对象包装器类还是fianl.因此不能定义他们的子类.假设想定义一个整形数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成ArrayList.这里就用到了Integer对象包装器类。我们可以声明一个Integer对象的数组列表
通过list.add(3);自动的变换成list.add(new Integer(3));这种变换被称为自动打包。相反地,当将一个Integer对象赋给一个int值时,将会自动地拆包,也就是说,编译器将下列语句:int n = list.get(i);翻译成 int n = list.get(i).intValue();
比较两个枚举类型的值时,永远不需要调用equals。而直接使用“==”就可以了
对象构造
重载
1.定义:如果多个方法,有相同的名字、不同的参数,便产生了重载
2.注意:如果类中提供了至少一个构造器,但是没有提供默认的构造器,则在构造对象时如果没有提供构造参数就会被视为不合法。
java.util.Random l.0
1.Random()构造一个新的随机数生成器
包的作用域
1.标记为public 的部分可以被任意的类使用
2.标记为private的部分只能被定义他们的类使用
3.如果没有指定public或private,这个部分可以被同一个包中的所有方法访问
类设计技巧
1.一定要将数据设计为私有
2.一定要对数据初始化
3.不要在类中使用过多的基本数据类型
4.不是所有的域都需要独立的域访问器和域更改器
5.使用标准格式进行类的定义
抽象类:包含一个或多个抽象方法的类本身必须声明为抽象的,同时抽象类还可以包含具体数据和具体方法
abstract class Person
{
	public abstract String getDescription();
}
Equals方法:Object类中的equals方法用于检测一个对象是否等于另外一个对象。
示例:
public static void main(String[] args){
		String s = "OK";
		StringBuilder sb = new StringBuilder(s);
		System.out.println(s.hashCode()+","+sb.hashCode());
		String t = new String("OK");
		StringBuilder tb = new StringBuilder(t);
		System.out.println(t.hashCode()+","+tb.hashCode());
	}

	可以看到,字符串s与t拥有相同的散列码,这是因为字符串的散列码是由内容导出的,而字符串缓冲sb与tb却有着不同的散列码,这是因为在StringBuffer类中没有定义hashCode方法,他的散列码是由Object类的默认hashCode方法导出的对象存储地址
ArrayList
ArrayList使用了数组作为底层的存储空间,然后对外提供的list这种借口
LinkedList
LinkedList以链表作为底层存储元素

List接口与接口实现类

  • ArrayList

    • 内部是通过数组实现的,允许对元素进行快速随机访问。
    • 当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。
    • 适合随机查找和遍历,不适合插入和删除。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。
  • LinkedList

    • LinkedList 是用链表结构存储数据的。
    • 很适合数据的动态插入和删除,随机访问和遍历速度比较慢。
    • 有List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
  • Vector(线程安全)

    • 通过数组实现的。
    • 默认情况下 Vector 每次扩容时容量都会翻倍。
    • 支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢 。

Set接口与接口实现类

  • 哈希表存放的是哈希值。
  • HashSet这个类实现了Set集合,实际为一个HashMap的实例。
  • HashSet 存储元素的顺序并不是按照存入时的顺序。而是按照哈希值来存的所以取数据也是按照哈希值取得。

Map接口与接口实现类

  • LinkedHashMap

    • 迭代顺序可以是插入顺序。
    • Key和Value都允许空,Key重复会覆盖、Value允许重复。
    • LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历。
    • LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
  • HashMap

    • HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。
    • HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。
    • HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。
    • 如果需要满足线程安全,可以用 Collections 的synchronizedMap 方法使
      HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。

ArrayList、LinkedList和Vector的区别

  • ArrayList: 可以看作是能够自动增长容量的数组。
  • ArrayList底层的实现是Array, 数组扩容实现。
  • ArrayList根据下标查询快,但是根据值查数据速度和LinkList一样。
  • ArrayList线程不安全,效率高。
  • LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能。
  • LinkList线程不安全,效率高。
  • Vector底层数据结构是数组,查询快,增删慢。
  • Vector线程安全,效率低。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值